标题:
超详细的单片机交通信号灯控制程序
[打印本页]
作者:
jkla
时间:
2020-4-7 21:32
标题:
超详细的单片机交通信号灯控制程序
利用定时器计时,注释非常详细,可自己改变定时时间。
单片机源程序如下:
#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)
2020-4-7 21:32 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
尔与一扇窗
时间:
2020-4-9 13:24
老哥有没有整个工程文件
作者:
jkla
时间:
2020-4-10 09:03
尔与一扇窗 发表于 2020-4-9 13:24
老哥有没有整个工程文件
所有的Keil工程代码都在里面了,你还缺啥
作者:
..,
时间:
2020-6-9 12:49
老哥,有图吗
作者:
15975875172
时间:
2020-7-11 10:40
连仿真图都没有?
作者:
jkla
时间:
2020-8-25 20:29
15975875172 发表于 2020-7-11 10:40
连仿真图都没有?
有,不出
作者:
lzh876967654
时间:
2021-6-5 21:24
想要图
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1