单片机交通灯设计报告Word格式.docx
《单片机交通灯设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《单片机交通灯设计报告Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
年月日
系(部)主管领导意见
目录
1设计任务和性能指标1
1.1设计任务1
1.2性能指标1
2设计方案2
2.1任务分析2
2.2方案设计2
3系统硬件设计3
3.1单片机的最小系统3
3.2数码管显示时间电路设计4
3.3信号灯控制电路设计5
4系统软件设计5
4.1主程序设计5
5调试及性能分析6
5.1调试分析6
5.2软件调试7
5.3系统功能调试8
6心得体会9
参考文献10
附录1系统仿真图11
附录2程序清单12
1设计任务和性能指标
1.1设计任务
利用单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。
用红、绿、黄发光二极管作信号灯。
如图上图所示。
设东西向为主干道,南北为支干道。
1.2性能指标
(1)处于常允许通行的状态,支干道有车来时才允许通行。
主干道亮绿灯时,支干道亮红灯;
支干道亮绿灯时,主干道亮红灯。
(2)干道均有车时,两者交替允许通行,主干道每次放行40秒,支干道每次放行30秒,设立40秒、30秒计时、显示电路。
(3)绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡。
黄灯亮时,原红灯按1Hz的频率闪烁。
(4)支干道通行时间及黄灯亮的时间均可在0~99秒内任意设置。
2设计方案
2.1任务分析
模拟交通灯控制器就是使用单片机来控制一些LED和数码管,模拟真实交通灯的功能。
红、黄、绿交替闪亮,利用数码管倒计数显示间隔等,用于管理十字路口的车辆及行人交通,计时牌显示路口通行转换剩余时间等
2.2方案设计
根据设计的要求可知,系统的硬件原理框图如下图所示。
系统硬件框图
单片机可选用AT89C51,它与8051系列单片机全兼容,但其内部带有4KB的FLASHROM,设计时无需外接程序存储器,为设计和调试带来极大的方便。
南北向和东西向各采用2个数码管计时,同时需要对该方向的指示灯的点亮时间进行倒计时。
键盘系统可以根据系统的需要设置不同的键的个数,可以选择线式键盘或矩阵式键盘,若单片机的IO口不够用时,可以考虑扩展8255或8155满足系统的要求。
2.软件方案
根据设计要求,程序框图如图1所示。
软件可由汇编语言完成,也可由C语言完成。
软件设计可以分为以下几个功能模块:
主程序:
初始化及键盘监控。
计时程序模块:
为定时器的中断服务子程序,完成0.1秒(或其他时间)和1秒的时间定时。
显示程序模块:
完成60个发光二极管(实际上只需驱动30个)和8个LED数码管的显示驱动。
程序流程图
3系统硬件设计
3.1单片机的最小系统
ATMEL公司生产的AT89C52单片机它是硬件电路的核心部分,时钟电路晶振使用12MHz,复位电路采取按键复位方式。
具体连接图3.1
3.3数码管显示电路
显示电路采用8个共阴数码管,P0口作为数码管的输入,P2.1、P2.2、P2.5、P2.6分别作为东西南北四路数码管的位选端。
数码管显示电路
3.4信号灯控制电路
由P1口输出个灯的状态。
4系统软件设计
原程序
1、交通灯C语言程序
功能:
第一个状态:
主干道、支干道均亮红灯5S
第二个状态:
主干道亮绿灯35S、支干道亮红灯
第三个状态:
主干道绿灯闪3次转亮黄灯、支干道亮红灯S5
第四个状态:
主干道亮红灯、支干道亮绿灯20S
第五个状态:
主干道亮红灯、支干道绿灯闪3次转亮黄灯5S
返回到第二个状态
/****************************************************************#include<
reg51.h>
/*对单片机的口进行了定义********/
#defineucharunsignedchar/*定义字符串类型为无符号型*/
ucharcodea[10]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,0x80,0x90};
/*段码组合,P0口,低有效*/
ucharcodeb[4]={0x01,0x02,0x04,0x08};
/****P2口,低有效*/
ucharcodec[5]={0x09,0x13,0x24,0x32,0x21};
/****P0口.低有效*/
charSN=40,WE=35;
/*SN表示南北方向--主干道,WE表示东西方向--支干道*/
charSN_G=35,WE_G=20,Y=5;
/*SN_G表示南北方向的绿灯,WE_G表示东西方向的绿灯,Y表示黄灯*/
uchari,k=0,count=0,J;
/*定义无符号字符串变量*/
voiddelay(uchart);
/*定义函数*/
voidlight();
/*定义函数*/
voidled();
voidledthrough();
voidleddrive();
sbitK0=P3^7;
/*开关K0接P3^7管脚*/
sbitK1=P3^6;
/*开关K1接P3^6管脚*/
sbitK2=P3^3;
/*开关K2接P3^3管脚*/
sbitK3=P3^5;
/*开关K3接P3^5管脚*/
sbitK4=P3^2;
/*开关K4接P3^2管脚*/
/*程序初始化*/
voidinit(void)
{
/*12MHz*/
TMOD=0x01;
/**计数器用模式1,为16位计数器*****/
TH1=(65536-50000)/256;
/*0x3C*/
TL1=(65536-50000)%256;
/*0xB0*//*计50000个数,用时50ms*/
IT0=1;
/*外部中断为低电平触发方式*/
ET0=1;
/*允许T0中断*/
TR0=1;
/*启动计数器*/
EA=1;
/*CPU开放总中断*/
EX0=1;
/*允许外部中断0中断,即允许响应端口P3^2(K4)中断*/
EX1=1;
/*允许外部中断1中断,即允许响应端口P3^3(K2)中断*/
}
/*中断0处理程序*/
voidint0(void)interrupt0
EA=0;
/*CPU禁止响应一切中断*/
P1=0x21;
/*东西南北方向均红灯亮*/
TR0=!
TR0;
/*计数器停止工作*/
for(;
;
)/*无条件循环*/
{
ledthrough();
/*调用通行时间显示函数*/
/*设置南北方向通行时间*/
if(K0==0)/*P3^7=0*/
{
delay(10);
/*延时,把抖动的时间抛掉*/
if(K0==0)
{
while(!
K0)/*当松开K0开关时,跳出循环,执行后面的程序*/
}
SN_G++;
/*南北方向绿灯时间+1*/
if((SN_G+Y)==100)/*南北方向通行时间(绿灯加黄灯时间)为100s*/
SN_G=1;
/*由于使用的是两位数码管,当南北方向通行时间加到100后绿灯时间归1*/
/*设置东西方向通行时间*/
if(K1==0)/*P3^6=0*/
if(K1==0)
K1)/*当松开K1开关时,跳出循环,执行后面的程序*/
/*调用通行时间显示函数*/
WE_G++;
/*东西方向绿灯时间+1*/
if((WE_G+Y)==100)/*东西方向通行时间(绿灯加黄灯时间)为100s*/
WE_G=1;
/*由于使用的是两位数码管,当东西方向通行时间加到100后绿灯时间归1*/
}}
/*返回*/
if(K3==0)/*P3^5=0*/
if(K3==0)
K3)/*当松开K3开关时,跳出循环,执行后面的程序*/
TR0=!
/*启动计数器*/
/*CPU开放总中断*/
break;
/*跳出*/
}
/*中断1处理程序*/
voidint1(void)interrupt2
SN=15;
WE=15;
led();
k=4;
light();
/*键盘程序*/
voidkey()
/*南北有车而东西无车*/
if(K0==0)/*K0=0*/
if(K0==0)
/*调用交通灯函数*/
/*调用数码管函数*/
count=0;
/*清零*/
k=0;
/*南北方向通车,东西方向不通车*/
SN=SN_G-25,WE=SN_G+Y-25;
/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
/*南北无车而东西有车*/
if(K1==0)/*K1=0*/
led();
k=2;
/*南北方向不通车,东西方向通车*/
SN=WE_G+Y-10,WE=WE_G-10;
/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/
/*定时函数0*/
voidtime0(void)interrupt1
TH1=0x3c;
TL1=0xb0;
/*计50000个数,用时50ms*/
count++;
/*自增运算*/
if(count>
=20)/*当count大于或等于20时,历时1s,执行程序*/
SN--;
/*自减运算*/
WE--;
if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/
k++;
/*自增运算*/
if(k>
3)/*当k>
3时,执行程序*/
switch(k)/*switch语句*/
case0:
SN=SN_G,WE=SN_G+Y;
break;
case1:
SN=Y,WE=Y;
/*东西南北方向显示时间均为黄灯闪亮时间*/
case2:
SN=WE_G+Y,WE=WE_G;
case3:
/*延时t毫秒*/
voiddelay(uchart)
uchari;
/*定义无符号字符常量*/
for(t;
t>
0;
t--)/*执行t次循环*/
for(i=2000;
i>
i--)/*由于时钟脉冲是12MHz,执行2000次循环的时间为1ms*/
}
/*交通灯函数*/
voidlight()
P1=c[k];
/*交通灯对应着k的值变化*/
if(P1==c[1]&
&
count==0)/*当南北方向亮黄灯且count=0时,执行程序*/
/*延时50ms*/
P1=0x13;
/*南北方向黄灯熄灭,东西方向亮红灯*/
else
if(P1==c[3]&
count==0)/*当东西方向亮黄灯且count=0时,执行程序*/
TH1=(65536-500000)/256;
TL1=(65536-500000)%256;
/*延时50ms*/
P1=0x32;
/*南北方向亮红灯,东西方向黄灯熄灭*/
/*数码管函数*/
voidled()
P2=b[0],P0=a[SN%10];
/*显示南北方向个位*/
delay(5);
/*延时*/
P2=b[1],P0=a[SN/10];
/*显示南北方向十位*/
delay(5);
P2=b[2],P0=a[WE%10];
/*显示东西方向个位*/
P2=b[3],P0=a[WE/10];
/*显示东西方向十位*/
/*延时*/
/*通行时间显示函数*/
voidledthrough()
P2=b[0],P0=a[(SN_G+Y)%10];
/*南北方向数码管显示可通行时间的个位*/
P2=b[1],P0=a[(SN_G+Y)/10];
/*南北方向数码管显示可通行时间的十位*/
P2=b[2],P0=a[(WE_G+Y)%10];
/*东西方向数码管显示可通行时间的个位*/
P2=b[3],P0=a[(WE_G+Y)/10];
/*东西方向数码管显示可通行时间的十位*/
/*数码管驱动函数*/
voidleddrive()
P2=b[0];
P2=b[1];
P2=b[2];
P2=b[3];
/*主函数*/
voidmain(void)
init();
/*调用程序初始化函数*/
for(;
key();
/*调用键盘程序*/
/*调用数码管函数*/
主程序设计
系统程序流程图系统仿真图
5调试及性能分析
1软件调试
软件调试主要是利用proteus仿真软件完成电路的搭建,运行以发现设计中的错误及时改正。
2系统功能调试
通过软件仿真显示,系统基本能完成要求,由于设计思路出现问题,键盘没有正确的做出来,没有键盘电路,紧急情况也可以通过一个按钮来采取相关的动作。
6心得体会
这次课程设计让我认识到学的知识在现实中是很有用的;
由于这两周有几个很重要的考试,所以在课程设计上话的时间不够,再加上混遍学的不怎么样只能用c语言写程序了.(程序只是更改了一下网上下的,有点惭愧呀,虽然我正在学java…
这此课程设计更加坚定了我学编程的信念,我相信自己一定可以学好它!
参考文献
[1]徐维祥.单片微型机原理及应用大连理工大学出版社,2006.12
[2]胡汉才.单片机原理与接口技术[M].北京:
清华大学大学出版社,2004.1-505.
[3]闫胜利.AltiumDesigner6.X中文版使用教程 电子工业出版社 2007.6
[4] 李朝青.单片机原理及接口技术(简明修订版).杭州:
北京航空航天大学出版社,1998
[5] 李广弟.单片机基础[M].北京:
北京航空航天大学出版社,1994
[6] 阎石.数字电子技术基础(第三版).北京:
高等教育出版社,1989
[7] 廖常初.现场总线概述[J].电工技术,1999.
[8]曾屹.单片机原理与应用.中南大学出版社,2009