单片机课程设计交通灯.docx
- 文档编号:27231380
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:13
- 大小:80.64KB
单片机课程设计交通灯.docx
《单片机课程设计交通灯.docx》由会员分享,可在线阅读,更多相关《单片机课程设计交通灯.docx(13页珍藏版)》请在冰豆网上搜索。
单片机课程设计交通灯
单片机原理及应用系统设计报告
系统名称:
交通灯控制系统设计
班级:
计科1班
学号:
1245713131
姓名:
交通灯控制系统设计实验
一、实验设计目的
1.通过本次课程设计进一步熟悉和掌握单片机的结构及工作原理,巩固和加深“单片机原理与应用”课程的基本知识,掌握电子设计知识在实际中的简单应用。
2.综合运用“单片机原理与应用”课程和先修课程的理论及生产实际知识去分析和解决电子设计问题,进行电子设计的训练。
3.学习电子设计的一般方法,掌握AT89C51芯片以及简单电子设计过程和运行方式,培养正确的设计思想和分析问题、解决问题的能力,特别是总体设计能力。
4.通过计算和绘制原理图、布线图和流程图,学会运用标准、规范、手册、图册和查阅有关技术资料等,培养电子设计的基本技能。
5.通过完成一个包括电路设计和程序开发的完整过程,了解开发单片机应用系统全过程,为今后从事的工作打基础。
二、实验设计方案
交通灯工作方案:
道路交通信号灯是交通安全产品中的一种类别,是为了加强道路交通管理,减少交通事故的发生,提高道路使用效率,改善交通状况的一种重要工具。
单片机是微型计算机一个重要分支,具有体积小、价格低、指令系统简单、可靠性高工作范围广等特点,故本实验以AT89C51单片机为核心进行设计控制交通灯的工作。
东西、南北两干道交于一个十字路口,各干道有一组红、黄、绿三色的指示灯,指挥车辆和行人安全通行。
红灯亮禁止通行,绿灯亮允许通行。
黄灯亮提示人们注意红、绿灯的状态即将切换,且黄灯点亮时间为东西、南北两干道的公共停车时间。
(A代表东西路口方向,B代表南北路口方向,R代表红灯,Y代表黄灯,G代表绿灯)。
首先,东西向绿灯与南北向红灯亮5s。
接着,东西向绿灯灭,黄灯闪烁5次。
然后,东西向红灯与南北向绿灯亮5s。
最后,南北向绿灯灭,黄灯闪烁5次。
不停地循环,当遇到模拟的突发事故,外部中断0到来,东西向,南北向都只有红灯亮,并且蜂鸣器发出警报。
(数码管开始记录发生突发状况进行的时间,此功能在第二段代码中实现)。
1.指示灯亮的方案如下表:
A
B
R
Y
G
R
Y
G
灭
灭
亮
亮
灭
灭
灭
灭
闪
亮
灭
灭
灭
亮
灭
亮
灭
灭
亮
灭
灭
灭
灭
亮
亮
灭
灭
灭
灭
闪
亮
灭
灭
灭
亮
灭
1)正常情况下交通灯的流程图
2)紧急情况下交通灯的流程图
3)特殊情况增加功能
三、实验原理
图:
四、程序设计
代码部分1:
(此代码部分无数码管功能)
//功能:
交通信号灯
#include
#defineuintunsignedint
#defineucharunsignedchar
//MON51必须用到的
codeunsignedcharstop[3]_at_0x3b;
sbitRED_A=P0^2;//A组为东西向指示灯
sbitYELLOW_A=P0^0;
sbitGREEN_A=P0^1;
sbitRED_B=P0^6;//B组为南北向指示灯
sbitYELLOW_B=P0^4;
sbitGREEN_B=P0^5;
//sbitP3_4=P3^4;
sbitP3_2=P3^2;//用于外部中断0
sbitP1_7=P1^7;//蜂鸣器
ucharCOUNT=0;//软件计数器设置
ucharFLASH_COUNT=0;//刷新设置
ucharOPERATION_TYPE=1;//软件计数器设置
voiddelay(unsignedinti)//延时子程序
{
unsignedintj,k;
for(k=0;k
for(j=0;j<100;j++);
}
voidint1_int(void)interrupt0//0表示外部中断0,其中断优先级相对较高
{
unsignedchari,j,l,m,o,p;
i=P0;//保护现场,
j=OPERATION_TYPE;
l=TH0;
m=TL0;
o=COUNT;
p=FLASH_COUNT;
EX0=0;//禁止外部中断0中断
while(P3_2==0)
{
P1_7=1;
delay
(1);
P1_7=0;//声音响
delay
(1);
RED_A=0;YELLOW_A=1;GREEN_A=1;//东西方向指示灯只有红灯亮
RED_B=0;YELLOW_B=1;GREEN_B=1;//南北方向指示灯也只有红灯亮,模拟发生交通事故的场面
}
EX0=1;//允许外部中断0中断
P0=i;//恢复现场,
OPERATION_TYPE=j;
TH0=l;
TL0=m;
COUNT=o;
FLASH_COUNT=p;
}
voidT0INT()interrupt1//T0中断程序,它的中断优先级低于外部中断0.
{
TH0=(65536-50000)/256;//首先重新设置定时器的初值
TL0=(65536-50000)%256;
switch(OPERATION_TYPE){
case1:
//模式1,东西向绿灯与南北向红灯亮5s
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
if(++COUNT!
=100)return;//模式1未到5s,中断返回,因为计数值为50mm,所以要执行100次计数才能达到5s的效果
COUNT=0;//模式1已到5s,计数器清零,改变为第2种模式
OPERATION_TYPE=2;
break;
case2:
//模式2,东西向绿灯灭,黄灯闪烁5次。
if(++COUNT!
=8)return;//每次相隔400ms
COUNT=0;
YELLOW_A=!
YELLOW_A;
GREEN_A=1;
if(++FLASH_COUNT!
=10)return;//闪烁5次
FLASH_COUNT=0;//模式2已经闪烁了5次,FLASH_COUNT清0,改变为第三种模式
OPERATION_TYPE=3;
break;
case3:
//模式3,东西向红灯与南北向绿灯亮5s
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
if(++COUNT!
=100)return;//模式3未到5s,中断返回
COUNT=0;//模式3已到5s,计数器清零,改变为第4种模式
OPERATION_TYPE=4;
break;
case4:
//模式4,南北向绿灯灭,黄灯闪烁5次
if(++COUNT!
=8)return;//每次相隔400ms
COUNT=0;
YELLOW_B=!
YELLOW_B;
GREEN_B=1;
if(++FLASH_COUNT!
=10)return;//闪烁5次
FLASH_COUNT=0;//模式2已经闪烁了5次,FLASH_COUNT清0,改变为第1种模式
OPERATION_TYPE=1;
break;
}
}
voidmain(void)
{
TMOD=0x01;//定时器工作于方式1,是16位计数器,8位TL0和8位TH0构成16位定时器
TH0=(65536-50000)/256;//计数初值
TL0=(65536-50000)%256;//计数初值
EA=1;//开总中断
ET0=1;//开定时器0中断,中断允许寄存器IE中ET0:
定时器/计数器T0的溢出中断允许位,ET0=1:
允许T0溢出中断
TR0=1;//启动定时器0,TCON寄存器,控制寄存器,TR0:
定时器/计数器T0的运行控制位,TR0=1:
启动定时器,计数器工作。
EX0=1;//允许外部中断0中断,IE(中断允许寄存器)
while
(1);//等待中断产生
}
五、运行结果:
首先,东西向绿灯与南北向红灯亮5s。
接着,东西向绿灯灭,黄灯闪烁5次。
然后,东西向红灯与南北向绿灯亮5s。
最后,南北向绿灯灭,黄灯闪烁5次。
不停地循环,当外部中断0到来,东西向,南北向都只有红灯亮,并且蜂鸣器发出警报。
如果再加入一些程序,就能增加一些相应的功能。
增加使用引脚:
sbitP2_0=P2^0;
sbitP2_1=P2^1;
sbitP2_2=P2^2;
sbitP2_3=P2^3;
staticunsignedcharsecond,minute,hour;
unsignedinttcount;
unsignedcharm;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};//用于数码管显示,共阳极。
ucharCOUNT=0;
ucharFLASH_COUNT=0;
ucharOPERATION_TYPE=1;
voidDelayMS(uintxms){
uinti,j;
for(i=xms;i>0;i--){
for(j=110;j>0;j--);
}
}
voiddisplay()
{
P0=table[minute/10];
P2_0=0;
delay(5);
P2_0=1;
P0=(table[minute%10]&0x7f);
P2_1=0;
delay(5);
P2_1=1;
P0=table[second/10];
P2_2=0;
delay(5);
P2_2=1;
P0=table[second%10];
P2_3=0;
delay(5);
P2_3=1;
}
voidjishi(){
tcount++;
if(tcount==4000)
{tcount=0;
second++;
if(second==60)
{second=0;
minute++;
if(minute==60)
{minute=0;
hour++;
if(hour==24)
{hour=0;
}
}
}
}
}
将jishi();display();DelayMS(880);添加到上面的程序中便可实现计时。
六、本次实验所用到的知识点总结
本实验中用到的与中断有关的特殊功能寄存器有:
TCON---定时器控制寄存器:
D7
D6
D5
D4
D3
D2
D1
D0
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
TF1,TF0,IE1,IE0:
中断请求标志。
TR1,TR0:
启动定时计数器。
0启动。
1停止。
IT1,IT0:
触发方式选择。
0低电平。
1下降沿。
IE----中断允许控制寄存器:
0禁止1允许
D7
D6
D5
D4
D3
D2
D1
D0
EA
ES
ET1
EX1
ET0
EX0
实现两级控制注意:
复位时,禁止所有中断
IP----中断优先级控制寄存器:
0低级别1高级别
D7
D6
D5
D4
D3
D2
D1
D0
PS
PT1
PX1
PT0
PX0
每一中断源可编程为高优先级或低优先级中断,以实现二级嵌套。
默认的优先次序为:
INT0、C/T0、INT1、C/T1、串行口中断(依次从高到低)
SCON----及串行口控制寄存器:
串行中断请求标志
D7
D6
D5
D4
D3
D2
D1
D0
TI
RI
注意:
响应中断后,CPU并不清零中断标志位,必须软件清零。
TMOD:
定时器,计数器工作方式寄存器:
D7
D6
D5
D4
D3
D2
D1
D0
GATE
C/T
M1
M0
GATE
C/T
M1
M0
D7,D6,D5,D4:
T1控制
D3,D2,D1,D0:
T0控制
GATE—门控位
C/T—计数/定时选择
M1M0—工作方式选择
七、设计体会
本次实验我选择了交通信号灯的设计,该实验关键的地方在于程序的设计,在程序中对中断和延时的处理,对十字路口简单情况下的交通灯进行模拟控制。
在本次实验中,我主要的时间花在了摸索对中断,延时的合理使用。
通过平时上课学到的理论知识,不断地去加深理解,并将它们运用到实际的实验设计中,虽然也犯了一些错误,但经过去认真理解理论知识,最终还是解决了问题。
通过这次实验,我对平时上课所学的理论知识有了更深的理解,对一些平时掌握得不太好的知识点在实验的过程中得到了很好地巩固。
更重要的是,当我们将平时所学的那些我们所认为的枯燥的理论知识运用到实际中时,这些知识变得不再枯燥,无趣,反而变得有趣,好玩,因为它们实实在在得帮助我做出了一个实实在在存在着的东西,这比死记硬背令人乏味的理论知识好多了。
虽然做实验会遇到许多问题,但这些问题让我沉下心来仔细琢磨问题的源头,并寻找解决的方法,对我来说也是一种锻炼。
总的来说,这次实验让我收获很大,受益匪浅。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 交通灯