1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
//将交通等分为东西向,南北向两组,前四个LED划为A组为东西向,后四个划为B组为南北向 #include <REG52.H> #define uchar unsigned char sbit wei0=P2^2;//定义数码管的位选使能端 sbit wei1=P2^3;//定义数码管的位选使能端 sbit key2=P2^1; //夜间模式按键 sbit key3=P2^0; sbit key4=P3^2; sbit key5=P3^3; sbit A_red=P1^0;//将A组二极管与端口绑定 sbit A_yellow=P1^1; sbit A_green_left=P1^2; sbit A_green_straight=P1^3; sbit B_red=P1^4 ;//将B组二极管与端口绑定 sbit B_yellow=P1^5; sbit B_green_left=P1^6; sbit B_green_straight=P1^7; int left_time= 5;//设置灯的时间 单位1s int straight_time= 5; int yellow_time= 5; int red_time,green_time ; int type =1; int i; int count=0; int number=0; //倒计时时间 uchar t=0; uchar time,wei; //定义东西数码管 //共阳数码管 0-9 uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void init() //初始化函数 { TMOD=0x01; //定时器在方式1下工作 TH0=(65536-46080)/256; //定时器0高8位赋初值 50ms 再装一次初值 TL0=(65536-46080)%256; //定时器0低8位赋初值 EA=1; ET0=1; //定时器0/计数器0 中断允许 EX0=1; //外部中断请求0 EX1=1; //外部中断请求1 IT0=1; //外部中断0采用边沿触发方式 IT1=1; //外部中断1采用边沿触发方式 PX0=0; //外部中断0低优先级 PX1=1; //外部中断1高优先级 TR0=1; //定时器开始工作 } void delay(uchar t) {//延时函数,t=1时延时1ms uchar i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++); } void display(uchar time){//数码管显示(只显示东西向的倒计时) wei1=0;wei0=1; P0=table[time/10]; delay(2); //延时 P0=0xff; //消除残影 delay(4); wei0=0;wei1=1; P0=table[time%10]; delay(2); P0=0xff; delay(4); } void night(){//夜间模式 key4进key2出 delay(10); while(1){ P1=0x00; delay(1000); A_yellow=!A_yellow; B_yellow=!B_yellow; delay(1000); if(key2==0) break; } } void emergency(){//紧急模式 key5进key2出 delay(10); while(1){ P1=0x11; if(key2==0) break; } } void set_straight(){//设置直行绿灯时间 key2进key2出 while(1){ display(straight_time); if(key3==0) { delay(10); while(key3==0); //每按一次key3直行绿灯时间加1s; straight_time++; display(straight_time); delay(10); } if(key2==0){delay(10);break;} } } void set_left(){//设置左转绿灯时间 key3进key3出 while(1){ display(left_time); if(key2==0){ delay(10); while(key2==0) ; left_time++; display(left_time); delay(10); } if(key3==0){delay(10);break;} } } void main(){ red_time=straight_time+left_time+yellow_time ; init(); while(1) { P1=0x00;//初态全灭 while(key2==0){delay(10);set_straight();break; } while(key3==0){delay(10);set_left();break; } switch(type){ case 1: //东西向直行绿灯亮,南北向红灯亮 A_green_straight=1; B_red=1; display(straight_time+left_time-number); if(count!=straight_time) break; count=0; number=0;type=2; break; case 2://东西向直行绿灯灭、左转绿灯亮,南北向红仍灯亮 A_green_straight=0; A_green_left=1; B_red=1; display(left_time-number); if(count!=left_time) break; count=0; number=0;type=3; break; case 3://东西向黄灯闪烁,南北向红仍灯亮 B_red=1; A_green_left=0; delay(500); A_yellow=!A_yellow; delay(500); if(count!=yellow_time) break; count=0;number=0; type=4; break; case 4://南北向直行绿灯亮,东西向红灯亮 B_red=0;B_green_straight=1; A_red=1; A_yellow=0; display(red_time-number); if(count!=straight_time) break; count=0; number=0;type=5; break; case 5://南北向直行绿灯灭、左转绿灯亮,东西向红灯仍亮 B_green_straight=0; B_green_left=1; A_red=1; display(left_time+yellow_time-number); if(count!=left_time) break; count=0;number=0; type=6; break; case 6://南北向黄灯闪烁、东西向红灯仍亮 A_red=1; for(i=0;i<15;i++){ display(yellow_time-number); } B_green_left=0; delay(500); B_yellow=!B_yellow; delay(500); if(count!=yellow_time) break; P1=0x00;count=0;number=0; type=1; break; } } } void time0() interrupt 1//定时器0 { EA=0; t++; if(t==20){ number++; //用于倒计时 count++; //用于控制交通灯 t=0; } TH0=(65536-46080)/256; //定时器0高8位赋初值 50ms 再装一次初值 TL0=(65536-46080)%256; //定时器0低8位赋初值 EA=1; } void night0() interrupt 0//夜间模式(外部中断0) { night(); } void emergency1() interrupt 2//紧急模式(外部中断1) { emergency(); } |