跑马灯进阶——交通灯

[复制链接]
2882|0
 楼主| 面对你 发表于 2008-11-5 12:05 | 显示全部楼层 |阅读模式
硬件平台:单片机:华邦系列W78E516B40DL<br />晶振:12MHZ&nbsp;&nbsp;8个二极管&nbsp;&nbsp;&nbsp;四个数码管&nbsp;&nbsp;&nbsp;四个按键&nbsp;&nbsp;&nbsp;一个温度传感器<br />&nbsp;&nbsp;串口通信:MAX232&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />软件平台:Keil&nbsp;uVision2<br />开发语言:C语言<br />程序下载软件:8051IspWriter.exe<br />源代码:<br />//由于硬件受限制!不能完全模拟交通灯,因开发板当初只装了红灯和黄灯,故用红等灯表示停,黄灯表示行!<br />//东西方向用2个灯(D3,D4),南北方向用2个灯(D5,D6)!<br />//此项目只有2种情况,东西方向黄灯(红),南北方向红灯(黄)!初始化时间为30s!<br />//初始化,东西行(黄),南北停(红)!<br />#include&ltreg51.h&gt<br />#include&ltabsacc.h&gt<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />#define&nbsp;uint&nbsp;unsigned&nbsp;int<br />uchar&nbsp;&nbsp;*dis_ptr;<br />uchar&nbsp;data&nbsp;dis_buf[2]={3,0};//显示缓冲区<br />uchar&nbsp;data&nbsp;time_buf=0x1e;//显示数据<br />uchar&nbsp;code&nbsp;seg_tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xf8,0x80,0x90,0xff};//7段共阴极,依次为0-9<br />uchar&nbsp;code&nbsp;digit_tab[2]={1,2};//动态显示缓冲区<br />uchar&nbsp;code&nbsp;light_buf[2]={0x06,0x09};<br />uint&nbsp;m=0;<br />uint&nbsp;n=1;<br />uint&nbsp;a=0;<br />uint&nbsp;key_flag=0;<br />uchar&nbsp;b=0x1e;<br />sbit&nbsp;p24=P2^4;<br />sbit&nbsp;p25=P2^5;<br />bit&nbsp;key_test(void);<br />void&nbsp;key_delay(void);<br />void&nbsp;key(void);<br />void&nbsp;init_sys();<br />void&nbsp;disply_one(void);<br />void&nbsp;dis_buf_flash(void);<br />void&nbsp;main()<br />{init_sys();<br />for(;;);}<br /><br />void&nbsp;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&nbsp;disply_one(void)//动态显示1位<br />{uchar&nbsp;i;<br />P0=seg_tab[*dis_ptr];<br />i=dis_ptr-dis_buf;<br />P2=~digit_tab;<br />if&nbsp;(dis_ptr&gtdis_buf)<br />&nbsp;&nbsp;&nbsp;&nbsp;dis_ptr--;<br />else&nbsp;dis_ptr=dis_buf+1;<br />}<br /><br /><br />void&nbsp;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&nbsp;time0(void)&nbsp;interrupt&nbsp;1&nbsp;<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis_buf_flash();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disply_one();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1=~light_buf[n];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TF0=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m++;a++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(key_test()==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{key_flag=0;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((a&gt=40)&&(key_flag==0))//10ms扫描键盘<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{a=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key_test();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(key_test()==1){key_delay();//去抖动<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(key_test()==1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{key();}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(m&gt=4000)//1秒处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;m=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_buf-=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(time_buf&lt=0)//循环显示<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{time_buf=b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1=~(light_buf[n]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(n&gt0){n--;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;n=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;}<br /><br /><br />bit&nbsp;key_test(void)//读键盘<br />{if((p24==0)||(p25==0))<br />&nbsp;return&nbsp;((bit)1);//有键按下<br />else&nbsp;return((bit)0);<br />}<br /><br />void&nbsp;key_delay(void)<br />{uchar&nbsp;i,s;<br />for(i=10000,s=5;s&gt=1;i--)<br />{s=i;}<br />}<br /><br />void&nbsp;key(void)<br />{key_flag=1;//停止扫描,使每次按键只执行一次<br />if(time_buf&gt=0x64)<br />&nbsp;&nbsp;&nbsp;&nbsp;{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&nbsp;data&nbsp;time_buf=0x1e<br />改成uint&nbsp;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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(n&gt0){n--;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;n=1;<br />即可!<br /><br />大家给点意见,看还有什么错误!<br />呵呵<br />!<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部