这种问题去十字路口仔细观察一下,就知道其控制规律了。 |
#include<reg51.h> #include<intrins.h> #include<absacc.h> #define uint unsigned int #define uchar unsigned char #define PA XBYTE[0x7F00] //PA端口地址 #define PB XBYTE[0x7F01] #define PC XBYTE[0x7F02] #define COM XBYTE[0x7F03] uchar temp,aa,nn; sbit shi=P3^0; sbit ge=P3^1; /*对要使用的单片机各个口进行定义*/ bit flag=0; sbit key1=P2^0; sbit key2=P2^1; sbit key3=P2^2; sbit key4=P2^3; sbit key5=P2^4; sbit key6=P3^3; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; /*将数字0123456789的16进制数定义成数组用以显示*/ //定义所有函数 void delay(uint z); void disp(uint n); void xint0(); void xint1(); void timer0(); void nb_flash(void); void dx_flash(void); void nanbei(); void dongxi(); void nanbeizuo(); void dongxizuo(); void dongxizuogreen(); void nanbeizuogreen(); void dongxigreen(); void nanbeigreen(); void allred(); void allyellow(); //主函数 void main() { uint num; num=0; aa=0; COM =0x82; //PA口输出,PB口输入,PC口输出 TMOD=0x01; //定时器工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; //开启总中断 ET0=1; //开启定时器中断 TR0=1; //开启定时器0 EX0=1; //外部中断0允许标志 IT0=0; //外部中断0电平触发 EX1=1; //外部中断1允许标志 IT1=0; //外部中断1电平触发 while(1){ nanbei(); nb_flash(); nanbeizuo(); dongxi(); dx_flash(); dongxizuo(); } } void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void timer0() interrupt 1 //定时器0中断 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; if(aa==18) { aa=0; flag=1; } } void disp(uint n) //数码管显示函数 { while(!flag) { ge=0; PC=table[n%10]; delay(50); shi=1;ge=1; shi=0; PC=table[n/10]; delay(50); shi=1;ge=1; } if(flag==1) flag=0; } void nanbei() //南北绿灯东西红灯及数码管显示 { //南北通行 uint num; num=60; disp(num); while(num<=60&&num>0) { PA=0xd8; num--; P1=0xe1; disp(num); } } void nanbeizuo() //南北方向左转及数码管显示 { uint num; num=15; disp(num); while(num<=15&&num>0) { P1=0xe4; num--; PA=0xe9; disp(num); } } void dongxizuo() //东西方向左转及数码管显示 { uint num; num=15; while(num<=15&&num>0) { P1=0xe4; PA=0xea; disp(num); num--; } } void dongxi() //东西绿灯南北红灯及数码管显示 { uint num; num=45; disp(num); while(num<=45&&num>0) { PA=0xe4; P1=0xcc; disp(num); num--; } } void nb_flash(void) //南北方向黄灯闪烁及数码管显示 { uint a; for(a=3;a>0;a--) { PA=0xd8; disp(a); P1=0xe2; delay(100); P1=0xe0; } } void dx_flash(void) //东西方向黄灯闪烁及数码管显示 { uint a; for(a=3;a>0;a--) { PA=0xe4; disp(a); P1=0xd4; delay(100); P1=0xa4; } } void xint0() interrupt 0 //外部中断0 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(key1==0){ if(key1==0) { delay(20); allred(); } } if(key2==0){ if(key2==0) { delay(20); allyellow(); } } if(key3==0){ if(key3==0) { delay(20); nanbeigreen(); } } if(key4==0){ if(key4==0) { delay(20); dongxigreen(); } } if(key5==0){ if(key5==0) { delay(20); nanbeizuogreen(); } } } void allred() //南北东西方向全部红灯 { P1=0xe4; PC=0x00; PA=0xe8; return; } void allyellow() //南北东西方向全部黄灯 { P1=0xd2; PC=0x00; PA=0x00; return; } void nanbeizuogreen() //南北方向左转绿灯 { P1=0xe4; PC=0x00; PA=0xe9; return; } void dongxizuogreen() //东西方向左转绿灯 { P1=0xe4; PC=0x00; PA=0xea; return; } void nanbeigreen() //南北方向绿灯 { P1=0xe1; PC=0x00; PA=0xe8; return; } void dongxigreen() //东西方向绿灯 { P1=0xcc; PC=0x00; PA=0xe8; return; } void xint1() interrupt 2 //外部中断1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; dongxizuogreen(); } |