硬件平台:单片机:华邦系列W78E516B40DL<br />晶振:12MHZ 8个二极管 四个数码管 四个按键 一个温度传感器<br /> 串口通信:MAX232 <br />软件平台:Keil uVision2<br />开发语言:C语言<br />程序下载软件:8051IspWriter.exe<br />源代码:<br />//由于硬件受限制!不能完全模拟交通灯,因开发板当初只装了红灯和黄灯,故用红等灯表示停,黄灯表示行!<br />//东西方向用2个灯(D3,D4),南北方向用2个灯(D5,D6)!<br />//此项目只有2种情况,东西方向黄灯(红),南北方向红灯(黄)!初始化时间为30s!<br />//初始化,东西行(黄),南北停(红)!<br />#include<reg51.h><br />#include<absacc.h><br />#define uchar unsigned char<br />#define uint unsigned int<br />uchar *dis_ptr;<br />uchar data dis_buf[2]={3,0};//显示缓冲区<br />uchar data time_buf=0x1e;//显示数据<br />uchar code seg_tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,<br /> 0xf8,0x80,0x90,0xff};//7段共阴极,依次为0-9<br />uchar code digit_tab[2]={1,2};//动态显示缓冲区<br />uchar code light_buf[2]={0x06,0x09};<br />uint m=0;<br />uint n=1;<br />uint a=0;<br />uint key_flag=0;<br />uchar b=0x1e;<br />sbit p24=P2^4;<br />sbit p25=P2^5;<br />bit key_test(void);<br />void key_delay(void);<br />void key(void);<br />void init_sys();<br />void disply_one(void);<br />void dis_buf_flash(void);<br />void main()<br />{init_sys();<br />for(;;);}<br /><br />void init_sys(void)//T0工作于方式2,定时250um,<br />{<br />dis_ptr=dis_buf+1;<br />TH0=6;<br />TL0=6;<br />TMOD=2;<br />IE=0x82;<br />IP=2;<br />TR0=1;<br /><br />}<br /><br />void disply_one(void)//动态显示1位<br />{uchar i;<br />P0=seg_tab[*dis_ptr];<br />i=dis_ptr-dis_buf;<br />P2=~digit_tab;<br />if (dis_ptr>dis_buf)<br /> dis_ptr--;<br />else dis_ptr=dis_buf+1;<br />}<br /><br /><br />void dis_buf_flash(void)//显示数据送缓冲区<br />{<br />dis_buf[0]=time_buf/10;<br />dis_buf[1]=time_buf%10;<br /><br />}<br /><br /><br />void time0(void) interrupt 1 <br />{ <br /> dis_buf_flash();<br /> disply_one();<br /> P1=~light_buf[n];<br /> TF0=0;<br /> m++;a++;<br /> if(key_test()==0)<br /> {key_flag=0;}<br /> <br /> if ((a>=40)&&(key_flag==0))//10ms扫描键盘<br /> {a=0;<br /> key_test();<br /> if(key_test()==1){key_delay();//去抖动<br /> if(key_test()==1)<br /> {key();}<br /> }<br /> }<br /> if (m>=4000)//1秒处理<br /> { m=0;<br /> time_buf-=1;<br /> if (time_buf<=0)//循环显示<br /> {time_buf=b;<br /> P1=~(light_buf[n]);<br /> if(n>0){n--;}<br /> else n=1;<br /> }<br /> <br /> }<br /> }<br /><br /><br />bit key_test(void)//读键盘<br />{if((p24==0)||(p25==0))<br /> return ((bit)1);//有键按下<br />else return((bit)0);<br />}<br /><br />void key_delay(void)<br />{uchar i,s;<br />for(i=10000,s=5;s>=1;i--)<br />{s=i;}<br />}<br /><br />void key(void)<br />{key_flag=1;//停止扫描,使每次按键只执行一次<br />if(time_buf>=0x64)<br /> {time_buf=0x00;}<br />if(p24==0){time_buf+=1;}<br />if(p25==0){time_buf-=1;}<br />b=time_buf;<br />}<br /><br />程序调试遇到的问题:<br />将uchar data time_buf=0x1e<br />改成uint time_buf=30<br />就卡在30不走了!<br />灯总要30S后才亮<br />灯显示程序放在30S处理中了<br />所以要等30S!<br />在前面加一句显示语句!P1=~light_buf[n];<br />灯不跳!<br />原来是语句P1=~(light_buf[~(n)]);有问题,原来数字常量不能这样用!<br />将之改为P1=~(light_buf[n]);<br /> if(n>0){n--;}<br /> else n=1;<br />即可!<br /><br />大家给点意见,看还有什么错误!<br />呵呵<br />!<br /> |
|