模拟交通灯 数码动态显示 定时器定时中断 亲测好用
可以给学习定时中断和数码管朋友提供参考
单片机源程序如下:
- #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)
|