四个干道的初始值可变
单片机源程序如下:
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ON 0
- #define OFF 1
- sbit Z_G=P1^2; // 主干道绿灯
- sbit Z_Y=P1^3; // 主干道黄灯
- sbit Z_R=P1^4; // 主干道红灯
- sbit F_G=P1^5; // 支干道绿灯
- sbit F_Y=P1^6; // 支干道黄灯
- sbit F_R=P1^7; // 支干道红灯
- sbit wei_Z1=P2^0; // 主干道数码管位控制
- sbit wei_Z2=P2^1; // 主干道数码管位控制
- sbit wei_F1=P2^2; // 支干道数码管位控制
- sbit wei_F2=P2^3; // 支干道数码管为控制
- sbit key1=P1^0; //开关位定义
- sbit key2=P1^1;
- sbit buzzer=P3^7; //蜂鸣器定义
- uchar count; //定时器中断计数值
- /********* 倒计时赋初值 *************/
- int T_Z_G=60,T_F_G=30,T_F_R=60,T_Z_R=30,T_Y=3;//T_Z_G主干道的绿灯初始值为60,T_F_G支干道的绿灯为30,T_Y黄灯都为3
- //T_F_R为支干道的红灯值60,T_Z_R为主干道的红灯值30
- void init(void)
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
-
- /****************** 延时 **********************/
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /******************seg 控制 *******************/
- unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 共阴极数码管赋值
- void display1(uchar num1,uchar num2) //控制支干道数码管倒计时显示
- {
- P3=table[num1];
- wei_F1=ON;
- delay(1);
- wei_F1=OFF;
- P3=table[num2];
- wei_F2=ON;
- delay(1);
- wei_F2=OFF;
- if(key1==0)//主干道紧急制动
- {
- delay(2);
- if(key1==0)
- {
- while(1)
- {
- P0=0x00;
- P3=0x00;
- F_G=OFF;
- F_Y=OFF;
- F_R=ON;
-
- Z_G=OFF;
- Z_Y=OFF;
- Z_R=ON;
- buzzer=~buzzer;//蜂鸣器叫
- if(key2==0)
- {
- delay(2);
- if(key2==0)
- {
- F_R=OFF;
- Z_R=OFF;
- buzzer=OFF;
- break;
- }
- }
-
- }
- }
-
- }
- }
- void display2(uchar num3,uchar num4) //控制主干道数码管倒计时显示
- {
- P0=table[num3];
- wei_Z1=ON;
- delay(1);
- wei_Z1=OFF;
- P0=table[num4];
- wei_Z2=ON;
- delay(1);
- wei_Z2=OFF;
-
- if(key1==0)//主干道紧急制动
- {
- delay(2);
- if(key1==0)
- {
- while(1)
- {
- P0=0x00;
- P3=0x00;
- F_G=OFF;
- F_Y=OFF;
- F_R=ON;
-
- Z_G=OFF;
- Z_Y=OFF;
- Z_R=ON;
- buzzer=~buzzer;//蜂鸣器叫
- if(key2==0)
- {
- delay(2);
- if(key2==0)
- {
- F_R=OFF;
- Z_R=OFF;
- buzzer=OFF;
- break;
- }
- }
-
- }
- }
-
- }
- }
- void main()
- {
- int i;
- buzzer=OFF;//关闭蜂鸣器
- //初始状态支干道主干道禁止通行
- Z_R=ON; //主干道红灯打开
- F_R=ON; //支干道红灯打开
-
- for(i=0;i<210;i++) //延时
- {
- delay(10);
- }
- Z_R=OFF;// 主干道红灯关闭
- F_R=OFF;// 支干道红灯关闭
- init(); // 初始化计时器
- while(1)
- {
- /**************** 状态 1:支干道红灯 (30s), 主干道绿灯 (60s)************/
- /**************** 状态 2:支干道红灯 (30s), 主干道黄灯 (3s) ************/
- while(T_Z_G >= 0)
- {
- display1(T_F_R/10,T_F_R%10);// 支干道红灯 (60s)
- display2(T_Z_G/10,T_Z_G%10);// 主干道绿灯 (60s)
- Z_G=ON; // 主干道的绿灯打开
- F_R=ON; // 支干道的红灯打开
- }
- T_Y=3;// 重新赋值黄灯
- while(T_Y >= 0)
- {
- display1(T_Y/10,T_Y%10);// 支干道黄灯(3s)
- display2(T_Y/10,T_Y%10);// 主干道黄灯(3s)
- F_R=OFF; // 支干道的红灯关闭
- F_Y=ON; // 支干道的黄灯打开
- Z_G=OFF; // 主干道的绿灯关闭
- Z_Y=ON; // 主干道的黄灯打开
- }
- F_R=OFF; // 支干道的红灯关闭
- Z_G=OFF; // 主干道的绿灯关闭
- Z_Y=OFF; // 主干道的黄灯关闭
- F_Y=OFF; // 支干道的黄灯关闭
- T_F_G=30,T_F_R=60,T_Z_R=30;// 重新赋值
- /**************** 状态 3:支干道绿灯 (30s), 主干道红灯 (30s)**************/
- /*************** 状态 4:支干道黄灯 (3s) , 主干道红灯 (30s)***************/
- //init(); // 初始化计时器
- while(T_F_G >= 0)
- {
- display1(T_F_G/10,T_F_G%10);// 支干道绿灯 (30s)
- display2(T_Z_R/10,T_Z_R%10);// 主干道红灯 (30s)
- Z_R=ON;// 主干道的红灯打开
- F_G=ON;// 支干道的绿灯打开
- }
- T_Y=3;// 重新赋值黄灯
- while(T_Y >= 0)
- {
- display1(T_Y/10,T_Y%10);// 支干道黄灯 (3s)
- display2(T_Y/10,T_Y%10);// 主干道黄灯 (3s)
- F_G=OFF; // 支干道的绿灯关闭
- F_Y=ON; // 支干道的黄灯打开
- Z_R=OFF; // 主干道的红灯关闭
- Z_Y=ON; // 主干道的黄灯打开
- }
- Z_R=OFF; // 主干道的红灯关闭
- Z_Y=OFF; // 主干道的黄灯关闭
- F_G=OFF; // 支干道的绿灯关闭
- F_Y=OFF; // 支干道的黄灯关闭
- T_Z_G=60,T_F_G=30,T_F_R=60,T_Z_R=30,T_Y=3;// 重新赋值
- }
- }
- //定时器中断函数
- void timer1(void) interrupt 1
- {
- //重装初值 0.05s
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- count++;
- if(count==20) //20次为1s 20*0.05=1
- {
- T_Z_G--;
- T_F_G--;
- T_F_R--;
- T_Z_R--;
- T_Y--;
- count=0;
- }
- }
复制代码
下载:
C51交通灯.rar
(72.37 KB, 下载次数: 6)
|