C51十字交通灯设计
1.实验准备:软件:Keil uVision4/5、Proteus 8
硬件:风标电子试验箱及十字交通灯扩展板
2.实验题目:设计一个十字路口交通灯控制器。用单片机控制LED灯模拟指示。模拟东西方向的十字路口交通信号控制情况, 东西向通行时间为80s,南北向通行时间为60s,缓冲时间为3s。本项目为典型的LED显示和中断定时电路。利用定时器T0 产生每10ms一次的中断,每100次中断为1s。对两个方向分别显示红、绿、黄灯,已经相应的剩余时间即可。值得注意是,需要意识到,A方向红灯时间 B方向绿灯时间+黄灯缓冲时间这一常识。
3.实验说明:就我本人而言,实验本身较难的部分是定时器做中断的部分,代码部分需要对定时器初始化和定时器做中断进行 深入研究,其次便是数码管显示的问题了,本人已将相应说明注释在代码里,代码能够成功运行项目,大家可以借鉴性参考,编写自己的代码;至于proteus仿真方面,也能成功运行,我会将相应的仿真图片贴到本文中,供大家参考学习。
4.实验代码
//接线说明 南北红绿黄灯分别接P^0-2
// 东西红绿黄灯分别接P1^3-5
// 数码管SA-SH接P3接口用于段选
// COM1-4接P2用于位选
#include "reg52.h"
#define uchar unsigned char
uchar code table[11] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff}; //0123456789 off
uchar table1[4]; //中间变量数组,用于传值
unsigned char t;
unsigned char SN = 80;
unsigned char EW = 60;
int num;
sbit nredled=P1^0;
sbit ngreenled=P1^1;
sbit nyellowled=P1^2;
sbit eredled=P1^3;
sbit egreenled=P1^4;
sbit eyellowled=P1^5;
void SMG_init(void) //数码管初始化函数
{
table1[3]=table[0];
table1[2]=table[0];
table1[1]=table[0];
table1[0]=table[0];
}
void display(void) //数码管显示函数
{
P2 = 0x01; //数码管位选
P3 = table[t/10]; //除法运算,用于显示十位数字
P3 = 0xff; //ÏûÒþ
P2=0x02;;
P3 = table[t%10]; //取余运算,用于显示个位数字
P3 = 0xff;
P2=0x04;;
P3 = table[t/10];
P3 = 0xff;
P2=0x08;
P3 =table[t%10];
P3 = 0xff;
}
void LED1(void)
{
while(t>3)
{
nredled=0; //南北红灯亮
egreenled=0; //东西绿灯亮
ngreenled=1;
eredled=1;
nyellowled=1;
eyellowled=1;
display();
}
SMG_init();
}
void LED2(void)
{
while(t>0)
{
display();
nredled=1;
egreenled=1;
eyellowled=0; //东西黄灯亮
nyellowled=0; //南北黄灯亮
ngreenled=1;
eredled=1;
}
SMG_init();
t=60;
}
void LED3(void)
{
while(t>0)
{
display();
eyellowled=1;
nyellowled=1;
ngreenled=0; //南北绿灯亮
eredled=0; //东西红灯亮
nredled=1;
egreenled=1;
}
SMG_init();
}
void T0_time(void) interrupt 1 //定时器T0做中断
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20) //每1s产生一次中断
{
num=0;
t--;
}
}
void init(void)
{
TMOD=0x01; //定时器工作方式寄存器TMOD,定时器设置为模式1
TH0=(65536-45872)/256; //定时器初值寄存器设置初值
TL0=(65536-45872)%256;
EA=1; //全局中断允许位,置1中断可用
ET0=1; //中断允许控制寄存器IE,ET0为定时器0的中断允许位
TR0=1; //定时器控制寄存器TCON,TR0为定时器0运行控制位,置1启动定时器0
num=0;
}
void main()
{
while(1)
{
init();
t = 80;
P3=0xff;
LED1();
LED2();
LED3();
SMG_init();
}
}
5.实验视频及相关仿真文件均打包在以下链接中,供大家免费下载
链接:https://pan.baidu.com/s/1rjVzJ5KgiS4tU7zG_vh0CA
提取码:w23p