单片机交通灯课程设计报告.docx
- 文档编号:27497730
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:16
- 大小:297.99KB
单片机交通灯课程设计报告.docx
《单片机交通灯课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机交通灯课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
单片机交通灯课程设计报告
《单片机原理与应用》
课程设计报告
题目:
学院:
姓名:
学号:
日期:
指导老师:
交通灯的设计
一、课程设计的目的
1、进一步熟悉和掌握单片机的结构及工作原理。
2、掌握单片机的接口技术及相关外围芯片的特性,控制方法。
3、通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,了解有关电路参数的计算方法。
4、通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。
5、通过完成一个包括电路设计和程序开发的完整过程,使学生了解开发一单片机应用系统的全过程,为今后从事相应工作打下基础。
6、通过课程设计,培养学生综合运用所学专业知识分析问题和解决问题的能力。
二、仪器设备
伟福Lab8000系列单片机仿真实验系统。
三、课程设计主要内容及技术指标
基本要求:
设计由红黄绿三色灯组成的交通信号灯,各灯逐次点亮,按照红灯亮63秒——绿灯亮60秒——黄灯亮3秒——红灯亮63秒的顺序反复循环。
利用单片机片内的定时计数器定时,红黄绿灯用发光二极管表示,计时值用数码管以十进制数字显示。
要求定时准确,数码管和二极管显示正确。
拓展要求:
要有较好的人机对话界面;
由单向路口的红绿灯循环点亮拓展为十字路口红绿灯的循环点亮;
在十字路口的某一方向设定紧急通行开关,闭合开关时要求此方向绿灯点亮,另一方向红灯点亮,且倒计时的显示数码管停止计时。
四、系统工作原理
该系统以89C51单片机为控制核心,由外接三色(红绿黄)LED灯同步八段数码管的倒计时显示,外接两开关电路控制两方向的应急中断。
单片机上电后,系统进入正常工作状态,执行交通灯状态显示控制,同时将时间数据倒计时输入到八段数码管上实时显示。
在此过程中随时通过开关调用LED灯常亮显示和清除数码管显示的中断。
五、系统的硬件设计
注:
单片机的晶振电路的复位电路略去
连线时,伟福Lab8000系列单片机仿真实验系统的数码管显示打到外驱,P2口连接数码管的段码口,P3连接位选通口;用P1.0~P1.5分别选连两组红绿黄灯,P1.6~P1.7连接两控制开关key和key1.
六、系统的软件设计
1、系统工作过程
(1)在一个十字路口的两条主干道上,分别装上一套红、黄、绿3种信号灯。
(2)在通常情况下,一条主干道为红灯,另一条主干道为绿灯或黄灯。
采用定时器查询方式控制南北向、东西向交通灯。
数码管倒计时显示。
亮灯规律:
东西红灯亮63秒,南北绿灯亮60秒、黄灯亮3秒;
南北红灯亮63秒,东西绿灯亮60秒、黄灯亮3秒。
(3)在紧急情况时,数码管倒计时显示暂停,应急方向绿灯常亮,另一方向红灯亮。
设置某一方向中断的优先级更高。
解除应急以后,系统接着之前中断时的状态继续正常工作。
2、软件设计思想
通过定时器的查询方式,实现对数码管倒计时显示以及红绿黄三色的LED灯的亮灭时间的控制:
通过中断方式,实现在紧急情况下两方向红绿灯亮灭的控制。
3、程序流程图
(一)、主函数部分:
(二)、更新LED灯的状态和数码管的显示值模块:
4、软件源程序
#include
//此表为LED的字模
//0123456789clear
unsignedcharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//count_1s为定时到1s的循环次数20,count1和count为倒计时数
//flag_1s是1s到的标志
unsignedcharcount_1s,count,count1,flag_1s;
unsignedcharflag,flag1=1;//0->red;1->green;2->yellow
sbitred=P1^0;
sbitgreen=P1^1;
sbityellow=P1^2;
sbitred1=P1^3;
sbitgreen1=P1^4;
sbityellow1=P1^5;
sbitkey=P1^6;
sbitkey1=P1^7;
unsignedchara[4];//显示数据缓存
voidzd_ini()//中断初始化程序
{
TMOD=0x01;//选择方式1,定时器000000001b
TH0=0X3C;//定时50ms初值
TL0=0XB0;
ET0=1;//开定时器中断
EA=1;
TR0=1;
}
voidsystem_ini()
{
flag=0;
count_1s=20;//20*50ms=1s;
count=63;
count1=60;
zd_ini();//调用中断初始化程序
red=1;
green=0;
yellow=0;
green1=1;
red1=0;
yellow1=0;
key=1;
key1=1;
}
voidtimer_0()interrupt1//定时器中断0
{
TH0=0X3C;//继续赋初值
TL0=0XB0;
if(--count_1s)//如果没到1s,则返回
{return;}
//到1s
flag_1s=1;//置位标志位
count_1s=20;
}
voidshow()//用于计算和查表转换相应的待显示数
{
//东西向
a[0]=count/10;//高位
a[1]=count%10;//低位
a[0]=Disp_Tab[a[0]];
a[1]=Disp_Tab[a[1]];
//南北向
a[2]=count1/10;//高位
a[3]=count1%10;//低位
a[2]=Disp_Tab[a[2]];
a[3]=Disp_Tab[a[3]];
}
voidupdate()//更新count和count1的值,切换LED灯
{
if(key==1)//如果开关按下,则东西通,南北止
{
red=green1=0;
yellow=yellow1=0;
green=red1=1;
}
elseif(key1==1)//如果开关1按下,则南北通,东西止
{red=green1=1;
yellow=yellow1=0;
green=red1=0;}
else//如果无开关按下
{
if(flag==0)
{
if(count==0)
{
flag=1;//绿灯亮
flag1=0;//红灯1亮
count=60;
count1=63;
}
elseif(count1==0)
{
flag1=2;//黄灯1亮
count1=3;
}
else
{
count--;
count1--;
}
}
elseif(flag==1)
{
if(count==0)
{
flag=2;//黄灯亮
count=3;
}
else{
count--;
count1--;
}
}
else
{
if(count==0)
{
flag=0;//红灯亮
flag1=1;//绿灯1亮
count1=60;
count=63;
}
else{
count--;
count1--;
}
}
//////////////////////////////////////////////
//分别根据flag和flag1的值对LED灯的点亮情况设置
if((flag==0))
{
red=1;
green=0;
yellow=0;}
if((flag1==1))
{red1=0;
green1=1;
yellow1=0;
}
if((flag1==2))
{red1=0;
green1=0;
yellow1=1;
}
if((flag==1))
{
red=0;
green=1;
yellow=0;}
if(flag1==0)
{
red1=1;
green1=0;
yellow1=0;
}
if(flag==2)
{
red=0;
green=0;
yellow=1;
}
}
}
voiddisp()//总的显示函数
{
inti=0;
show();//调用用于计算和查表转换相应的待显示数的函数
P3=0x01;//输出低位选通信号
P2=a[1];
for(i;i<30;i++);//延时
P3=0x02;
P2=a[0];
i=0;
for(i;i<30;i++);//延时
P3=0x04;//输出低位选通信号
P2=a[2];
i=0;
for(i;i<30;i++);//延时
P3=0x08;
P2=a[3];
i=0;
for(i;i<30;i++);//延时
}
voidmain()
{
system_ini();//系统初始化
while
(1)
{
if(flag_1s)
{
update();//更新
flag_1s=0;//清除1秒时间到的标志
}
disp();//一直循环显示
}
}
七、系统的实现与调试过程
(一)、基本功能的实现与测试:
(1)、一秒定时的实现;
用定时器0定时50ms,循环次数设为20,每次溢出产生中断,进入中断服务程序里把次数减一,20次之后即可实现1s的定时。
在中断程序中,添加语句,如果循环到20次,则把P1.0取反,从而直接可以观察到1s定时的LED灯的亮灭。
如果没有,则检查中断服务程序。
(2)、单个数码管显示的实现;
数码管的ABCDEFGH与单片机的P2相连,位选通与P3口相连。
使要显示的位的位选通为低电平,从而实现显示。
检测时,可以先写P2=0xff;P3^0=1;看数码管是否能显示8.,如果可以,则说明数码管和电路没问题,如果不可以,则检查电路。
然后用要显示的值为索引下标,查找预先定义的数组——unsignedcharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};——转换成相应的数码管值送到P2口,看数码管能否正常显示。
(3)、两个数码管动态扫描显示的实现;
循环切换切换各数码管的位选通位,与此同时,送出段码,延时一段时间。
如此即可实现动态显示。
调试时,观察数码管是否能够正常扫描显示。
如果亮度过低,则增加延时时间;如果有闪烁现象,则减小延时即可。
(4)、LED灯配合数码管显示数值的改变而亮灭的实现;
每1s定时时间到,都要调用更新程序update();在这个函数里,我们通过判断当前计数值是否递减到0来确定是否要切换状态。
如果切换状态,则当前计数值重新赋初值,比如,下一个状态是红灯,则初值为63;
调试时观察LED灯是否与显示的倒计时同步。
如果不同步,检查自己的update()函数里的判断逻辑关系是否有误。
(二)、附加南北方向的控制后:
(1)、南北和东西交通灯组合情况的逻辑梳理;
总共四种情况:
东西红灯,南北绿灯;东西红灯,南北黄灯;东西绿灯,南北红灯;东西黄灯,南北红灯。
我们在东西红的控制程序段里加入南北绿灯和黄灯的判断处理;东西绿灯和黄灯时,让南北红灯点亮;东西黄灯结束,东西南北的交通灯同时切换。
如此即可理清整个逻辑的框架。
(2)、四个数码管动态扫描显示的实现;
通上所述两个数码管实现和调试方法一样,只是循环切换的位选通位为四位。
(3)、LED灯的配合显示;
调试时观察,东西向和南北向的LED是否显示合理,若出现不该有的状态,则检查判断逻辑是否有误。
观察前,可将各个灯的点亮时间缩短,以节约观察时间,测试完毕修改回来即可。
(三)、增加人为应急控制后:
(1)、人为控制功能分析;
若人为地按下东西向恒通的按键key,则数码管停止倒计时,显示值锁定;若人为地按下南北向恒通的按键key1,则数码管停止倒计时,显示值锁定;key的优先级较key1高。
(2)、按键检测的中断或查询方式的实现与分析;
我们可以通过if—elseif-else;语句实现优先级,也可以通过中断的优先级来控制实现。
于此题看来中断程序似乎显得略微复杂,涉及到两个中断服务程序的编写,现举一例:
voidint0()interrupt0
{
TR0=0;//关闭计数器
green=1;//东西绿灯亮
red=0;
yellow=0;
red1=1;//南北红灯亮
green1=0;
yellow1=0;
key=1;//设置key为读入方式
while(key==0)
{;}
TR0=1;//打开计数器
}
这只是其中一个中断程序的书写,除此之外还要设置优先级,考虑中断嵌套的问题,不甚麻烦,采用if—elseif-else;语句可以直接确定优先级,代码和思路简单。
本次课设采用if语句实现。
(3)、最终的实现
最终实现程序和连线图见报告的源程序和电路原理图部分。
八、心得感悟
这次的单片机课设实际上是我们的理论课《单片机与嵌入式系统设计》的实际应用延伸。
通过这次课设,我们进一步地熟悉和掌握了AT89C51单片机的结构和工作原理,能够熟悉地根据单片机的接口特征编写相应的程序,从而达到测试控制的目的。
这次课程设计是一个完整的应用系统的开发过程,在课程设计的整个过程中,我们一步一个脚印,从提出设想到功能分析、再到过程设计、再到编码实现,再到最后整个解决方案的形成,大大增强了自己的系统设计能力。
我们这次的课程设计题目是《交通灯的设计》,基本功能就是让红绿黄三个灯循环定时亮灭从而控制交通。
通过我们努力,基本功能很快实现。
但是随之而来的种种问题,比如,如果道路是十字路口,东西南北向就都要红绿灯的控制;如果突发情况时,能够人为地干预交通灯的显示,从而疏导交通,等等问题让我们发现一个系统真正要应用到实际生活里是多么的不容易。
虽然在为期一天半的课设时间里,我们基本上解决了发现的上述问题,但还有很多的路要走。
九、参考文献
【1】张毅刚,彭喜元.单片机原理与应用设计.北京:
电子工业出版社.2008.4
【2】周兴华.手把手教你学单片机C程序设计.北京:
北京航空航天大学出版社.2007.10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 交通灯 课程设计 报告