单片机交通灯实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
通过仿真和实物搭建相结合,完成交叉口交通灯的设计,并掌握C51编程的操作。
二、实验内容及要求
模拟控制就是以红、绿、黄色4组6个发光二极管表示交通信号灯。每组有两位数码倒计时显示。
(1)正常情况下A、B道轮流放行,A道放行15秒钟,B道放行20秒
(2)一道有车而另一道无车时,使有车车道放行
(3)有紧急车辆通过时,A、B道均为红灯,每个口都有2组2位数码管,共6个灯三、实验原理
本实验主要用到51单片机定时中断控制LED的跳转和数码管的倒计时,同时用查询法来检测按键,并做出相应的状态切换。
四、实验仪器、材料
LED,7段数码管,AT89C52单片机,导线
五、实验过程及原始记录
(1)通过Proteus做仿真图;
仿真图如下:
(2)用Keil软件编写程序调试;
交通灯程序:
/*******************代码说明************
程序实现简单的十字交通路口指示灯功能。
按键act是功能选择键,按第一下后,再按add键实现倒计时增加,最后一次增加的值作为倒计时数的值,
act按第二下后,再按add键实现交通灯方向变换,act按第三下倒计时继续。
*/
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define AA 15
#define BB 20 //设初值
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
sbit add=P1^1; //aad键
sbit act=P1^0; //act键
sbit nred=P1^2; //南北方向的红灯
sbit nyellow=P1^3;
sbit ngreen=P1^4;
sbit ered=P1^5; //东西方向的红灯
sbit eyellow=P1^6;
sbit egreen=P1^7;
sbit jian=P3^2;
uchar time,num=0,nn=0,aa=1,flag2=0;
bit flag=0,flag1=0;
uint number,temp1,temp2,sum2=BB,sum1=AA;
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //初始化函数
{
temp1=AA;
temp2=BB;
TMOD|=0x21;//设置定时器1为工作方式2 TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
EA=1;
ET0=1;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
// ES = 1;
TR1 = 1;
}
void display(uchar num) //数码管现实函数{
uchar shi,ge;
ge=num%10;
shi=num/10;
P0=table[shi];
P2=table[ge];
}
void main()
{
while(act&&(aa==1)) //开始键
{
P0=0;
P2=0;
if(act==0)
{
delay(10);
if(act==0)
aa=0;
}
while(!act);
}
init();
if(flag1==0)
display(temp1);
else
display(temp2);
while(1)
{
/*功能键*/
if(act==0) //判断act键是否按下
{
delay(10);
if(act==0)
{
TR0=0;
num++;
if(num==4) //重新启动定时器
{
TR0=1;
num=0;
nn=0;
}
}
while(!act);
delay(5);
while(!act);
}
/*增加键或选择南北方向的键*/
if(add==0) //判断add是否按下{
delay(10);
if(add==0)
{
if(num==1) //增加数值
{
nn=1;
temp1++;
sum1=temp1;
if(temp1==100)
{
temp1=0;
}
display(temp1);
}
if(num==2) //增加数值