單片機源程序如下:
- #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)
2020-9-15 15:23 上傳
點擊文件名下載附件
源程序和仿真
|