【蓝桥杯单片机的备赛旅行日记系列】之国赛决赛第五届多功能事件记录器

目录


1.注意事项
2.部分代码展示
3.完整代码下载


1.注意事项
  这是目前为止做到的最难的一套了,三个驱动都用上了,而且还增加了串口通信,最无奈的是光敏电阻和Rb2同时用上了。

  ADC读取的时候读的是上一个值,也就是说,你以为你读的是Rb2,其实是光敏电阻,网上说的有两种解决方法

(1).每个值读两次,我是采用这种方法的,
(2).二者的地址反着取,

但是两种方法都会有问题,目前还没有找到完美解决方法,找到了我会放上来,大家注意一下就好了。

  
  

2.部分代码展示
主函数:
void main()
{
	uchar last_sec,k,m,index;
	bit light_start=0;
	uchar temp,shidu,light;
	uchar hour,min,sec;
	uchar stay_hour,stay_min,stay_sec;
	uint stay_time;
	AllInit();
	rd_temperature();
	Delay750ms();
	set_time(23,59,55);
	light_InitVal=read_adc(0x01)-20;
	Delay20ms();
	Timer0Init();
	UartInit();
	while(1)
	{
		//获取温、湿、亮度
		temp=rd_temperature();
		
		EA=0;
		shidu=read_adc(0x03)*0.389 ;
		EA=1;
		Delay20ms();
		EA=0;
		shidu=read_adc(0x03)*0.389 ;
		EA=1;
		Delay20ms();
		
		EA=0;
		sec=Read_Ds1302_Byte(0x81);
		min=Read_Ds1302_Byte(0x83);
		hour=Read_Ds1302_Byte(0x85);
		EA=1;
		Delay20ms();
		
		EA=0;
		light=read_adc(0x01);
		EA=1;
		Delay20ms();
		EA=0;
		light=read_adc(0x01);
		EA=1;
		Delay20ms();
		
		if(light < light_InitVal)
		{
			close=1;
			light_start=1;
			if(stay_flag==0)
			{
				stay_sec=sec;
				stay_min=min;
				stay_hour=hour;
				stay_flag=1;
			}
		}
		else 
		{
			close=0;
		}
		if(close==0 && stay_flag==1)
		{
			stay_flag=0;
			stay_time=( (hour-stay_hour)*3600+(min-stay_min)*60+(sec-stay_sec) );
			rom_dat[0]=temp;rom_dat[1]=shidu;rom_dat[2]=hour;
			rom_dat[3]=min;rom_dat[4]=sec;rom_dat[5]=stay_time;
			for(k=0;k<6;k++)
			{
				write_rom(k+addr,rom_dat[k]);
				Delay20ms();
			}
			addr+=6;
			if(addr==30)addr=0;
		}
		if(light_start==0)stay_time=0;
		//按键单元
		if(key_flag)
		{
			key_flag=0;
			BTN();
			if(Trg & 0x08)//s4
			{
				mode=~mode;
			}
			if(Trg & 0x04)//s5
			{
				menu_index++;
				if(menu_index==4)menu_index=1;
			}
		}
		//发送数据
		if(send_en)
		{
			if(mode==0)
			{
				if(last_sec!=sec)
				{
					last_sec=sec;
					send_buf[0]='{';send_buf[1]=temp/10+'0';send_buf[2]=temp%10+'0';send_buf[3]='-';
					send_buf[4]=shidu/10+'0';send_buf[5]=shidu%10+'0';send_buf[6]='%';send_buf[7]='}';
					send_buf[8]='{';send_buf[9]=hour/10+'0';send_buf[10]=hour%10+'0';send_buf[11]='-';
					send_buf[12]=min/10+'0';send_buf[13]=min%10+'0';send_buf[14]='-';
					send_buf[15]=sec/10+'0';send_buf[16]=sec%10+'0';send_buf[17]='}';
					send_buf[18]='{';send_buf[20]='}';
					if(close)send_buf[19]='1';
					else send_buf[19]='0';
					send_buf[21]='\r';send_buf[22]='\n';
					for(k=0;k<23;k++)SendData(send_buf[k]);
				}
			}else if(mode==1)
			{
				send_en=0;
				for(m=0;m<5;m++)
				{
					for(k=0;k<6;k++)
					{
						rom_dat[k]=read_rom(k+m*6);
					}
					send_buf[0]='{';send_buf[1]=rom_dat[0]/10+'0';send_buf[2]=rom_dat[0]%10+'0';send_buf[3]='-';
					send_buf[4]=rom_dat[1]/10+'0';send_buf[5]=rom_dat[1]%10+'0';send_buf[6]='%';send_buf[7]='}';
					send_buf[8]='{';send_buf[9]=rom_dat[2]/10+'0';send_buf[10]=rom_dat[2]%10+'0';send_buf[11]='-';
					send_buf[12]=rom_dat[3]/10+'0';send_buf[13]=rom_dat[3]%10+'0';send_buf[14]='-';
					send_buf[15]=rom_dat[4]/10+'0';send_buf[16]=rom_dat[4]%10+'0';send_buf[17]='}';
					send_buf[18]='{';
					if(rom_dat[5]<10)
					{
						send_buf[19]=rom_dat[5]+'0';send_buf[20]='}';
						send_buf[21]='\r';send_buf[22]='\n';
						for(index=0;index<23;index++)SendData(send_buf[index]);
					}else 
					{
						send_buf[19]=rom_dat[5]/10+'0';
						send_buf[20]=rom_dat[5]%10+'0';
						send_buf[21]='}';
						send_buf[22]='\r';send_buf[23]='\n';
						for(index=0;index<24;index++)SendData(send_buf[index]);
					}
				}
			}
		}
		//数码管单元
		if(menu_index==1)
		{
			menu1[0]=tab[temp/10];
			menu1[1]=tab[temp%10];
			menu1[2]=0xc6;
			menu1[3]=0xff;menu1[4]=0xff;
			menu1[5]=tab[shidu/10];
			menu1[6]=tab[shidu%10];
			menu1[7]=0x89;
		}else if(menu_index==2)
		{
			menu2[0]=tab[hour/10];
			menu2[1]=tab[hour%10];
			menu2[3]=tab[min/10];
			menu2[4]=tab[min%10];
			menu2[6]=tab[sec/10];
			menu2[7]=tab[sec%10];
			if(sec%2==0){menu2[2]=0xff;menu2[5]=0xff;}
			else {menu2[2]=0xbf;menu2[5]=0xbf;}
		}else if(menu_index==3)
		{
			menu3[0]=0xff;menu3[1]=0xff;
			menu3[2]=0xff;menu3[3]=0xbf;
			menu3[4]=tab[stay_time/1000];
			menu3[5]=tab[stay_time%1000/100];
			menu3[6]=tab[stay_time%100/10];
			menu3[7]=tab[stay_time%10];
		}
		//LED
		if(mode==0 && close==0)
		{
			P0=~0x01;
			P2=0x80;P0=~0x01;P2=0;
		}else if(mode==0 && close==1)
		{
			P0=~0x05;
			P2=0x80;P0=~0x05;P2=0;
		}else if(mode==1 && close==0)
		{
			P0=~0x02;
			P2=0x80;P0=~0x02;P2=0;
		}else if(mode==1 && close==1)
		{
			P0=~0x06;
			P2=0x80;P0=~0x06;P2=0;
		}
	}
}

我是采用初始光敏电阻模拟值-20来作为是否遮光的起始值,因为官方也没给明确的值,而且如果不-20的话变化就很敏感了。

  
  

3.完整代码下载
  

  【点击这里】下载。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章