基于c语言单片机交通灯.docx
- 文档编号:8657045
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:19
- 大小:157.97KB
基于c语言单片机交通灯.docx
《基于c语言单片机交通灯.docx》由会员分享,可在线阅读,更多相关《基于c语言单片机交通灯.docx(19页珍藏版)》请在冰豆网上搜索。
基于c语言单片机交通灯
1设计课题设计要求及总体方案介绍
1.1设计课题任务
设计一个具有特定功能的十字路口交通灯。
该交通灯上电或按键复位后能自动显示系统提示符“d.1004-16”,进入准备工作状态。
按开始键则开始工作,按结束键则返回“d.1004-16”状态。
1.2功能要求说明
要求甲车道和乙车道两条交叉道路上的车辆交替运行,甲车道为主车道,每次通车时间为60秒,乙车道为次车道,每次通车时间为30秒,要求黄灯亮3秒,并且1秒闪烁一次。
有应急车辆出现时,红灯全亮,应急车辆通车时间10秒,同时禁止其他车辆通过。
1.3交通灯总体方案介绍及工作原理说明
1.3.1电源提供方案
为使模块稳定工作,须有可靠电源,采用单片机控制模块提供电源。
此方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。
1.3.2复位方案
复位方式有两种:
按键复位与软件复位。
由考虑到程序的简洁,避免冗长,本设计采用按键复位,在芯片的复位端口外接复位电路,通过按键对单片机输入一个高电平脉冲,达到复位的目的。
1.3.3输入方案
直接在IO口线上接上按键开关。
因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用2个按键,分别是K1、K2。
由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O口就可实现,且本身的计数器及RAM已经够用
1.3.4显示界面方案
该系统要求完成倒计时、状态灯等功能。
采用数码管与点阵LED(点阵式和8段式LED)相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。
这种方案既满足系统功能要求,又减少了系统实现的复杂度。
权衡利弊,第三种方案可互补一二方案的优缺,我们决定采用方案三以实现系统的显示功能。
2交通灯硬件系统的设计
2.1交通灯硬件系统各模块功能简要介绍
2.1.1设计方框图
图2-1
2.1.2复位电路模块
复位方式有多种,本设计采用按键复位,在设定的定时时间内,89S52必须在RST引脚产生一个由高到低的电平变化,以清内部定时器。
2.1.3晶振电路模块
选取原则:
传统做法,但能够实现所需,即最简单也最是实用。
电容选取33pF,晶振为12MHz。
2.1.4流水灯电路模块
流水灯电路直接接在单片机的P2口上,采用共阳接法。
2.1.5数码管电路模块
数码管的段控口接在单片机的P0口上,位控通过三极管接在单片机的P2口上。
2.1.6按键电路模块
按键电路的设计就是在一段共接地,另一端通过上拉电阻接到P1口有按键时。
相应的口就会变成低电平,产生一个下降沿。
2.1.7下载口电路
下载口的1脚接在P1.5口,2脚悬空,3脚接在单片机的复位口上,4脚接在P1.6口,5叫接在P1.7口,6、7、8、9、10接地。
2.2交通灯电路原理图、PCB图、元器件分布图
电路原理图见附录1
PCB顶层图见附录2
PCB底层图见附录3
元器件布局图见附录4
2.3交通灯元器件清单
元器件清单见附录5
3交通灯软件系统的设计
3.1单片机资源使用情况
AT89S52的P3口用来接八个发光二极管的阴极,控制其亮与灭,P0口和P2口外接由8个LED数码管构成的显示器,用P0口作LED的段码输出口(P0.0~P0.7对应于LED的a~dp),P2口作LED的位控输出线,P2口外接3个按键A、B、C(分别对应于P1.0、P1.1、P1.2)用于调整显示接口电路。
3.2软件各模块简要介绍
软件设计是由C语言来编写的,由主程序、键处理和键扫描程序、显示程序、延时程序这几个模块组成的。
3.2.1主程序
主程序中会一直调用显示程序、键扫描程序,延时程序,当没有键按下时,数码管会一直显示P.,当有按键按下时,就会按操作执行。
3.2.2显示程序
显示程序主要完成数码管动态显示。
3.2.3键处理和键扫描程序
键处理程序主要将P1口的取值送往单片机进行取反。
键扫描主要判断是否有键按下,即过度前沿抖动在判断是否有键按下。
最终将处理完的键值作为返回值返回。
3.2.4延时程序
延时程序主要是用来倒计时用的,用来计算秒数。
3.3交通灯程序流程图
3.3.1主程序流程框图
主程序流程图如图3-1所示
图3-1
紧急情况时的中断服务程序(外中断0)
中断响应
返回
恢复现场
延时10S
A红灯、B红灯
保护现场
图3-2
3.3.2显示子程序流程框图
显示子程序框图如图3-3所示
图3-3
3.3.3键扫子程序流程框图
键扫子程序流程框图如图3-4所示
图3-4
3.4交通灯设计程序清单
程序清单见附录6
4交通灯设计结论
4.1使用说明
通电后,数码管会显示d.1004-16,按下S2键后,交通灯开始进入运行状态。
运行时按S1复位,如果按下S2键,主车道绿灯亮60秒,次车道红灯亮60秒,随后主车道黄灯亮2秒,闪3下,然后主车道红灯亮30秒,次车道绿灯亮30秒,紧接着次车道黄灯亮2秒闪三下,一直循环,如果按下S3则回到初始值P.为紧急情况使用;再按S2键主次车道红灯都亮10秒。
4.2系统调试
单片机AT89S52是系统的核心,利用万用表检测单片机电源VCC是否为(40脚)+5V、晶振是否正常工作(可视波器调试,也可用万用表检测,亮引脚电压一般为1.8~2.3V之间)、复位引脚RST(复位时为高电平,单片机工作时为低电平)、EA是否为+5V(高电平),单片机能工作了,再结合电路图,检测故障就容易了。
4.3交通灯运行图
交通灯运行实拍图见附录
4.4设计体会
本次设计中,因为本人单片机基础学到不少很好,所以费了很大的时间,在硬件方面,一直都不是很顺利,出现虚焊的情况很多,在检查板子的时候由于焊孔太多遇到很大的困难,甚至想放弃,但最后还是坚持下来了,软件设计方面,也不是很会,通过别人的一些帮忙,使我完成了这次的设计,真的很不容易。
结束语
通过这学期单片机的学习,本人喜欢上了在软件上的编程,虽然学的不是很好,但本人会不断努力,在学习编程技能,为以后进去手机开发设计方面打好基础,本人已经喜欢上了这个行业,相信能在以后有一番作为。
致谢
感谢王老师这个学期对我们单片机这门课程学习的严格要求,让我们学到了很多,不尽在学习上,还是做人方面,都起到很大的作用,还要感谢在学习中帮助我的同学,在没有老师的情况下解决了我的疑惑,真的很谢谢你们。
参考文献
[1].李朝青.单片机原理及接口技术(第3版).2005年10月
LiZhaoqing.TheSCMtheoryandInterfaceTechnology(ThirdEdition).2005yearinOctober
[2].蔡朝洋.单片机控制实习与专题制作
CaiZhaoyangSCMcontrolpracticeandspecialtopicproduction
[3].楼然苗.单片机课程设计指导
buildingandseedlings.SCMcurriculumdesignguidance
ZhaoGuanglin
[4].赵广林.电路设计与制版
circuitdesignandplatemaking.
附录2:
PCB顶层图
附录3:
PCB底层图
附录4:
元器件分布图
附录5:
元器件清单
名称
数量
参数
电阻
3个
1KΩ
数码管
2个
4位一体
电阻
1个
200Ω
下载口
1个
普通插座
1个
40PIN
电阻
24个
470Ω
按键
9个
三极管
9个
PNP
USB供电线
1根
晶振
1个
12MHz
电容
2个
22pF
极性电容
1个
220μF
芯片
1块
AT89S52
发光二极管
9个
六角开关
1个
表2元件清单
附录6:
程序清单
//名称:
十字路口交通灯控制
//作者:
//时间:
2013年5月28日
//设计要求:
上电或按键复位后能自动显示系统提示符“d.1004-16”,进入准备工作状态。
按开始键则开始工作,按结束键则返回“P.”状态。
要求甲车道和乙车道两条交叉道路上的车辆交替运行,甲车道为主车道,每次通车时间为60秒,乙车道为次车道,每次通车时间为30秒,要求黄灯亮3秒,并且1秒闪烁一次。
有应急车辆出现时,红灯全亮,应急车辆通车时间10秒,同时禁止其他车辆通过。
/********************************************************/
#include
#include
charcodedis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c,0xff};
chartime;
charv;
charflag=0;
/*显示缓冲数组(存放显示信息的字型码的序号)*/
charfind_code[8];
/********************************************************/
//函数名:
voidDelayX1ms(uintcount)
//功能:
延时时间为1ms
//调用函数:
//输入参数:
count,1ms计数
//输出参数:
//说明:
总共延时时间为1ms乘以count,crystal=12Mhz
/********************************************************/
#defineucharunsignedchar
#defineuintunsignedint
voidDelayX1ms(uintcount)
{
uintj;
while(count--!
=0)
{
for(j=0;j<80;j++);
}
}
/*显示函数*/
voiddisp()
{
chari,j=0xEF;
chark;
for(i=0;i<8;i++)
{
P2=j;
k=find_code[i];
P0=dis_code[k];
DelayX1ms
(1);
j=_crol_(j,1);
}
}
/************************************************************************
*函数原型:
keychuli();
*功能:
处理与键盘相连的P1口的内容,作为键值。
************************************************************************/
ucharkeychuli()
{
uchark;
k=P1;//P1口内容送K
k=~k;//取反
return(k);//返回键值
}
/************************************************************************
*函数原型:
key();
*功能:
键盘扫描函数,函数返回值即键值。
************************************************************************/
ucharkey()
{
ucharkeyzhi,keyzhii;//键盘按键键值临时存放
keyzhi=keychuli();//调P1口处理函数
if(keyzhi!
=0)//有键动作延时去抖动,否则函数返回
{
disp();
disp();
keyzhi=keychuli();//再次调P1口处理函数
if(keyzhi!
=0)//真正有键按下,取键值并暂存
{
keyzhii=keyzhi;
while(keyzhi!
=0&&TF0)//判按键是否释放,没有释放延时去抖动等待释放
{
disp();
disp();
keyzhi=keychuli();
}
keyzhi=keyzhii;//按键释放后恢复按键键值
}
}
return(keyzhi);//返回按键键值
}
voiddelay1s()
{
TMOD=0x01;//定时器0,工作方式1
TH0=0x3c;
TL0=0xb0;//50ms中断一次
EA=1;
ET0=1;
TR0=1;
do
{disp();
v=key();
}
while(time!
=20&&v!
=2);
TR0=0;
time=0;
}
voidINTT0()interrupt1
{
TH0=0x3c;
TL0=0xb0;
time++;
}
voiddelay()
{
TMOD=0x01;//定时器0,工作方式1
TH0=0x3c;
TL0=0xb0;//50ms中断一次
EA=1;
ET0=1;
TR0=1;
do
{disp();
v=key();
}
while(time!
=10&&v!
=2);
TR0=0;
time=0;
}
voidINTT1()interrupt2
{
flag=1;
}
voidjinji()
{
intb;
for(b=10;b>=0&&v!
=2;b--)
{
P3=0X6F;
find_code[6]=b%10;
find_code[7]=b/10;
find_code[2]=b%10;
find_code[3]=b/10;
delay1s();
flag=0;
}
}
voidmain()
{
while
(1)
{
find_code[0]=11;
find_code[1]=11;
find_code[2]=11;
find_code[3]=11;
find_code[4]=11;
find_code[5]=11;
find_code[6]=11;
find_code[7]=10;
disp();
EA=1;EX1=1;IT1=1;
v=key();
switch(v)
{
case0:
disp();break;
case1:
while(v!
=2)
{intm,n=60,t=30,a=4;
find_code[7]=11;
for(m=60;m>=0&&v!
=2;m--)
{
P3=0xAF;
find_code[6]=m%10;
find_code[7]=m/10;
find_code[2]=n%10;
find_code[3]=n/10;
delay1s();
n--;
if(flag==1&&v!
=2)
jinji();
}
for(m=0;m<2&&v!
=2;m++)
{
P3=0XCF;
find_code[6]=a%10;
find_code[7]=a/10;
find_code[2]=n%10;
find_code[3]=n/10;
delay1s();
n--;
a--;
if(flag==1&&v!
=2)
jinji();
}
for(m=0;m<3&&v!
=2;m++)
{
find_code[2]=n%10;
find_code[3]=n/10;
find_code[6]=a%10;
find_code[7]=a/10;
if(flag==1&&v!
=2)
jinji();
P3=0XEF;
delay();
if(flag==1&&v!
=2)
jinji();
P3=0XCF;
delay();
a--;
n--;
}
a=4;
for(m=30;m>=0&&v!
=2;m--)
{
P3=0X7D;
find_code[6]=m%10;
find_code[7]=m/10;
find_code[2]=t%10;
find_code[3]=t/10;
delay1s();
t--;
if(flag==1&&v!
=2)
jinji();
}
for(m=0;m<2&&v!
=2;m++)
{
P3=0X7E;
find_code[6]=a%10;
find_code[7]=a/10;
find_code[2]=t%10;
find_code[3]=t/10;
delay1s();
t--;
a--;
if(flag==1&&v!
=2)
jinji();
}
for(m=0;m<3&&v!
=2;m++)
{
find_code[2]=t%10;
find_code[3]=t/10;
find_code[6]=a%10;
find_code[7]=a/10;
if(flag==1&&v!
=2)
jinji();
P3=0X7F;
delay();
if(flag==1&&v!
=2)
jinji();
P3=0X7E;
delay();
t--;
a--;
}
}P3=0xFF;
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 语言 单片机 交通灯
![提示](https://static.bdocx.com/images/bang_tan.gif)