第十二届蓝桥杯单片机国赛真题

有问题欢迎大家指出,共同交流学习进步

#include <STC15F2K60S2.H>
#include "ds1302.h"
#include "intrins.h"
#include "iic.h"
#define TSMG 500
sbit TX = P1^0;
sbit RX = P1^1;
sbit h3 = P3^2;
sbit h4 = P3^3;
sbit s1 = P4^4;
sbit s2 = P4^2;
code unsigned char Seg_dot[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
code unsigned char Seg_Table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
code unsigned char read_addre[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
code unsigned char write_addre[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
code unsigned char INIT_timer[] = {0x01,0x20,0x20,0x08,0x05,0x03,0x24};
unsigned char t_h = 0;
unsigned char t_m = 0;
unsigned char t_s = 0;
unsigned int distance = 0;
unsigned char UI = 0;//0-数据显示界面 1-参数显示界面
unsigned char UI_data = 0;//0-时间显示 1-距离显示 2-数据记录
unsigned char UI_param = 0;//0-采集时间参数 1-距离参数
unsigned char stat_value = 0;//0-最大值 1-最小值 2-平均值
unsigned char max_value = 0;
unsigned char min_value = 0;
float aver_value = 0;
unsigned char timer_param = 2;
unsigned char dis_param = 20;
unsigned char dis_mode = 0;//0-触发模式 1-定时模式
unsigned char adc_value = 0;
unsigned char old_value = 0;
unsigned int aver_smg = 0;
unsigned char Sec = 0;
unsigned char stat_old = 0;
unsigned stat_Sec = 0;
unsigned char warn = 0;
unsigned char num = 0;
unsigned char stat_led = 0xff;
unsigned char count_200ms = 0;
unsigned char adc_value1 = 0;
void Delay20ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 1;
	j = 234;
	k = 113;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay12us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 33;
	while (--i);
}
unsigned char read_myadc()
{
	unsigned char adc_dat;
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x41);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	adc_dat = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	return adc_dat;
}
void set_mydac(unsigned char value)
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x41);
	I2CWaitAck();
	I2CSendByte(value);
	I2CWaitAck();
	I2CStop();
}
void send_Wave()
{
	unsigned char i;
	for(i = 0;i < 8;i++)
	{
		TX = 1;
		Delay12us();
		TX = 0;
		Delay12us();
	}
}
void measure_distan()
{
	unsigned int timer;
	CMOD = 0x00;
	CCON = 0x00;
	CL = CH = 0;
	send_Wave();
	CR = 1;
	while((RX == 1) && (CF == 0));
	CR = 0;
	if(CF == 0)
	{
		timer = (CH << 8) | CL;
		distance = timer * 0.0172;
	}
	else
	{
		CF = 0;
		distance = 999;
	}
}
void Init_mytimer()
{
	unsigned char i;
	Write_Ds1302_Byte(0x8e,0x00);
	for(i == 0;i < 7;i++)
	{
		Write_Ds1302_Byte(write_addre[i],INIT_timer[i]);
	}
	Write_Ds1302_Byte(0x8e,0x80);
}
void read_mytimer()
{
	t_h = Read_Ds1302_Byte(0x85);
	t_m = Read_Ds1302_Byte(0x83);
	t_s = Read_Ds1302_Byte(0x81);
}
void SelectHC573(unsigned char channel,unsigned char dat)
{
	P2 = (P2 & 0x1f) | 0x00;
	P0 = dat;
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
		case 0:
			P2 = (P2 & 0x1f) | 0x00;
		break;
	}
	P2 = (P2 & 0x1f) | 0x00;
}
void DelaySMG(unsigned int t)
{
	while(t--);
}
void DisplaySMG_Bit(unsigned char pos,unsigned char value)
{
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,value);
	DelaySMG(TSMG);
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,0xff);
}
void DisplaySMG_All(unsigned char value)
{
	SelectHC573(6,0xff);
	SelectHC573(7,value);
}
void DisplaySMG_Info()
{
	if(UI == 0)
	{
		switch(UI_data)
		{
			case 0:
				DisplaySMG_Bit(0,Seg_Table[t_h >> 4]);
				DisplaySMG_Bit(1,Seg_Table[t_h & 0x0f]);
				DisplaySMG_Bit(2,0xbf);
				DisplaySMG_Bit(3,Seg_Table[t_m >> 4]);
				DisplaySMG_Bit(4,Seg_Table[t_m & 0x0f]);
				DisplaySMG_Bit(5,0xbf);
				DisplaySMG_Bit(6,Seg_Table[(t_s & 0x7f) >> 4]);
				DisplaySMG_Bit(7,Seg_Table[t_s & 0x0f]);
			break;
			case 1:
				DisplaySMG_Bit(0,0xc7);
				if(dis_mode == 0)
				{
					DisplaySMG_Bit(1,0xc6);
				}
				else if(dis_mode == 1)
				{
					DisplaySMG_Bit(1,0x8e);
				}
			    if(distance > 99)
				DisplaySMG_Bit(5,Seg_Table[distance / 100]);
				if(distance > 9) 
				DisplaySMG_Bit(6,Seg_Table[distance / 10 % 10]);
				DisplaySMG_Bit(7,Seg_Table[distance % 10]);
			break;
			case 2:
				DisplaySMG_Bit(0,0x89);
				switch(stat_value)
				{
					case 0:
						DisplaySMG_Bit(1,0xfe);
						if(max_value > 999)
						DisplaySMG_Bit(4,Seg_Table[max_value / 1000]);
						if(max_value > 99)
						DisplaySMG_Bit(5,Seg_Table[max_value / 100 % 10]);
						if(max_value > 9)
						DisplaySMG_Bit(6,Seg_Table[max_value / 10 % 10]);
						DisplaySMG_Bit(7,Seg_Table[max_value % 10]);
					break;
					case 1:
					    DisplaySMG_Bit(1,0xbf);
						if(aver_smg > 999)
						DisplaySMG_Bit(4,Seg_Table[aver_smg / 1000]);
						if(aver_smg > 99)
						DisplaySMG_Bit(5,Seg_Table[aver_smg / 100 % 10]);
						DisplaySMG_Bit(6,Seg_dot[aver_smg / 10 % 10]);
						DisplaySMG_Bit(7,Seg_Table[aver_smg % 10]);
					break;
					case 2:
						DisplaySMG_Bit(1,0xf7);
						if(min_value > 999)
						DisplaySMG_Bit(4,Seg_Table[min_value / 1000]);
						if(min_value > 99)
						DisplaySMG_Bit(5,Seg_Table[min_value / 100 % 10]);
						if(min_value > 9)
						DisplaySMG_Bit(6,Seg_Table[min_value / 10 % 10]);
						DisplaySMG_Bit(7,Seg_Table[min_value % 10]);
					break;
				}
			break;
		}
		
	}
	else
	{
		if(UI_param == 0)
		{
			DisplaySMG_Bit(0,0x8c);
			DisplaySMG_Bit(1,Seg_Table[1]);
			DisplaySMG_Bit(6,Seg_Table[timer_param / 10]);
			DisplaySMG_Bit(7,Seg_Table[timer_param % 10]);
		}
		else if(UI_param == 1)
		{
			DisplaySMG_Bit(0,0x8c);
			DisplaySMG_Bit(1,Seg_Table[2]);
			DisplaySMG_Bit(6,Seg_Table[dis_param / 10]);
			DisplaySMG_Bit(7,Seg_Table[dis_param % 10]);
		}
	}
}
void Scan_key()
{
	h3 = 0;
	h4 = s1 = s2 = 1;
	if(s1 == 0)//s5
	{
		Delay20ms();
		if(s1 == 0)
		{
			if(UI == 0)
			{
				if(UI_data == 0)
				{
					UI_data = 1;
				}
				else if(UI_data == 1)
				{
					stat_value = 0;
					UI_data = 2;
				}
				else if(UI_data == 2)
				{
					UI_data = 0;
				}
			}
			if(UI == 1)
			{
				if(UI_param == 0)
				{
					UI_param = 1;
				}
				else if(UI_param == 1)
				{
					UI_param = 0;
				}
			}
			while(s1 == 0);
		}
	}
	else if(s2 == 0)//s9
	{
		Delay20ms();
		if(s2 == 0)
		{
			if((UI == 1) && (UI_param == 0))
			{
				if(timer_param == 2)
				{
					timer_param = 3;
				}
				else if(timer_param == 3)
				{
					timer_param = 5;
				}
				else if(timer_param == 5)
				{
					timer_param = 7;
				}
				else if(timer_param == 7)
				{
					timer_param = 9;
				}
				else if(timer_param == 9)
				{
					timer_param = 2;
				}
			}
			if((UI == 1) && (UI_param == 1))
			{
				if(dis_param == 80)
				{
					dis_param = 10;
				}
				else
				{
					dis_param += 10;
				}
			}
			while(s2 == 0);
		}
	}
	
	h4 = 0;
	h3 = s1 = s2 = 1;
	if(s1 == 0)//s4
	{
		Delay20ms();
		if(s1 == 0)
		{
			if(UI == 0)
			{
				UI_param = 0;
				UI = 1;
			}
			else
			{
				UI_data = 0;
				UI = 0;
			}
			while(s1 == 0);
		}
	}
	else if(s2 == 0)//s8
	{
		Delay20ms();
		if(s2 == 0)
		{
			if((UI == 0) && (UI_data == 2))
			{
				if(stat_value == 0)
				{
					stat_value = 1;
				}
				else if(stat_value == 1)
				{
					stat_value = 2;
				}
				else if(stat_value == 2)
				{
					stat_value = 0;
				}
			}
			if((UI == 0) && (UI_data == 1))
			{
				if(dis_mode == 0)
				{
					dis_mode = 1;
				}
				else if(dis_mode == 1)
				{
					dis_mode = 0;
				}
			}
			while(s2 == 0);
		}
	}
}
void deal_distance()
{
	static unsigned char i = 0;
	if(dis_mode == 0)//触发模式
	{
		adc_value = read_myadc();
		if((old_value > 50) && (adc_value < 50))
		{
			measure_distan();
			if(stat_old == 0)
			{
				min_value = distance;
				stat_old = 1;
			}
			i++;
			aver_value = (aver_value * (i-1) + distance) / i;
		}
		old_value = adc_value;
	}
	else if(dis_mode == 1)//定时模式
	{
		Sec = (t_s / 16) * 10 + t_s % 16;
		
		if((Sec % timer_param) == 0)
		{
			if(stat_Sec != Sec)
			{
				stat_Sec = Sec;//防止多次测量
				measure_distan();
				if(stat_old == 0)
				{
					min_value = distance;
					stat_old = 1;
				}
				i++;
				aver_value = (aver_value * (i-1) + distance) / i;
				if(((dis_param + 5) >= distance)&& (distance >= (dis_param - 5)))
				{
					num++;
					if(num == 3)
					{
						num = 0;
						warn = 1;
					}
				}
				else
				{
					warn = 0;
				}
			}
		}			
	}
	if(distance > max_value)
	{
		max_value = distance;
	}
	if(distance < min_value)
	{
		min_value = distance;
	}
	aver_smg = aver_value * 10;
	if(i == 5)
	{
		i = 0;
	}
}
void led_control()
{
	if((UI == 0) && (UI_data == 0))
	{
		stat_led |= 0x04;
		stat_led &= 0xfe;
	}
	if((UI == 0) && (UI_data == 1))
	{
		stat_led |= 0x01;
		stat_led &= 0xfd;
	}
	if((UI == 0) && (UI_data == 2))
	{
		stat_led |= 0x02;
		stat_led &= 0xfb;
	}
	if(dis_mode == 0)
	{
		stat_led &= 0xf7;
	}
	else
	{
		stat_led |= 0x08;
	}
	if(warn == 1)
	{
		stat_led &= 0xef;
	}
	else
	{
		stat_led |= 0x10;
	}
	if(adc_value1 > 50)
	{
		stat_led &= 0xdf;
	}
	else
	{
		stat_led |= 0x20;
	}
	SelectHC573(4,stat_led);
}
void dac_output()
{
	unsigned char dac_value;
	if(distance < 10)
	{
		set_mydac(51);
	}
	else if(distance <= 80)
	{
		dac_value = (((4.0/70) * distance + (3.0 / 7)) / (5.0 / 255));
		set_mydac(dac_value);
	}
	else
	{
		set_mydac(255);
	}
}
void Timer0Init(void)		//10毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0xF0;		//设置定时初值
	TH0 = 0xD8;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA = 1;
}
void sevice_timer0() interrupt 1
{
	TL0 = 0xF0;		//设置定时初值
	TH0 = 0xD8;		//设置定时初值
	DisplaySMG_Info();
	read_mytimer();
	count_200ms++;
	if(count_200ms == 20)
	{
		count_200ms = 0;
		adc_value1 = read_myadc();
	}
}
void main()
{
	Timer0Init();
	Init_mytimer();
	DisplaySMG_All(0xff);
	SelectHC573(4,0xff);
	SelectHC573(5,0x00);
	while(1)
	{
		
		Scan_key();
		deal_distance();
		led_control();
		dac_output();
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/607633.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos7网络处理name or service not known

1、编辑->虚拟网络编辑器 2、查看本机的ip 3、 /etc/sysconfig/network-scripts/ 查看文件夹下面的 ifcfg-eth33 后面的33可能不一样 vi /etc/resolv.conf 编辑文件添加以下DNS nameserver 114.114.114.114 4、设置本机的网络 5、ping www.baidu.com 先重启…

linux调试

文章目录 1. 使用打印来调试1.1 重定向1.2 标准预定义宏1.3 日志代码 2. 内核异常2.1 内核打印2.1.1 打印级别2.1.2 跟踪异常2.1.3 动态打印2.1.4 RAM console 2.2 OOPS2.2.1 有源代码的情况2.2.2 没有源代码的情况 3 查看日志4 工具调试 1. 使用打印来调试 1.1 重定向 2>…

Django之创建Model以及后台管理

一&#xff0c;创建项目App python manage.py startapp App 二&#xff0c;在App.models.py中创建类&#xff0c;以下是示例 class UserModel(models.Model):uid models.AutoField(primary_keyTrue, auto_createdTrue)name models.CharField(max_length10, uniqueTrue, db…

【C++11新特性】lambda表达式和应用场景

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Jenkins--自动化构建和部署SpringBoot项目

一、实现目标 通过在Jenkins中创建流水线任务&#xff0c;编写流水线脚本以实现自动化构建和部署SpringBoot项目。流水线脚本主要实现以下几个步骤&#xff1a; Preparation&#xff1a;从gitee上拉取远程仓库的SpringBoot项目代码。Build&#xff1a;使用Maven对拉取的代码进…

【2024全国青少年信息素养大赛初赛时间以及模拟题】

2024全国青少年信息素养大赛时间已经出来了 目录 全国青少年信息素养大赛智能算法挑战赛初中模拟卷 全国青少年信息素养大赛智能算法挑战赛初中模拟卷 1、比赛时间和考试内容&#xff1a; 算法创意实践挑战赛初中组于5月19日举行&#xff0c;检录时间为10:30-11:00&#xf…

男士内裤什么材质的好?五款材质舒适的男士内裤品牌

男士内裤目前已经有非常多的选择&#xff0c;三角/平角、传统面料/功能面料、设计版型等等都五花八门&#xff0c;所以不少男性朋友在挑选内裤时都觉得选择过多&#xff0c;另人难以选择&#xff0c;同时还担心选到一些质量不好的内裤&#xff0c;舒适性不仅差而且对健康有影响…

C语言洛谷题目分享(11)回文质数

目录 1.前言 2.题目&#xff1a;回文质数 1.题目描述 2.输入格式 3.输出格式 4.输入输出样例 5.题解 3.小结 1.前言 哈喽大家好&#xff0c;今儿继续为大家分享一道蛮有价值的一道题&#xff0c;希望大家多多支持喔~ 2.题目&#xff1a;回文质数 1.题目描述 因为 151 …

ESP8266-01s刷入固件报SP8266 Chip efuse check error esp_check_mac_and_efuse

一、遇到的问题 使用ESP8266 固件烧录工具flash_download_tools_v3.6.8 烧录固件报错&#xff1a; 二、解决方法 使用espressif推出发基于python的底层烧写工具&#xff1a;esptool 安装方法&#xff1a;详见https://docs.espressif.com/projects/esptool/en/latest/esp32/ …

【Linux】进程间通信方式之管道

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误的话&#xff0c;还望指出&…

最新:Lodash 严重安全漏洞背后你不得不知道的 JavaScript 知识

可能有信息敏感的同学已经了解到&#xff1a;Lodash 库爆出严重安全漏洞&#xff0c;波及 400万 项目。这个漏洞使得 lodash “连夜”发版以解决潜在问题&#xff0c;并强烈建议开发者升级版本。 我们在忙着“看热闹”或者“”升级版本”的同时&#xff0c;静下心来想&#xf…

人工智能|推荐系统——工业界的推荐系统之冷启动

UGC的物品冷启有哪些 ⼩红书上⽤户新发布的笔记。 B站上⽤户新上传的视频。 今⽇头条上作者新发布的⽂章。 为什么要特殊对待新笔记&#xff1f; 新笔记缺少与⽤户的交互&#xff0c;导致推荐的难度⼤、效果差。 扶持新发布、低曝光的笔记&#xff0c;可以增强作者发布意愿…

在Ubuntu安装RPM文件

Ubuntu软件源包含数千个deb软件包&#xff0c;可以从Ubuntu软件中心或使用apt命令行安装。 Deb是所有基于Debian的Linux发行版&#xff0c;例如包括Ubuntu&#xff0c;Linux mint等发行版使用的安装包格式。 如果某些软件在Ubuntu软件源中不可用&#xff0c;可以通过启用适当的…

NOIP,CSP-J,CSP-S——函数

一、函数概念 /*函数返回类型 函数名(参数){语句 } */ int add(int x,int y){return x+y; } 调用这个函数add int main(){int x,y,z;scanf("%d%d",&x,&y);z=add(x,y);printf("%d",z); } 二、变量作用域 main函数的z只作用于第二个for语句…

Day3 | Java基础 | 4常见类

Day3 | Java基础 | 4 常见类 基础版Object类equalshashCode&#xff08;散列码&#xff09;hashCode和equals clone方法String类 问题回答版Object类Object类的常见方法有哪些&#xff1f;和equals()的区别是什么&#xff1f;为什么要有hashCode&#xff1f;hashCode和equals的…

【C++】适配器模式

文章目录 前言 1. 适配器的介绍2. 仿函数2.1 sort函数的模板参数2.2 priority_queue类的模板参数 3. priority_queue模拟实现3. stack & queue 模拟实现3.1 deque的介绍3.2 deque的优点与缺陷3.3 STL标准库中对于stack和queue的模拟实现 前言 C中的适配器是一种设计模式&am…

【强训笔记】day16

NO.1 代码实现&#xff1a; class StringFormat { public:string formatString(string A, int n, vector<char> arg, int m) {string ret;int j0;for(int i0;i<n;i){if(A[i]%){if(i1<n&&A[i1]s){retarg[j];i;}else {retA[i];}}else {retA[i];}}while(j&l…

wlan二层旁挂组网实验

实验拓扑图 代码&#xff1a; SW1 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysn sw1 [sw1]undo info-center enable Info: Information center is disabled. [sw1]vlan batch 10 20 30 Info: This operation may take a few seconds. …

基于Springboot的校园悬赏任务平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园悬赏任务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

12 华三的二层链路聚合

12 华三的二层链路聚合 配置思路 1. 配置二层静态聚合组 (1) 进入系统视图。 system-view (2) 创建二层聚合接口&#xff0c;并进入二层聚合接口视图。 interface bridge-aggregation interface-number [ lite ] 创建二层聚合接口后&#xff0c;系统将自动生成…
最新文章