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