单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- sbit c=P1^1;
- sbit d=P1^4;
- uchar led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9数码管显示
- void delay1(uchar j)//延时若干ms
- {uchar i;
- while(j--)
- {for(i=0;i<125;i++)
- for(i=0;i<125;i++);}
- }
- void delay(uchar i) //延时1秒钟
- {
- unsigned char a,b,c;
- while(i--)
- {for(c=167;c>0;c--)
- for(b=171;b>0;b--)
- for(a=16;a>0;a--);
- _nop_; }
- }
- void nanbei(uchar a)//南北显示红绿灯
- {uchar j=100;
- P1=0X24;
- for(a;a>0;a--)
- {
- while(j--)
- {
- P0=0XFE;
- P2=led[a/10];//显示十位倒计时
- delay1(5);//延时5毫秒,给机器一点反应时间
- P0=0XFd;
- P2=led[a%10];//显示个位倒计时
- delay1(5);//延时5毫秒,给机器一点反应时间
- if(a<=3)//如果a小于3,则开始黄灯闪烁
- {
- P1=0X12;
- delay1(10);
- P1=0X00;
- delay1(10);
- }
- }
- }
- }
- void dongxi(uchar a)//东西显示红绿灯
- {uchar j=100;
- P1=0X09;
- for(a;a>0;a--)
- {
- while(j--)
- {
- P0=0XFB;
- P2=led[a/10];//显示十位倒计时
- delay1(5);//延时5毫秒,给机器一点反应时间
- P0=0XF7;
- P2=led[a%10];//显示个位倒计时
- delay1(5);//延时5毫秒,给机器一点反应时间
- if(a<=3)//如果a小于3,则开始黄灯闪烁
- {
- P1=0X12;
- delay1(10);
- P1=0X00;
- delay1(10);
- }
- }
- }
- }
- main()
- {EA=1;//允许中断
- EX0=1;//允许外部中断0
- IT0=1;//跳沿触发
- while(1)
- {dongxi(60);//东西通行时间60秒
- nanbei(40);//南北通行时间40秒
- }
- }
- void into(void) interrupt 0 //外部中断0函数,用于强行更改红绿灯方向
- {uchar i,j=1000,b;
- P0=0XFF;
- P1=P1&0X01;//判断如果P1最后一位为1,则东西方向为绿灯,南北方向为红灯
- if(P1==0X01)
- {P1=0X08;
- for(b=0;b<3;b++)
- {{for(i=0;i<10;i++)//黄灯闪烁次数
- {delay1(100);
- c=~c;
- delay1(100);
- }}}
- P1=0Xe4;
- delay(10);//改变之后的时间延时10秒
- }
- else
- {P1=0X04;
- for(b=0;b<3;b++)
- {{for(i=0;i<10;i++)
- {delay1(100);
- d=~d;
- delay1(100);
- }}}
- P1=0X09;
- delay(10);//改变之后的时间延时10秒
- }}
复制代码
所有资料51hei提供下载:
带中断的红绿灯.zip
(68.01 KB, 下载次数: 49)
|