模擬交通燈 數碼動態顯示 定時器定時中斷 親測好用
可以給學習定時中斷和數碼管朋友提供參考
單片機源程序如下:
- #include "reg52.h"
- #include "intrins.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
-
- #define led P3
- #define xianshismg P1
- sbit smgdt=P0^0; //數碼管動態
- sbit smgdt1=P0^1;
- sbit smgdt2=P0^2;
- sbit green30=P3^0 ;
- sbit red31=P3^1;
-
- sbit green32=P3^2;
- sbit yello33=P3^3;
- sbit red34=P3^4;
- sbit green35=P3^5;
- sbit yello36=P3^6;
- sbit red37=P3^7;
- sbit green20=P2^0 ;
- sbit red21=P2^1;
- u16 daojishi=0;
- u8 disdelay [8];
- u8 code smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
- 0x7d,0x07,0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0x00};
- void delay(u16 i)
- {
- while(i--);
- }
- void time0init () //t0中斷初始化
- {
- EA=1; //總開關 IE
- ET0=1; //t0中斷允許位 IE
- TR0=1; //t0計數允許位 TCON
- TMOD|=0X01; //設置定時器1和0的工作條件 方式和13/16/8位 TMOD
- //為了不改變其他位用或運算 TMOD|=0X01;
- TH0= 0xfc; //TH和TL都是對t0進行賦初值 因為t0只有溢出時才會發生中斷
- TL0 =0x18;
- }
-
- void ngfg( ) //哪個
- { u8 i;
-
- for(i=0;i<8;i++)
- {
- switch(i)
- {
- case 0:
- smgdt=0;smgdt1=0;smgdt2=0;break ;
- case 1:
- smgdt=1;smgdt1=0;smgdt2=0;break ;
- case 2:
- smgdt=0;smgdt1=1;smgdt2=0;break ;
- case 3:
- smgdt=1;smgdt1=1;smgdt2=0;break ;
- case 4:
- smgdt=0;smgdt1=0;smgdt2=1;break ;
- case 5:
- smgdt=1;smgdt1=0;smgdt2=1;break ;
- case 6:
- smgdt=0;smgdt1=1;smgdt2=1;break ;
- case 7:
- smgdt=1;smgdt1=1;smgdt2=1;break ;
- }
-
- xianshismg=disdelay[i];
- delay(100);
- xianshismg=0x00 ;
- }
- }
- void main()
- {
- time0init ();
- daojishi=1;
-
- while(1)
- {
-
- if(daojishi==71)
- {
- daojishi=1;
- }
- if(daojishi<31)
- {
- disdelay[0]=smg[(30-daojishi)/10];
- disdelay[1]=smg[(30-daojishi)%10];
- disdelay[2]=0x00;
- disdelay[3]=0x00;
- disdelay[4]=0x00;
- disdelay[5]=0x00;
- disdelay[6]=0x00;
- disdelay[7]=0x00;
- ngfg( );
- led=0xff; //所有燈初始化
- green20=1 ;
- red21=1;
- green35=0;
- green20=0;
- red31=0;
- red34=0 ;
-
- }
- else if(daojishi<36)
- {
- disdelay[0]=smg[(35-daojishi)/10];
- disdelay[1]=smg[(35-daojishi)%10];
- disdelay[2]=0x00;
- disdelay[3]=0x00;
- disdelay[4]=0x00;
- disdelay[5]=0x00;
- disdelay[6]=0x00;
- disdelay[7]=0x00;
- ngfg( );
- led=0xff; //所有燈初始化
- green20=1 ;
- red21=1;
- red31=0;
- red21=0;
- yello33=0;
- yello36=0;
-
- }
- else if(daojishi<66)
- {
- disdelay[0]=smg[(65-daojishi)/10];
- disdelay[1]=smg[(65-daojishi)%10];
- disdelay[2]=0x00;
- disdelay[3]=0x00;
- disdelay[4]=0x00;
- disdelay[5]=0x00;
- disdelay[6]=0x00;
- disdelay[7]=0x00;
- ngfg( );
- led=0xff; //所有燈初始化
- green20=1 ;
- red21=1;
- green30=0 ;
- green32=0;
- red37=0;
- red21=0;
-
- }
- else if(daojishi<71)
- {
- disdelay[0]=smg[(70-daojishi)/10];
- disdelay[1]=smg[(70-daojishi)%10];
- disdelay[2]=0x00;
- disdelay[3]=0x00;
- disdelay[4]=0x00;
- disdelay[5]=0x00;
- disdelay[6]=0x00;
- disdelay[7]=0x00;
- ngfg( );
- led=0xff; //所有燈初始化
- green20=1 ;
- red21=1;
- red31=0;
- red21=0;
- yello33=0;
- yello36=0;
-
- }
- }
- }
- void time0() interrupt 1
- {
- static u16 i;
- TH0= 0xfc; //每次定時中斷完成后都要重新賦值
- TL0 =0x18; //每次定時中斷完成后都要重新賦值
- i++;
- if (i==1000)
- { i=0;
- daojishi++;
-
- }
- }
復制代碼
Keil工程下載:
交通燈.rar
(29.71 KB, 下載次數: 16)
2021-5-1 22:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|