單片機——定時器控制交通指示燈 任務要求: 1:東西方向的綠燈亮40S,之后黃燈開始閃爍,黃燈亮的時間為4S,綠燈變紅燈: 2:南北方向的綠燈亮40S,之后黃燈開始閃爍,黃燈亮的時間為4S,綠燈變紅燈,如此往復。 3:實現時間倒計時顯示。 程序: #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int Sbit RED_A=P3^0; //東西方向紅燈 Sbit YELLOW_A=P3^0; //東西方向黃燈 Sbit GREEN_A=P3^0; //東西方向綠燈 Sbit RED_B=P3^0; //南北方向紅燈 Sbit YELLOW_B=P3^0; //南北方向黃燈 Sbit GREEN_B=P3^0; //南北方向綠燈 //共陽極數碼管斷碼表 Int code DSY_CODE[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XFF}; Int code scan_bits[]={0x02,0x01}; Int code scan_bits1[]={0x08,0x04}; Int data disp_buff[]={0,0}; Int data disp_buff1[]={0,0}; Int data disp_buff2[]={0,0}; Int data disp_buff3[]={0,0}; Int time_count=0; Int flash_count=0; Int operation_type=0; Int m1=40,m2=4;m3=40,m4=4; Int num; //延時函數: Void delay(uint z) { Int i,j; For(i=z;i<0;i--); For(j=0;j<110;j++); } //數據顯示函數: Void show_display(int k) Int i,j; Int n,m; //分解計數值: disp_buff[0]=M1/10; disp_buff[1]=M1%10; If (disp_buff[0]==0) { disp_buff[0]=10; } disp_buff1[0]=M2/10; disp_buff1[1]=M2%10; If (disp_buff1[0]==0) { disp_buff1[0]=10; } disp_buff2[0]=M3/10; disp_buff2[1]=M3%10; If (disp_buff2[0]==0) { disp_buff2[0]=10; } Disp_buff3[0]=m4/10; Disp_buff3[1]=m4%10; If (disp_buff3[0]==0) { disp_buff3[0]=10; } For(i=0;i<2;i++) { P0=oxff; P2= scan_bits; P0=dsy_code[disp_buff]; Delay(1); } For(j=0;j<2;j++) { P0=oxff; P2= scan_bits[j]; P0=dsy_code[disp_buff1[j]]; Delay(1); } For(n=0;n<2;n++) { P1=oxff; P2= scan_bits1[n]; P1=dsy_code[disp_buff2[n]]; Delay(1); } For(m=0;m<2;m++) { P1=oxff; P2= scan_bits1[m]; P1=dsy_codedisp_buff3[m]]; Delay(1); } //T0中斷函數子程序: Void to_isr() interrupt 1 { TH1=-50000/256; TL1=-50000%256; Switch(operation_type) { Case 1://東西方向綠燈亮40S南北方向紅燈亮40S RED_A=0; YELLOW_A=0;GREEN_A=1; RED_B=1; YELLOW_B=0;GREEN_B=0; If(++Time_count !=800) return; Time_count=0; operation_type=2; Break; Case 2://東西方向黃燈開始閃爍,綠燈關閉 If(++Time_count !=80) return; Time_count=0; Yellow_A=!yellow_A; GREEN_A=0; If(++flash_count !=4) return; flash_count=0; operation_type=3; Break; Case 3://南北方向綠燈亮40S東西方向紅燈亮40S RED_A=1; YELLOW_A=0;GREEN_A=0; RED_B=0; YELLOW_B01;GREEN_B=1; If(++Time_count !=800) return; Time_count=0; operation_type=4; Break; Case 4: //南北方向黃燈開始閃爍,綠燈關閉 If(++Time_count !=80) return; Time_count=0; Yellow_B=!yellow_B; GREEN_B=0; If(++flash_count !=4) return; flash_count=0; operation_type=1; void T0_time() interrupt 0 // 定時器0的中斷號
{
TH0 = (65536-50000)/256; //裝初值,50ms申請一次中斷
TL0 = (65536-50000)%256;
num++; If(num==800) ( Num=0; m1--; If(m1==0) M1=40; } num++; If(num==80) ( Num=0; M2--; If(m2==0) m2=4; } Num++ If(num==800) ( Num=0; M3--; If(m3==0) M3=40; } num++; If(num==80) ( Num=0; M4--; If(m4==0) M4=4; } Void main() { Tmod=0x01; TH0 = (65536-50000)/256; //裝初值,50ms申請一次中斷
TL0 = (65536-50000)%256; TH1=-50000/256; TL1=-50000%256; EA = 1; //開總中斷
ET0 = 1; //開定時器0中斷
TR0 = 1; ET1= 1; //開定時器0中斷
TR1 = 1; While(1) { Delay(1); show_display(); } }
|