单片机源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- uchar led[ ]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f};
- void delay_ms(uchar j) //延时若干ms
- {
- uchar i;
- while(j--)
- {
- for(i=0;i<125;i++)
- for(i=0;i<125;i++);
- }
- }
- void delay_s(uchar i) //延时i秒钟
- {
- 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--);
- }
- }
- void dongxi(uchar a) //东西绿灯 南北红灯
- {
- uchar j=100; //循环100次
- for(a;a>0;a--)
- {
- P1=0X09;delay_ms(5);
- while(j--)
- {
- P0=0Xfb;
- P2=led[a/10]; //显示十位倒计时
- delay_ms(5);
- P0=0Xf7;
- P2=led[a%10]; //显示个位倒计时
- delay_ms(5);
- if(a<=3) //如果a小于3,则开始黄灯闪烁
- {
- P1=0X12;
- delay_ms(5);
- P1=0X00;
- delay_ms(5);
- }
- }}}
- void nanbei(uchar a) //南北绿灯 东西红灯
- {
- uchar j=100;
- for(a;a>0;a--)
- {
- P1=0X24;
- delay_ms(5);
- while(j--)
- {
- P0=0Xfe;
- P2=led[a/10]; //显示十位倒计时
- delay_ms(5);
- P0=0Xfd;
- P2=led[a%10]; //显示个位倒计时
- delay_ms(5);
- if(a<=3) //如果a小于3,则开始黄灯闪烁
- {
- P1=0X12;
- delay_ms(5);
- P1=0X00;
- delay_ms(5);
- }
- }}}
- void main()
- {
- EA=1; //允许中断
- EX0=1; //允许外部中断0
- IT0=1; //跳沿触发
- while(1)
- {
- dongxi(10); //东西通行时间10秒
- nanbei(10); //南北通行时间10秒
- }
- }
- void int0() interrupt 0 //外部中断0函数
- {
- uchar i;
- EA=0;
- P0=0xff;
- for(i=5;i>0;i++)
- {
- P1=0X12;
- delay_ms(10);
- P1=0X00;
- delay_ms(10);
- }
- P1=0x0c;
- delay_s(5);
- EA=1;
- }
- #include<reg51.h>
- #define u8 unsigned char
- #define u16 unsigned int
- sbit s1=P3^2;//应急通行
- u8 code display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0---9
- u8 buf[2]={1,0};//初始显示10
- u8 num;//1s计时
- u8 time=10;//10s倒计时
- bit flag=0;
- void time0_init()
- {
- TMOD=0x01;//定时器0,工作于方式1
- TH0=(65535-50000)/256;//定时50ms
- TL0=(65535-50000)%256;
- ET0=EA=TR0=1;
- }
- void delayms(u16 x)//毫秒延时函数
- {
- u16 i,j;
- for(i=0;i<x;i++) //连数x次,约 x ms
- for(j=0;j<120;j++); //数120 次,约1 ms
- }
- void scan()//数码管扫描函数
- {
- P0=0xfa;P2=display[buf[1]];
- delayms(5);
- P0=0xf5;P2=display[buf[0]];
- delayms(5);
- }
- void convert(u8 dat)//将数据转成适合数码管显示的数
- {
- buf[1]=dat/10;
- buf[0]=dat%10;
- }
- void main()//主函数
- {
- EA=1;
- EX0=1;
- IT0=1;
- time0_init();//初始化
- flag=1;
- while(1)
- {
- convert(time);//正常数据转换
- scan();//倒计时显示
- if(flag==0)
- {
- P1=0x24;
- if(time<=3){P1=0x12;}
- }
- else if(flag==1)
- {
- P1=0x09;
- if(time<=3){P1=0x12;}
- }
- }
- }
- void time0()interrupt 1
- {
- TH0=(65535-50000)/256;//定时50ms
- TL0=(65535-50000)%256;
- num++;
- if(num==20)//1s时间
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
红绿灯.zip
(96.49 KB, 下载次数: 16)
|