单片机交通灯实验资料报告材料.docx
- 文档编号:30470140
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:13
- 大小:35.66KB
单片机交通灯实验资料报告材料.docx
《单片机交通灯实验资料报告材料.docx》由会员分享,可在线阅读,更多相关《单片机交通灯实验资料报告材料.docx(13页珍藏版)》请在冰豆网上搜索。
单片机交通灯实验资料报告材料
1、实验目的
通过仿真和实物搭建相结合,完成交叉口交通灯的设计,并掌握C51编程的操作。
二、实验容及要求
模拟控制就是以红、绿、黄色4组6个发光二极管表示交通信号灯。
每组有两位数码倒计时显示。
(1)正常情况下A、B道轮流放行,A道放行15秒钟,B道放行20秒
(2)一道有车而另一道无车时,使有车车道放行
(3)有紧急车辆通过时,A、B道均为红灯,每个口都有2组2位数码管,共6个灯
3、实验原理
本实验主要用到51单片机定时中断控制LED的跳转和数码管的倒计时,同时用查询法来检测按键,并做出相应的状态切换。
4、实验仪器、材料
LED,7段数码管,AT89C52单片机,导线
5、实验过程及原始记录
(1)通过Proteus做仿真图;
仿真图如下:
(2)用Keil软件编写程序调试;
交通灯程序:
/*******************代码说明************
程序实现简单的十字交通路口指示灯功能。
按键act是功能选择键,按第一下后,再按add键实现倒计时增加,最后一次增加的值作为倒计时数的值,
act按第二下后,再按add键实现交通灯方向变换,act按第三下倒计时继续。
*/
#include"reg51.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineAA15
#defineBB20//设初值
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
sbitadd=P1^1;//aad键
sbitact=P1^0;//act键
sbitnred=P1^2;//南北方向的红灯
sbitnyellow=P1^3;
sbitngreen=P1^4;
sbitered=P1^5;//东西方向的红灯
sbiteyellow=P1^6;
sbitegreen=P1^7;
sbitjian=P3^2;
uchartime,num=0,nn=0,aa=1,flag2=0;
bitflag=0,flag1=0;
uintnumber,temp1,temp2,sum2=BB,sum1=AA;
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidinit()//初始化函数
{
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;
}
voiddisplay(ucharnum)//数码管现实函数
{
ucharshi,ge;
ge=num%10;
shi=num/10;
P0=table[shi];
P2=table[ge];
}
voidmain()
{
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)//增加数值
{
nn=1;
temp2++;
sum2=temp2;
if(temp2==100)
{
temp2=0;
}
display(temp2);
}
if(num==3)//改变交通灯方向
{
flag1=0;
flag=0;
display(temp1);
}
}
while(!
add);
delay(5);
while(!
add);
}
/*减少键或选择东西方向键*/
if(jian==0)//判断add是否按下
{
delay(10);
if(jian==0)
{
if(num==1)//增加数值
{
nn=1;
temp1--;
sum1=temp1;
if(temp1==-1)
{
temp1=100;
}
display(temp1);
}
if(num==2)//增加数值
{
nn=1;
temp2--;
sum2=temp2;
if(temp2==-1)
{
temp2=100;
}
display(temp2);
}
if(num==3)//改变交通灯方向
{
flag=1;
flag1=1;
display(temp2);
}
}
while(!
jian);
delay(5);
while(!
jian);
}
if(flag==0)//交通灯
{
ered=1;
ngreen=1;
nred=0;
egreen=0;
while((temp1>=0&&temp1<5&&nn==0)||(temp2>=0&&temp2<5&&nn==0))
{
//egreen=1;
eyellow=0;
delay(500);
eyellow=1;
delay(500);
}
}
if(flag==1)
{
nred=1;
egreen=1;
ered=0;
ngreen=0;
while((temp1>=0&&temp1<5&&nn==0)||(temp2>=0&&temp2<5&&nn==0))
{
//ngreen=1;
nyellow=0;
delay(500);
nyellow=1;
delay(500);
}
}
}
}
voidtimer0()interrupt1//定时器0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time==10)
{
time=0;
if(flag1==0)
{
temp1--;
if(temp1==-1)
{
temp1=sum1;
flag=~flag;
flag1=~flag1;
}
if(flag!
=1)
display(temp1);
else
display(temp2);
}
else
{
temp2--;
if(temp2==-1)
{
temp2=sum2;
flag=~flag;
flag1=~flag1;
}
if(flag!
=0)
display(temp2);
else
display(temp1);
}
if(flag2==1)
{
//temp1=number;
//sum1=temp1;
//flag1=0;
}
else
if(flag2==2)
{
//temp2=number;
//sum2=temp2;
//flag1=1;
}
}
}
voidUARTInterrupt(void)interrupt4
{
if(RI)
{
RI=0;
flag2++;
if(flag2==3)
flag2=0;
number=SBUF;
}
else
TI=0;
}
/*voidSendOneByte(unsignedcharc)
{
SBUF=c;
while(!
TI);
TI=0;
}*/
(3)调试成功后结合实物调试。
六、实验结果及分析
按下第一个键,数码管和交通等开始亮,数码管开始倒计时显示,按下第一个键第一次调整第一个数,按下第二次调整第二个数,按下第三次,调整交通灯的显示状态,按下第四次重新开始倒计时。
7、实验体会
这次实验主要用了定时器0中断来控制倒计时的时间,运用查询法控制三个按键,P0口控制十位,P2口控制个位。
这次的实验是很难忘的经历,本次实验对单片机编程能力要求比较高,而且我们编的程序太麻烦了,太长了,没有注意编程的技巧,在以后的学习中要注意编程能力的训练。
通过此次实验,锻炼了我们的动手能力,理论联系实际,对于提高水平很有帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 交通灯 实验 资料 报告 材料