一、简述 本项目为典型的LED显示和中断定时电路。利用定时器T0产生每10ms一次的中断,每100次中断为1s。对两个方向分别显示红、绿、黄灯,已经相应的剩余时间即可。值得注意的是,需要意识到,A方向红灯时间=B方向绿灯时间+黄灯缓冲时间这一常识。本项目使用的MAX7219芯片使用方法请参考题目3。 二、设计任务和要求 设计一个十字路口交通灯控制器。用单片机控制LED灯模拟指示。模拟东西方向的十字路口交通信号控制情况。东西向通行时间为80s,南北向通行时间为60s,缓冲时间为3s。 求代码,急用,谢谢各位大佬!!!! #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit RED_A=P0^0; //???? sbit YELLOW_A=P0^1; sbit GREEN_A=P0^2; sbit RED_B=P1^0; //???? sbit YELLOW_B=P1^1; sbit GREEN_B=P1^2; sbit DIN=P3^0; sbit LOAD=P3^1; sbit CLK=P3^2; uchar Flash_Count=0,Operation_Type=1,Time_Count=0,hh=1,i=80,mm=1,tt=9;
void DelayMS(uint x) { uchar i; while(x--) for(i=0;i<120;i++); }
void Traffic_Light() { switch(Operation_Type) { case 1: RED_A=1;YELLOW_A=1;GREEN_A=0; RED_B=0;YELLOW_B=1;GREEN_B=1; DelayMS(2000); Operation_Type=2; break; case 2: DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) return; Flash_Count=0; Operation_Type=3; break; case 3: RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type=4; break; case 4: DelayMS(300); YELLOW_B=~YELLOW_B;GREEN_B=1; if(++Flash_Count!=10) return; Flash_Count=0; Operation_Type=1; } } void Write(uchar Addr,uchar Dat) { uchar i; LOAD=0; for(i=0;i<8;i++) { CLK=0;Addr<<=1;DIN=CY; CLK=1;_nop_(); CLK=0; } for(i=0;i<8;i++) { CLK=0;Dat<<=1;DIN=CY; CLK=1;_nop_(); CLK=0; } LOAD=1; }
void Initialise() { Write(0x09,0x3f); Write(0x0a,0x07); Write(0x0b,0x01); Write(0x0c,0x01); }
void main() { Initialise(); TMOD=0x01; //定时器0工作在方式1 EA=1; ET0=1; TR0=1; while(1) { Traffic_Light(); } }
void T0_INT()interrupt 1 { TH0=-50000/256; TL0=-50000%256; if(tt--==0) { tt=9; if(hh--==0) { hh=1; Write(1,i/0x0a); Write(2,i%0x0a); if(i--==0) { if(mm==0) { mm=1; i=80; } else { mm=0; i=60; } } } } } 这是我写的代码,但是数码管不会动,不知道是什么原因,求教!!!! |