99网
您的当前位置:首页单片机8051交通灯实例

单片机8051交通灯实例

来源:99网
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

#include 45 XH=0; #define uc unsigned char 46 NR=0; #define ui unsigned int 47 BR=0; uc 48 }

shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,049 if((j>24)&&(j<30))//到了25秒 xf8,0x80,0x90}; 50 { sbit DL=P1^0; 51 NL=0; sbit DH=P1^1; 52 BL=0; //南北绿灯灭 sbit DR=P1^2; 53 if(h<=10) sbit NL=P1^3; 54 { sbit NH=P1^4; 55 NH=1; //南北黄灯闪 sbit NR=P1^5; 56 BH=1; sbit XL=P3^0; 57 } sbit XH=P3^1; 58 if(h>10) sbit XR=P3^2; 59 { sbit BR=P3^3; 60 NH=0; //南北黄灯闪 sbit BH=P1^7; 61 BH=0; sbit BL=P1^6; 62 } unsigned char h,j;//定义60秒和外延时变量 63 } sbit by=P2^0; if(j>30) sbit be=P2^1; 65 { sbit ny=P2^2; 66 NH=0; //南北黄灯灭 sbit ne=P2^3; 67 BH=0; sbit dy=P2^4; 68 NR=1;//南北红灯亮 sbit de=P2^5; 69 BR=1; sbit xy=P2^6; 70 if(j<55) sbit xe=P2^7; 71 { uc a=30,b=5,c=25;//a为红灯 b为黄灯 c为72 DL=1;//东西绿灯亮

73 XL=1; 绿灯

void delay(ui x) 74 } { 75 DR=0; ui i,r; 76 XR=0; for(i=x;i>0;i--) 77 } for(r=125;r>0;r--); 78 if((j>54)&&(j<60)) } 79 { void deng() 80 DL=0;//东西绿灯灭 { 81 XL=0; if(j<25) 82 if(h<=10) { 83 { DR=1; 84 DH=1;//东西黄灯闪

85 XH=1; XR=1; //东西红灯亮

NL=1; 86 }

87 if(h>10) BL=1; //南北绿灯亮

