第八届蓝桥杯单片机题目解答

第一部分

1.经过查阅单片机手册可知定时器0有4种模式,模式0:16位自动重装载模式,模式1:16位不可自动重装载模式,模式2:8位自动重装载模式,模式3不可屏蔽中断16位自动重装载,实时操作系统用节拍定时器。

当晶振为12Mhz时定时器最大为2的16次为65536us,

2.使用运放虚短续断来判断,Ui1这条路的电流可得0.1/10k等于0.00001A,Ui2路的电流为0.2/10k等于0.00002A,经过80k电阻的电流为0.00003A,电压为2.4v,由于运放正极为0电压所以输出为负,输出为-2.4V;

2.1频率为固定时选用带通滤波器,直流电源的滤波电路选用低通滤波器,低通滤波器是低于等于可以通过,高通滤波器是高于等于可以通过,带通滤波器是在范围内可以通过,带阻滤波器是在范围外可以通过。

2.2可用OC门或三态门(ST门)来实现,用OC门实现线与,应同时在输出端口应加一个上拉电阻。

2.3用卡诺图可以化简B非 = C

2.4外部中断0的优先级最大其次定时器0然后外部中断1然后定时器1、串口中断

2.5P0当做外部存储器时是双向8位数据口和低8位地址输出口的复用

2.6第三行是消影的,第四行是位选,第五行是段选。

2.7data是直接寻址的片内存储器,bdata是访问位寻址的片内存储器,xdata是访问外部数据存储器,idata是访问间接寻址的内部RAM

2.8:A错位复位一般为高电平

第二部分

依旧是我们的状态机的思维,有两种状态每个状态通过两个按键去加减,相同时间后触发led闪,很简单,代码如下:

extern unsigned char hour;//时
extern unsigned char min;//分
extern unsigned char sec;//秒
extern uchar ledliang;
uchar clock_hour,clock_min,clock_sec;
uchar num=0;
uint temp=0;
uchar S7 = 1,S6=0;
extern uchar change=0;//记住全局变量要赋初值否则未知值会出现逻辑问题
extern uchar biaozhiwei;
void temp_display()
{
	temp = read_ds1802(0);

	smg_display(0,18,0);
	smg_display(1,18,0);
	smg_display(2,18,0);
	smg_display(3,18,0);
	smg_display(4,18,0);
	smg_display(5,temp/10,0);
	smg_display(6,temp%10,0);
	smg_display(7,12,0);
	smg_display(8,12,0);
}

void time_display(void)
{

		Read_DS1302_Time();
		smg_display(6,sec/16,0);
		smg_display(7,sec%16,0);
		smg_display(5,17,0);
		smg_display(3,min/16,0);
		smg_display(4,min%16,0);
		smg_display(2,17,0);
		smg_display(0,hour/16,0);
		smg_display(1,hour%16,0);
		while(P33==0)
		{
			
			temp_display();
		}
		if(num==6)
		{
			S6 = 1;
			S7 = 0;
//			clock_hour = hour;
//			clock_min = min;
//			clock_sec = sec;

		}
		while(clock_hour == hour && clock_min == min && clock_sec == sec)
		{
			uchar i;uchar a;
			for(i=0;i<7;i++)
			{
				smg_display(i,18,0);
			}
			
			
			a = key_huoqu();
			ET1 = 1;
			if(ledliang)P00 = 0;
			else P00 = 1;
			hc573(4);
			if(a==4||a==5||a==6||a==7)
			{
				P0 = 0xff;
				hc573(4);
				break;
			}
		}

}
void S7_cufa(void)
{
	if(S7 == 1)
	{
		
		//在进入调整时间模式时将,时分秒换为十进制的,BCD码转十进制
		if(change == 1)
		{
			
			if(biaozhiwei)
			{
				smg_display(1,hour%16,0);
				smg_display(0,hour/16,0);
			}
			else
			{
				smg_display(1,18,0);
				smg_display(0,18,0);
			}
			
		}
		else
		{
			smg_display(1,hour%16,0);
			smg_display(0,hour/16,0);
		}
		if(change == 2)
		{
			if(biaozhiwei)
			{
				smg_display(3,min/16,0);
				smg_display(4,min%16,0);
			}
			else
			{
				smg_display(3,18,0);
				smg_display(4,18,0);
			}
		}
		else
		{
			smg_display(3,min/16,0);
			smg_display(4,min%16,0);
		}
		if(change == 3)
		{
			if(biaozhiwei)
			{
				smg_display(7,sec%16,0);
				smg_display(6,sec/16,0);
			}
			else
			{
				smg_display(6,18,0);
				smg_display(7,18,0);
			}
		}
		else
		{
			smg_display(6,sec/16,0);
			smg_display(7,sec%16,0);
		}
		if(change == 0)
		{
			
			time_display();
			
		}
		if(num==7)
		{
			change++;if(change == 4)
			{
				change = 0;//0-2
				Set_DS1302_Time();
			}
		}
		if(num == 4&&change!=0)//减
		{
			min = (min / 16) * 10 + min%16;//BCD码转十进制
			sec = (sec / 16) * 10 + sec%16;//BCD码转十进制
			hour = (hour / 16) * 10 + hour%16;//BCD码转十进制
			if(change==1)hour--;
			if(change==2)min--;
			if(change==3)sec--;
			//if(hour>9||min>9||sec>9)hour=0;
			
			if(hour>=60)hour=23;
			if(min>=60)min=59;
			if(sec>=60)sec=59;
			
			min = (min / 10)*16 + min % 10;//十进制转BCD码
			sec = (sec / 10)*16 + sec % 10;//十进制转BCD码
			hour = (hour / 10)*16 + hour % 10;//十进制转BCD码
		}
		if(num == 5&&change!=0)//+
		{
			min = (min / 16) * 10 + min%16;//BCD码转十进制
			sec = (sec / 16) * 10 + sec%16;//BCD码转十进制
			hour = (hour / 16) * 10 + hour%16;//BCD码转十进制
			if(change==1)hour++;
			if(change==2)min++;
			if(change==3)sec++;
			if(sec==60)
			{
				sec=0;
				min++;
			}
			if(min==60)
			{
				min=0;
				hour++;
			}
			if(hour==24)hour=0;
			
			min = (min / 10)*16 + min % 10;//十进制转BCD码
			sec = (sec / 10)*16 + sec % 10;//十进制转BCD码
			hour = (hour / 10)*16 + hour % 10;//十进制转BCD码
		}
			
	}
}

