单片机交通灯实训报告.docx
- 文档编号:7434507
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:19
- 大小:2.29MB
单片机交通灯实训报告.docx
《单片机交通灯实训报告.docx》由会员分享,可在线阅读,更多相关《单片机交通灯实训报告.docx(19页珍藏版)》请在冰豆网上搜索。
单片机交通灯实训报告
机电工程学院课程设计报告
课程名称:
单片机课程设计
专业班级:
13电本2班
学号:
2013041632
******
指导教师:
王清辉、何文丰
完成时间:
报告成绩:
评阅意见:
评阅教师日期
交通灯设计
一、设计任务与要求
设计基本要求:
(1)车辆通行繁忙的十字交叉路口,设计一交通灯控制器,设东西方向通行时间为30秒,当剩余3秒时黄灯亮,南北方向通行时间为20秒,当剩余3秒时黄灯亮。
(2)东西、南北方向各用三个(绿、黄、红)LED表示,并用数码管显示东西、南北方向的剩余时间。
(3)可利用按键修改时间参数,可以利用按键切换东西南北交通灯的当前状态(即立刻东西由红变绿,南北有绿变红,并按设定的时间工作)。
二、方案设计与论证
交通灯的工作方式及状态设计:
状态
东西
南北
通行时间
注
红黄绿
红黄绿
1、东西绿灯南北红灯
110
011
27秒(时间可设)
交通灯从状态1至4不断循环,通过外设按钮实现状态1和3的切换
2、东西黄灯南北红灯
101
011
3秒(黄灯闪烁)
3、东西红灯南北绿灯
011
110
17秒(时间可设)
4、东西红灯南北黄灯
011
101
3秒(黄灯闪烁)
表2-1:
交通灯的工作状态表
根据表2-1所示可将交通灯的工作状态设为以下几个步骤:
1、初始状态时即为东西方向绿灯通行27秒+3秒黄灯,此时南北红灯亮。
2、随后是南北方向绿灯通行17秒+3秒黄灯,此时东西红灯亮。
3、通过按模式选择键一次来切换东西南北交通灯的当前状态。
(通过设置定时计时器T1实现交通灯的计时)
4、通过按模式选择键第二次切换至南北方向红绿灯的计时设置,通过加减按键来确定南北方向红绿灯的计时数。
5、确定南北方向计数值后,通过按模式选择键第三次切换至东西方向红绿灯的计时设置,通过加减按键来确定东西方向红绿灯的计时数。
6、确定交通灯计时数后再按下模式选择键后,交通灯便进入工作状态。
时间计时的实现:
采用定时中断实现秒的精确计时(详细方案入下列程序设计所示)。
按键输入的实现:
通过编写按键读取函数,来实现交通灯的状态以及时间值得设定(详细方案入下列程序设计所示)。
图2-1程序设计流程框图
三、硬件电路设计
1、倒计时显示
该系统要求完成倒计时的功能。
因只需显示数字,基于上述原因,我完全采用数码管显示,四个路口分别采用一个二位共阴极数码管即可。
2、状态灯显示
该系统要求完成状态灯显示的功能。
采用红绿黄三种LED灯一个路口只需三个个状态灯,绿灯通行,红灯停止,黄灯闪烁。
3、输入方案
该系统要求能手动改变东西与南北的通行时间、红绿灯状态紧急交换处理。
运用单片机中四个IO口设置三个按键,三个按键的功能分别为:
增加、减少、状态切换和暂停。
4、复位电路与晶振电路
复位电路:
复位方式有多种,本设计采用按键复位。
接线图如图3-1所示,当按下复位按键时,RST端产生高电平,使单片机复位。
复位后,其片内各寄存器状态改变,片内RAM内容不变。
晶振电路(如图3-2所示):
结合单片机内部产生单片机所需的时钟频率。
图3-1程序仿真接线图图3-2程序仿真接线图
5、AT89S51的简介
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。
图3-3程序仿真接线图
四、软件设计
根据设计要求得完整的交通灯程序源代码包含有:
1.定时2.数码管显示3.LED状态切换.4按键读取。
#include"reg51.h"
#defineuintunsignedint
#defineucharunsignedchar
ucharcodenum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示数组
ucharT0_Count=0,East_time=0,North_time=0;//定时变量,东西倒计时变量,南北倒计时变量
sbitDXD_Red=P3^0;//东西方向红灯
sbitDXD_Yellow=P3^1;//东西方向黄灯
sbitDXD_Green=P3^2;//东西方向绿灯
sbitNBD_Red=P3^3;//南北方向红灯
sbitNBD_Yellow=P3^4;//南北方向黄灯
sbitNBD_Green=P3^6;//南北方向绿灯
sbitDXKZ_GE=P2^4;//东西方向个位数码管公共端
sbitDXKZ_SHI=P2^5;//东西方向十位数码管公共端
sbitNBKZ_GE=P2^6;//南北方向个位数码管公共端
sbitNBKZ_SHI=P2^7;//南北方向十位数码管公共端
sbitKey_Add=P1^1;//增加按键
sbitKey_Dec=P1^2;//减少按键
sbitKey_OK=P1^3;//确定按键,兼具状态切换
sbitLE=P1^0;
voiddelayms(uinti)//毫秒级延时
{
uintx,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--);
}
voidt0_init()
{
TMOD=0X01;//16位定时器0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//定时50ms
ET0=1;//开启中断1
EA=1;//开启总中断
TR0=1;//开启定时器0
}
voidstate1()//东西绿灯亮,南北红灯亮
{
DXD_Red=1;
DXD_Yellow=1;
DXD_Green=0;
NBD_Red=0;
NBD_Yellow=1;
NBD_Green=1;
}
voidstate2()//东西黄灯闪烁
{DXD_Red=1;
DXD_Yellow=0;
DXD_Green=1;
}
voidstate3()//东西红灯亮,南北绿灯亮
{
DXD_Red=0;
DXD_Yellow=1;
DXD_Green=1;
NBD_Red=1;
NBD_Yellow=1;
NBD_Green=0;
}
voidstate4()//南北黄灯闪烁
{
NBD_Red=1;
NBD_Yellow=0;
NBD_Green=1;
}
voidDisplay(ucharnum1,num2)//功能:
数码管扫描显示函数
//参数:
num1,东西方向数码管显示值;num2,南北方向数码管显示值
{
P0=num[num1%10];//LE=1;LE=0;//写入个位数
DXKZ_GE=0;delayms(10);//开启一个数码管公共端,显示一段时间
DXKZ_GE=1;//关闭公共端
P0=num[num1/10];//LE=1;LE=0;//写入十位数
DXKZ_SHI=0;delayms(10);
DXKZ_SHI=1;
P0=num[num2%10];//LE=1;LE=0;//写入个位数
NBKZ_GE=0;delayms(10);
NBKZ_GE=1;
P0=num[num2/10];//LE=1;LE=0;//写入十位数
NBKZ_SHI=0;delayms(10);
NBKZ_SHI=1;
}
ucharkey_read()//功能:
按键读取参数:
back,1,按下增加按键;2,减少按键;3确定键
{
ucharback=0;
if(P1!
=0xff)
{
delayms(10);//按键延时消抖
if(Key_Add==0)
back=1;
elseif(Key_Dec==0)
back=2;
elseif(Key_OK==0)
back=3;
while(P1!
=0xff);
}
returnback;
}
voidClear_Display()//关闭所有数码管显示
{
P0=0x00;//LE=1;LE=0;
DXKZ_GE=1;
DXKZ_SHI=1;
NBKZ_GE=1;
NBKZ_SHI=1;
}
voidmain()
{
ucharTab=1,key,East_TimeNum=30,North_TimeNum=20;
t0_init();
Clear_Display();//开机初始化关闭所有数码管
//设置东西方向倒计时
while(key!
=3)//按下确定键,退出while
{
key=key_read();//按键读取函数
if(key==1)//按下增加按键
East_TimeNum++;
elseif(key==2)//按下减少按键
if(East_TimeNum>3)East_TimeNum--;
Display(East_TimeNum,0);//数码管同步显示东西方向设定的值
}
key=0;
//设置南北方向倒计时
while(key!
=3)//按下确定键,退出while
{
key=key_read();//按键读取函数
if(key==1)//按下增加按键
North_TimeNum++;
elseif(key==2)//按下减少按键
if(North_TimeNum>3)North_TimeNum--;
Display(0,North_TimeNum);//数码管同步显示南北方向设定的值
}
key=0;
while
(1)
{
switch(Tab)
{
case1:
//红绿灯状态1
{
East_time=East_TimeNum;
//填充东西倒计时值,大小为已设置好的East_TimeNum
Tab=2;//切换至下一红绿灯状态
state1();
while((East_time!
=3)&&(key!
=3))//倒计时至3秒或按下切换按键,退出while
{
Display(East_time,North_time);//数码管显示
key=key_read();//按键读取
}
if(key==3)
{
key=0;East_time=0;//东西倒计时立刻清零
Tab=3;//按下切换按键,直接跳到状态3
}
break;
}
case2:
//红绿灯状态2
{
state2();Tab=3;//切换至下一红绿灯状态
while((East_time!
=0)&&(key!
=3))//倒计时至0秒或按下切换按键,退出while
{
Display(East_time,North_time);
key=key_read();
DXD_Yellow=~DXD_Yellow;
}
if(key==3)
{
key=0;Tab=3;//按下切换按键,直接跳到状态3
East_time=0;//东西倒计时立刻清零
}
break;
}
case3:
//红绿灯状态3
{
North_time=North_TimeNum;Tab=4;//切换至下一红绿灯状态
state3();
while((North_time!
=3)&&(key!
=3))
{
Display(East_time,North_time);
key=key_read();
}
if(key==3)
{
key=0;Tab=1;North_time=0;
}
break;
}
case4:
//红绿灯状态4
{
state4();Tab=1;//切换至下一红绿灯状态
while((North_time!
=0)&&(key!
=3))
{
Display(East_time,North_time);
key=key_read();
NBD_Yellow=~NBD_Yellow;
}
if(key==3)
{
key=0;Tab=1;North_time=0;
}
break;
}
}
}
}
voidTimer_0()interrupt1
{
T0_Count++;
TH0=(65536-50000)/256;//每50ms进入一次中断函数
TL0=(65536-50000)%256;
if(T0_Count==20)//定时20*50ms=1S
{
T0_Count=0;//清零重新计时
if(East_time==0)
East_time=0;
else
East_time--;//东西方向按秒间隔倒计时
if(North_time==0)
North_time=0;
else
North_time--;//南北方向按秒间隔倒计时
}
}
五、仿真过程与仿真结果
运用ISIS7Professional仿真软件进行程序仿真,按程序要求设置好程序仿真图(图3-1所示),把KeiluVision4生成交通灯程序的.hex文件捎入仿真图中,运行结果如下:
图5-1东西方向通行时间设置
通加减按键来控制东西方向通行时间,时间设置好后按下确定键切换至下一个状态。
图5-2南北方向通行时间设置
通加减按键来控制南北方向通行时间,时间设置好后按下确定键切换至下一个状态。
图5-3红绿灯正常工作状态
交通灯进入正常工作状态,按下确定键紧急切换红绿灯状态
图5-4红绿灯紧急切换
六、安装与调试
将所设计的程序写入keil4的工程中,编写好程序且检测无误后,点击编译(project/rebuildalltargetfiles)生成.Hex文件。
通过PZ-ISP软件(图6-1所示)将.hex文件下载到AT89C51单片机。
检测与调试交通灯运行状况。
由于电路板焊接问题,硬件功能无法实现,切换到开发板上进行功能测试。
图6-1PZ-ISP程序下载软件
操作1:
将hex文件捎入单片机后,交通灯便进入东西方向计时设定状态,通过按键的加减来改变东西通行时间(图6-2所示),设定好时间后按确定键,进入操作2。
图6-2程序的初始状况以及东西通行时间的调试
操作2:
交通灯进入南北方向计时设定状态后,通过按键的加减来改变南北通行时间(图6-3所示),设定好时间后按确定键,进入操作2。
图6-3状态切换至南北通行时间的调试
操作3:
交通灯各个方向计时设定好后进入工作状态,通过确定按键,来紧急切换红绿灯状态。
再次按下确定键,便进入操作1状态。
图6-4交通灯的工作状态以及红绿灯状态的紧急切换
经安装与调试后得,所设计的程序符合交通灯的设计要求。
硬件实物图
七、结论与心得
结论:
虽然所设计的交通灯符合本次实训的所有有要求,但还是有很多不足之处,要把我所设计的交通灯与实际中的交通灯相比还是有很多缺陷的,比如缺少各个方向左拐通行的指示功能,缺少人行横道的交通指示功能。
针对上述不足之处,在今后的学习中会不断的加以完善。
心得:
通过本次实训使我明白了,单片机实训跟单片机实验完全不同,自身的不足之处在这次实训中都一一暴露出来了,对于单片机的了解还是不够的,完全只停留在表面,对于单片机深层次的知识掌握的不够,无法很灵活的使用单片机的各个语句,这些不足之处在实训的操作下和老师的考察下都显露无疑。
在今后的学习中我定会加强对单片机的理论与实际操作的学习,对于自身不足之处定会加以改正。
八、参考文献
[1]阎石《数字电子技术基础(第三版)》,北京:
高等教育出版社,1989。
[2]苏家健,曹柏荣,汪志锋.《单片机原理及应用技术》.北京:
高等教育出社,
2004.
[3]《单片机原理及应用》张毅刚,高等教育出版社。
[4]《单片机实验教程》彭冬明、韦友春,北京理工大学出版社。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 交通灯 报告