DH=0; 88 {

DH=0;//东西黄灯闪 90 XH=0; 91 } 92 } 93 }

94 void xianshi() 95 {

96 P0=0xff; 97 P2=0x00; 98 if(j<31) 99 {

100 P0=shu[a/10];//动数码管显示101 de=1; 102 delay(4); 103 P0=0xff; 104 P2=0x00;

105 P0=shu[a%10]; 106 de=0; 107 dy=1; 108 delay(4); 109 P0=0xff; 110 P2=0x00;

111 P0=shu[a/10];//西数码管显示112 dy=0; 113 xe=1; 114 delay(4); 115 P0=0xff; 116 P2=0x00;

117 P0=shu[a%10]; 118 xe=0; 119 xy=1; 120 delay(4); 121 xy=0; 122 if(j<26) 123 {

124 P0=0xff; 125 P2=0x00;

126 P0=shu[c/10];//南数码管显示 127 ne=1; 128 delay(4); 129 P0=0xff; 130 P2=0x00;

131 P0=shu[c%10]; 132

ne=0;

133 ny=1; 134 delay(4); 135 P0=0xff; 136 P2=0x00;

137 P0=shu[c/10];//北数码管显示 138 ny=0; 139 be=1; 140 delay(4); 141 P0=0xff; 142 P2=0x00;

143 P0=shu[c%10]; 144 be=0; 145 by=1; 146 delay(4); 147 by=0; 148 } 149 }

150 if((j>25)&&(j<31))//到了25秒 151 {

152 P0=0xff; 153 P2=0x00;

154 P0=shu[b/10];//南数码管黄显示 155 ne=1; 156 delay(4); 157 P0=0xff; 158 P2=0x00;

159 P0=shu[b%10]; 160 ne=0; 161 ny=1; 162 delay(4); 163 P0=0xff; 1 P2=0x00;

165 P0=shu[b/10];//北数码管黄显示 166 ny=0; 167 be=1; 168 delay(4); 169 P0=0xff; 170 P2=0x00;

171 P0=shu[b%10]; 172 be=0; 173 by=1; 174 delay(4); 175 by=0; 176

}

177 if(j>30) 178 {

179 P0=0xff; 180 P2=0x00;

181 P0=shu[a/10];//南数码管黄显示 182 ne=1; 183 delay(4); 184 P0=0xff; 185 P2=0x00;

186 P0=shu[a%10]; 187 ne=0; 188 ny=1; 1 delay(4); 190 P0=0xff; 191 P2=0x00;

192 P0=shu[a/10];//北数码管黄显示 193 ny=0; 194 be=1; 195 delay(4); 196 P0=0xff; 197 P2=0x00;

198 P0=shu[a%10]; 199 be=0; 200 by=1; 201 delay(4); 202 by=0; 203 if(j<55) 204 {

205 P0=0xff; 206 P2=0x00;

207 P0=shu[c/10];//动数码管绿灯显示208 de=1; 209 delay(4); 210 P0=0xff; 211 P2=0x00;

212 P0=shu[c%10]; 213 de=0; 214 dy=1; 215 delay(4); 216 P0=0xff; 217 P2=0x00;

218 P0=shu[c/10];//西数码管绿灯显示219 dy=0; 220

xe=1;

221 delay(4); 222 P0=0xff; 223 P2=0x00;

224 P0=shu[c%10]; 225 xe=0; 226 xy=1; 227 delay(4); 228 xy=0; 229 } 230 }

231 if((j>54)&&(j<60)) 232 {

233 P0=0xff; 234 P2=0x00;

235 P0=shu[b/10];//动数码管黄灯显示 236 de=1; 237 delay(4); 238 P0=0xff; 239 P2=0x00;

240 P0=shu[b%10]; 241 de=0; 242 dy=1; 243 delay(4); 244 P0=0xff; 245 P2=0x00;

246 P0=shu[b/10];//西数码管黄灯显示 247 dy=0; 248 xe=1; 249 delay(4); 250 P0=0xff; 251 P2=0x00;

252 P0=shu[b%10]; 253 xe=0; 254 xy=1; 255 delay(4); 256 xy=0; 257 } 258 }

259 void main() 260 {

261 TMOD=0x01;//t0工作在方式1 262 EA=1;//开总的中断 263 ET0=1;//开T0的中断

2

TH0=0x3C;//定时中断50毫秒

265 TL0=0xB0; 266 TR0=1; 267 P1=0; 268 P3=0; 269 while(1) 270 {

271 deng(); 272 xianshi(); 273 } 274 }

275 void time0() interrupt 1 276 {

277 h=h+1;//计中断的次数 278 TH0=0x3C; 279 TL0=0xB0;

280 if(h==20)//延时到了1秒 281 {

282 j=j+1;//60秒的变量加一 283 if(j>59)//判断是否到了60秒284 j=0;//重新清零 285 h=0;//重新清零 286 if(a==0) 287

a=30;

288 if((j<31)||(j>30))//判断秒数是否小于31、是2 否大于30;小于31秒则说明东西红灯亮,290 大于30秒则说明南北红灯亮 291 a=a-1;

292 if(b==0)//判断是否到零 293 b=5;//重新置数

294 if((j>25)&&(j<31))//判断是否大于25至小于295 31秒

296 b=b-1;//南北黄灯的显示 297 if(c==0) 298 c=25; 299 if(j<56) 300 {

301 if((j<26)||(j>30)) 302 c=c-1; 303 }

304 if(b==0) 305 b=5;

306 if((j>54)&&(j<60)) 307 b=b-1; 308 309 310

311 312

313

314

315 }

因篇幅问题不能全部显示,请点此查看更多更全内容