void S6_cufa(void)
{
	if(S6 == 1)
	{
		//在进入调整时间模式时将,时分秒换为十进制的,BCD码转十进制
		if(change == 1)
		{
			
			if(biaozhiwei)
			{
				smg_display(1,clock_hour%16,0);
				smg_display(0,clock_hour/16,0);
			}
			else
			{
				smg_display(1,18,0);
				smg_display(0,18,0);
			}
			
		}
		else if(change !=0)
		{
			smg_display(1,clock_hour%16,0);
			smg_display(0,clock_hour/16,0);
		}
		if(change == 2)
		{
			if(biaozhiwei)
			{
				smg_display(3,clock_min/16,0);
				smg_display(4,clock_min%16,0);
			}
			else
			{
				smg_display(3,18,0);
				smg_display(4,18,0);
			}
		}
		else if(change !=0)
		{
			smg_display(3,clock_min/16,0);
			smg_display(4,clock_min%16,0);
		}
		if(change == 3)
		{
			if(biaozhiwei)
			{
				smg_display(7,clock_sec%16,0);
				smg_display(6,clock_sec/16,0);
			}
			else
			{
				smg_display(6,18,0);
				smg_display(7,18,0);
			}
		}
		else if(change !=0)
		{
			smg_display(6,clock_sec/16,0);
			smg_display(7,clock_sec%16,0);
		}
		if(change == 0)
		{
			
			time_display();
			
		}
		if(num==6)
		{
			uchar i = 0;
			change++;
			if(change == 4)
			{
				change = 0;//0-2
				
				
				//Set_DS1302_Time();
			}
		}
		if(num == 4&&change!=0)//减
		{
			clock_min = (clock_min / 16) * 10 + clock_min%16;//BCD码转十进制
			clock_sec = (clock_sec / 16) * 10 + clock_sec%16;//BCD码转十进制
			clock_hour = (clock_hour / 16) * 10 + clock_hour%16;//BCD码转十进制
			if(change==1)clock_hour--;
			if(change==2)clock_min--;
			if(change==3)clock_sec--;
			//if(hour>9||min>9||sec>9)hour=0;
			
			if(clock_hour>=60)clock_hour=23;
			if(clock_min>=60)clock_min=59;
			if(clock_sec>=60)clock_sec=59;
			
			clock_min = (clock_min / 10)*16 + clock_min % 10;//十进制转BCD码
			clock_sec = (clock_sec / 10)*16 + clock_sec % 10;//十进制转BCD码
			clock_hour = (clock_hour / 10)*16 + clock_hour % 10;//十进制转BCD码
		}
		if(num == 5&&change!=0)//+
		{
			clock_min = (clock_min / 16) * 10 + clock_min%16;//BCD码转十进制
			clock_sec = (clock_sec / 16) * 10 + clock_sec%16;//BCD码转十进制
			clock_hour = (clock_hour / 16) * 10 + clock_hour%16;//BCD码转十进制
			if(change==1)clock_hour++;
			if(change==2)clock_min++;
			if(change==3)clock_sec++;
			if(clock_sec==60)
			{
				clock_sec=0;
				clock_min++;
			}
			if(clock_min==60)
			{
				clock_min=0;
				clock_hour++;
			}
			if(clock_hour==24)clock_hour=0;
			
			clock_min = (clock_min / 10)*16 + clock_min % 10;//十进制转BCD码
			clock_sec = (clock_sec / 10)*16 + clock_sec % 10;//十进制转BCD码
			clock_hour = (clock_hour / 10)*16 + clock_hour % 10;//十进制转BCD码
		}
//		clock_hour = hour;
//		clock_min = min;
//		clock_sec = sec;
		if(num==7)
		{
			S6 = 0;
			S7 = 1;
			
		}
			
	}
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值