利用定时器计时,注释非常详细,可自己改变定时时间。
单片机源程序如下:
- #include "reg52.h"
- #define GPIO_TRAFFIC P2
- #define GPIO_DIG P0
- typedef unsigned char u8;
- typedef unsigned int u16;
- //3-8译码器引脚位定义
- sbit LSA = P1^0;
- sbit LSB = P1^1;
- sbit LSC = P1^2;
- //交通信号灯南北方向控制引脚位定义
- sbit GREEN10 = P2^0;
- sbit RED10 = P2^1;
- sbit GREEN11 = P2^2;
- sbit YELLOW11 = P2^3;
- sbit RED11 = P2^4;
- //交通信号灯东西方向控制引脚位定义
- sbit GREEN00 = P1^6;
- sbit RED00 = P1^7;
- sbit GREEN01 = P2^5;
- sbit YELLOW01 = P2^6;
- sbit RED01 = P2^7;
- u8 code smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
- 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴
- u8 displaydata[8]; //储存信号灯倒计时
- //定义一个全局变量
- u8 second;
- //各种函数的声明
- void Timer0Init();
- void delay(u16 i);
- void Digdisplay();
- void trafficpros();
- /*******************************
- 主函数:main
- *******************************/
- void main(void)
- {
- second = 1;
- Timer0Init(); //初始化定时器T0;
- while(1)
- {
- trafficpros();
- }
- }
- /*******************************
- 定时器T0配置函数,只选择TCON中TR
- 0触发,定时10ms。
- *******************************/
- void Timer0Init()
- {
- TMOD |= 0x01;
- TH0 = 0xd8;
- TL0 = 0xf0; //设定初值55536,定时10ms
- IE = 0x82; //开启T0中断和总中断
- TR0 = 1; //开启定时器T0
- }
- /*******************************
- 中断处理函数
- *******************************/
- void Time0() interrupt 1
- {
- static u16 i;
- TH0 = 0xd8;
- TL0 = 0xf0; //重装初值
- i++; //记下中断的次数,100次为一秒
- if(100 == i)
- {
- i = 0;
- second++;
- }
- }
- /*******************************
- 延时函数,延时约10μs
- *******************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************
- 8位数码管位选函数
- *******************************/
- void Digdisplay()
- {
- u8 i;
- for(i = 0; i < 8; i++)
- {
- switch(i)
- {
- case 0:
- LSA = 0; LSB = 0; LSC = 0; break;
- case 1:
- LSA = 1; LSB = 0; LSC = 0; break;
- case 2:
- LSA = 0; LSB = 1; LSC = 0; break;
- case 3:
- LSA = 1; LSB = 1; LSC = 0; break;
- case 4:
- LSA = 0; LSB = 0; LSC = 1; break;
- case 5:
- LSA = 1; LSB = 0; LSC = 1; break;
- case 6:
- LSA = 0; LSB = 1; LSC = 1; break;
- case 7:
- LSA = 1; LSB = 1; LSC = 1; break;
- }
- GPIO_DIG = displaydata[i];
- delay(100);
- GPIO_DIG = 0x00; //消影
- }
- }
- /*******************************
- 交通信号灯控制函数
- *******************************/
- void trafficpros()
- {
- if(second > 74)
- {
- second = 1;
- }
- //南北方向通车和人行道
- if(second < 32)
- {
- displaydata[0] = 0x00; //第一位数码管不显示
- displaydata[1] = 0x00; //第二位数码管不显示
- displaydata[2] = smgduan[(31 - second)/10];
- displaydata[3] = smgduan[(31 - second)%10];
- displaydata[4] = 0x00; //第五位数码管不显示
- displaydata[5] = 0x00; //第六位数码管不显示
- displaydata[6] = displaydata[2];
- displaydata[7] = displaydata[3];
- Digdisplay();
- //每次先所有的灯进行熄灭
- GPIO_TRAFFIC = 0xff;
- GREEN00 = 1;
- RED00 = 1;
- GREEN10 = 0; //人行道绿灯亮
- GREEN11 = 0; //车道绿灯亮
- RED00 = 0; //东西方向人行道红灯亮
- RED01 = 0; //东西方向车道红灯亮
- }
- //中间黄灯阶段
- else if(second < 38)
- {
- displaydata[0] = 0x00; //第一位数码管不显示
- displaydata[1] = 0x00; //第二位数码管不显示
- displaydata[2] = smgduan[(37 - second)/10];
- displaydata[3] = smgduan[(37 - second)%10];
- displaydata[4] = 0x00; //第五位数码管不显示
- displaydata[5] = 0x00; //第六位数码管不显示
- displaydata[6] = displaydata[2];
- displaydata[7] = displaydata[3];
- Digdisplay();
- //每次先所有的灯进行熄灭
- GPIO_TRAFFIC = 0xff;
- GREEN00 = 1;
- RED00 = 1;
- RED10 = 0; //南北方向人行道红灯亮
- YELLOW11 = 0; //南北方向车道黄灯亮
- RED00 = 0; //东西方向人行道红灯亮
- RED01 = 0; //东西方向车道红灯亮
- }
- //东西方向通车和人行道
- else if(second < 69)
- {
- displaydata[0] = 0x00; //第一位数码管不显示
- displaydata[1] = 0x00; //第二位数码管不显示
- displaydata[2] = smgduan[(68 - second)/10];
- displaydata[3] = smgduan[(68 - second)%10];
- displaydata[4] = 0x00; //第五位数码管不显示
- displaydata[5] = 0x00; //第六位数码管不显示
- displaydata[6] = displaydata[2];
- displaydata[7] = displaydata[3];
- Digdisplay();
- //每次先所有的灯进行熄灭
- GPIO_TRAFFIC = 0xff;
- GREEN00 = 1;
- RED00 = 1;
-
- GREEN00 = 0; //东西方向人行道绿灯亮
- GREEN01 = 0; //东西方向车道绿灯亮
- RED10 = 0; //南北方向人行道红灯亮
- RED11 = 0; //南北方向车道红灯亮
- }
- //中间黄灯阶段
- else
- {
- displaydata[0] = 0x00; //第一位数码管不显示
- displaydata[1] = 0x00; //第二位数码管不显示
- displaydata[2] = smgduan[(74 - second)/10];
- displaydata[3] = smgduan[(74 - second)%10];
- displaydata[4] = 0x00; //第五位数码管不显示
- displaydata[5] = 0x00; //第六位数码管不显示
- displaydata[6] = displaydata[2];
- displaydata[7] = displaydata[3];
- Digdisplay();
- //每次先所有的灯进行熄灭
- GPIO_TRAFFIC = 0xff;
- GREEN00 = 1;
- RED00 = 1;
-
- RED00 = 0; //东西方向人行道红灯亮
- YELLOW01 = 0; //东西方向车道黄灯亮
-
- RED10 = 0; //南北方向人行道红灯亮
- RED11 = 0; //南北方向车道红灯亮
- }
- }
复制代码
所有资料51hei提供下载:
交通信号灯.rar
(24.3 KB, 下载次数: 66)
|