交通灯方案设计书实验报告硬件原理图 程序.docx
- 文档编号:8156656
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:24
- 大小:418.58KB
交通灯方案设计书实验报告硬件原理图 程序.docx
《交通灯方案设计书实验报告硬件原理图 程序.docx》由会员分享,可在线阅读,更多相关《交通灯方案设计书实验报告硬件原理图 程序.docx(24页珍藏版)》请在冰豆网上搜索。
交通灯方案设计书实验报告硬件原理图程序
交通灯信号灯自动控制系统
交通灯原理图
一、系统的基本功能要求
(1)以秒为计时单位,两位数码管以十进制递减计数形式作定时显示,在递减计数回零瞬间完成换灯操作。
(2)通过键盘红黄绿三色信号灯所亮时间在0~99秒内任意设定。
(3)十字路口的通行起始状态可人工设定,运行中可通过人工干预使十字路口通行状态固定于任何一种工作模式。
二、设计思路及总体框图,方案比较
◆硬件设计
1.系统总体框图
2.电路设计
(1)显示模块
倒计时与时钟
说明:
⑴共阴极两位数码管用于倒计时;
段选端由锁存器控制,位选端用P3_0与P3_1控制
⑵两个四位共阴极数码组成八位数码管用于时钟显示
段位选分别由两个锁存器控制
(2)红绿灯模块
说明:
⑴图为两方向的红绿黄灯,分别接在P0口上,由P0口控制
⑵51系列单片机的P0口内部没有集成上拉电阻,加上拉就是提高
驱动能力,必须要通过上拉电阻接VCC。
上拉电阻一般接1K的。
(3)键盘模块
说明
⑴P2键控制功能说明:
P2^6key0绿灯位选择
P2^5key1黄灯位选择
P2^4key2加1操作
P2^3key3减1操作
P2^2key4信号灯状态固定
P2^1key5信号灯状态切换
P2^0key6时钟时分秒设置键
⑵键盘加上拉电阻为了提高驱动能力
3.复位电路:
4.时钟电路:
说明:
用12M晶振时电容要选择30p
◆软件部分
1、主程序流程图
2、时钟初值控制子程序
3、绿灯,黄灯初值设置子程序
4、时钟控制与倒计时控制
时钟,倒计时初值通过键盘输入。
倒计时使用52单片机
内部定时器1实现计数,时钟控制部分是使用定时、计数器2
实现计时,以秒为基本单位在数码管中显示。
时钟部分:
当秒的
个位计时到了10,则秒个位清0,同时十位进一,以此类推;倒
计时部分显示是则递减显示。
此过程通过判断语句实现。
5、.灯状态控制
灯的状态通过键盘扫描控制。
状态固定键按下时,关闭定
时器1;再次按下此键时,打开定时器。
状态选择键按下时,程
序跳至下一个状态的程序控制部分,从而实现状态改变。
三、实现功能说明
基本功能:
(1)AB干道分别有两组红黄绿灯,各自的亮灯时间与状态由键盘
控制。
(2)两位数码管用于倒计时,记录各个灯的亮灯时间,定时时间由
键盘设定。
(3)十字路口通行状态可由键盘切换。
发挥部分功能:
(1)由八位数码管显示,初试时间可由键盘设定,且在05:
00~23:
00黄灯闪烁显示。
(2)绿灯倒计时最后三秒和黄灯显示时闪烁显示(频率1HZ)。
(3)人行道的红绿灯配合车辆的红绿灯同时工作。
四、所用器件与功能
(1)共阴数码管10个:
8个显示时间,2个显示倒计时时间
(2)红黄绿发光二极管个4个:
模拟十字路口信号灯。
令各
加1个人行道上的红灯和绿灯
(3)74HC573锁存器2个:
段码和位选锁存各一个
(4)STC单片机一块按键8个12M晶振一个排线排针
电阻电容若干
五、故障及问题分析
(1)问题:
每次通电后都要在十八、十十九口触发一下才能正
常工作。
分析:
晶振电路与单片机距离过远,输入噪声很大
解决:
把晶振电路改在紧挨单片机位置就可排除干扰。
(2)共阳数码管需要接三极管放大驱动电流,为节约成本选用
共阴数码管。
(3)键盘扫描程序中加了按键前沿消抖延时,但按键不够灵敏
加了后延消抖后使得按键足够灵敏。
(4)在段锁存器给各个数码管送段码时相互之间有影响,在显
示函数中加消影程序解决相互之间的影响。
(5)在第一次焊接时一次性焊接完,调试时无法检查错误,而
在第二次焊接时采用边调试边焊接的方法,加快速度,提
高了准确度。
(6)杜邦线数码管、锁存器等接线比较多,用单根导线焊接
容易相互连接且不易检查错误,用杜邦线便于检查和模块
化调试。
六、心得体会
本次设计,我们花了不少时间和精力,但收获很大:
(1)这次设计时间很长,期间,我们自学了单片机教程,
keil2、proteus、protel99se等软件,自学能力达
到很大的提高
(2)本次设计过程中,我们充分体会到了团体合作的重要
性。
通过我们三个人的合理分工,设计过程完成的比
较成功
(3)通过本次设计,我们学到了对复杂程序模块化的编程
方法和对其进行检查与修改方法。
(4)本次设计过程中,我们的动手能力得到很大的提高,
例如说焊接技术、对电路板的总体规划,等等。
七、参考资料
<<单片机原理与应用及C51程序设计>>
清华大学大学出版社
附:
软件C程序
//********************实验板上完整程序
#include"reg52.h"
#defineuintunsignedint
#defineucharunsignedchar
ucharaa,bb,cc,dd,ee,ff,a1,a3,con32,con31。
uchartemp,ye,shi1,ge1,shi2,ge2,shi,ge,flag。
intb,c=0,d=0,m=1,t。
uintn1,n2。
sbitp0_3=P0^3。
//A干道黄灯
sbitp0_2=P0^2。
//A干道红灯
sbitp0_4=P0^4。
//A干道绿灯
sbitp0_6=P0^6。
//B干道黄灯
sbitp0_7=P0^7。
//B干道红灯
sbitp0_5=P0^5。
//B干道绿灯
sbitwela=P3^0。
sbitdula=P3^1。
sbitp3_2=P3^2。
sbitp3_3=P3^3。
uchardatatimedate1[3]={0x00,0x00,0x00}。
//显示缓冲区两位数字
uchardatatimedate2[3]={0x00,0x00,0x00}。
//显示缓冲区两位数字
uchardatatimedate3[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00}。
//显示缓冲区两位数字
charcodewei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}。
//位扫描
sbitkey0=P2^6。
//绿灯控制键
sbitkey1=P2^5。
//黄灯控制键
sbitkey2=P2^4。
//加一键
sbitkey3=P2^3。
//减一键
sbitkey4=P2^2。
//保存状态
sbitkey5=P2^1。
//状态改变
sbitkey6=P2^0。
//时钟控制键
uchardatacon3=0x00。
uchardatacon=0x00。
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40}。
voiddisplay(ucharshi,ucharge)。
voiddisplay3(ucharaa,ucharbb,ucharcc,uchardd,ucharee,ucharff)。
voiddelay(uintz)。
voidinit()。
keyscan1()。
keyscan2()。
keyscan3()。
voidmain()
{
init()。
//初始化子程序
while
(1)
{
//*************************键盘扫描控制程序
if(con==0&&ye==0)
keyscan3()。
display3(aa,bb,cc,dd,ee,ff)。
if(con3==0&&ye==0)//调用键盘扫描程序
{keyscan1()。
shi1=n1/10。
ge1=n1%10。
display(shi1,ge1)。
}
if(con==0&&con3==0)
{keyscan2()。
shi2=n2/10。
ge2=n2%10。
display(shi2,ge2)。
}
if((con>=3&&ye==0)||(ye>=3&&con==0))display(0,0)。
P0=0xff。
delay
(1)。
//***************************保存当前状态
if(key4==0)
{
delay(12)。
while(key4==0)。
delay(12)。
d++。
if(d%2)TR0=0。
//关闭计数器,下面elseif语句不执行,直接到delay()显示语句
elseTR0=1。
}
//****************************状态改变,进入下一个状态
if(key5==0)
{
delay(12)。
while(key5==0)。
delay(12)。
m++。
c++。
if(c%2)temp=n2。
elsetemp=n1。
}
//****************************状态选择
if(t<5||t>=23)
{
if(a1/10==0){p0_3=0。
p0_6=0。
}
else{p0_3=1。
p0_6=1。
}
delay
(1)。
}
else
{
if(m%4==1)
{p0_6=1。
p0_2=1。
if(temp>3)p0_4=0。
else{if(a1/10==0)p0_4=0。
elsep0_4=1。
}//A绿灯
p0_7=0。
//B红灯
delay
(1)。
}
elseif(m%4==2)
{p0_4=1。
if(a1/10==0)p0_3=0。
elsep0_3=1。
//A黄灯
p0_7=0。
//B红灯
delay
(1)。
}
elseif(m%4==3)
{p0_3=1。
p0_7=1。
p0_2=0。
//A红灯
if(temp>3)p0_5=0。
else{if(a1/10==0)p0_5=0。
elsep0_5=1。
}//B绿灯
delay
(1)。
}
elseif(m%4==0)
{p0_5=1。
p0_2=0。
//A红灯
if(a1/10==0)p0_6=0。
elsep0_6=1。
//B黄灯
delay
(1)。
}
}
//*****************************************倒计时
if(con>=3&&ye>=3)
{
TR0=1。
if(b!
=0)temp=n1。
//只有当扫描到有输入时temp才等于n,否则为自减后的值
shi=temp/10。
ge=temp%10。
if(a1==20)
{a1=0。
temp--。
if(temp==-1)
{c++。
//进入下一个状态,赋倒计时起始值
m++。
//进入下一个状态,赋灯的状态
if(c%2)temp=n2。
elsetemp=n1。
}
}
display(shi,ge)。
}
b=0。
}
}
voiddelay(uintz)
{
uintx,y。
for(x=z。
x>0。
x--)
for(y=110。
y>0。
y--)。
}
voiddisplay(ucharshi,ucharge)
{P1=0x00。
wela=0。
p3_2=1。
dula=1。
P1=table[shi]。
dula=0。
p3_3=0。
delay
(1)。
p3_3=1。
dula=1。
P1=table[ge]。
dula=0。
p3_2=0。
delay
(1)。
p3_2=1。
}
voiddisplay3(ucharaa,ucharbb,ucharcc,uchardd,ucharee,ucharff)
{p3_2=1。
p3_3=1。
P1=0xff。
wela=1。
P1=wei[7]。
wela=0。
P1=0x00。
dula=1。
P1=table[aa]。
dula=0。
delay
(1)。
dula=1。
P1=table[bb]。
dula=0。
P1=0xff。
wela=1。
P1=wei[6]。
wela=0。
delay
(1)。
dula=1。
P1=table[10]。
dula=0。
P1=0xff。
wela=1。
P1=wei[5]。
wela=0。
delay
(1)。
dula=1。
P1=table[cc]。
dula=0。
P1=0xff。
wela=1。
P1=wei[4]。
wela=0。
delay
(1)。
dula=1。
P1=table[dd]。
dula=0。
P1=0xff。
wela=1。
P1=wei[3]。
wela=0。
delay
(1)。
dula=1。
P1=table[10]。
dula=0。
P1=0xff。
wela=1。
P1=wei[2]。
wela=0。
delay
(1)。
dula=1。
P1=table[ee]。
dula=0。
P1=0xff。
wela=1。
P1=wei[1]。
wela=0。
delay
(1)。
dula=1。
P1=table[ff]。
dula=0。
P1=0xff。
wela=1。
P1=wei[0]。
wela=0。
delay
(1)。
}
voidinit()
{
wela=0。
dula=0。
TH1=(65536-50000)/256。
TL1=(65536-50000)%256。
TMOD=0x11。
EA=1。
ET1=1。
TR1=0。
TH0=(65536-50000)/256。
TL0=(65536-50000)%256。
ET0=1。
TR0=0。
}
//************************绿灯键盘扫描程序
keyscan1()
{
if(key0==0)
{
//b=0。
delay(12)。
while(key0==0)。
delay(12)。
con++。
//b++。
}
if(con!
=0)//con=1||2时的加一运算
if(key2==0)
{
delay(12)。
while(key2==0)。
delay(12)。
timedate1[con]++。
if(timedate1[con]>9)timedate1[con]=0。
shi1=timedate1[1]。
ge1=timedate1[2]。
display(shi1,ge1)。
n1=10*shi1+ge1。
}
if(con!
=0)//con=1||2时的减一运算
if(key3==0)
{
delay(12)。
while(key3==0)。
delay(12)。
timedate1[con]--。
if(timedate1[con]==255)timedate1[con]=9。
shi1=timedate1[1]。
ge1=timedate1[2]。
display(shi1,ge1)。
n1=10*shi1+ge1。
}
}
//*********************黄灯控制键扫描
keyscan2()
{
if(key1==0)
{
b=0。
delay(12)。
while(key1==0)。
delay(12)。
ye++。
b++。
}
if(ye!
=0)//con=1||2时的加一运算
if(key2==0)
{
delay(12)。
while(key2==0)。
delay(12)。
timedate2[ye]++。
if(timedate2[ye]>9)timedate2[ye]=0。
shi2=timedate2[1]。
ge2=timedate2[2]。
display(shi2,ge2)。
n2=10*shi2+ge2。
}
if(ye!
=0)//con=1||2时的减一运算
if(key3==0)
{
delay(12)。
while(key3==0)。
delay(12)。
timedate2[ye]--。
if(timedate2[ye]==255)timedate2[ye]=9。
shi2=timedate2[1]。
ge2=timedate2[2]。
display(shi2,ge2)。
n2=10*shi2+ge2。
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256。
TL0=(65536-50000)%256。
a1++。
}
//******************时钟控制键扫描程序
keyscan3()
{
if(key6==0)
{
delay(12)。
while(key6==0)。
delay(12)。
con3++。
TR1=0。
if(con3==5){TR0=1。
con3=0。
}
}
if(con3!
=0)//con=1||2时的加一运算
if(key2==0)
{
delay(12)。
while(key2==0)。
delay(12)。
timedate3[con3]++。
if(con3==1)con31=2。
elseif(con3==2)con31=9。
elseif(con3==3)con31=5。
elseif(con3==4)con31=9。
if(timedate3[con3]>con31)timedate3[con3]=0。
if(timedate3[1]==2&&timedate3[2]==4)
{timedate3[2]=0。
timedate3[1]=0。
}
}
if(con3!
=0)
if(key3==0)
{
delay(12)。
while(key3==0)。
delay(12)。
timedate3[con3]--。
}
if(con3==1)con32=2。
elseif(con3==2)con32=9。
elseif(con3==3)con32=5。
elseif(con3==4)con32=9。
if(timedate3[con3]==255)timedate3[con3]=con32。
if(timedate3[1]==2&&timedate3[2]==9)
timedate3[2]=3。
aa=timedate3[1]。
//小时的十是位
bb=timedate3[2]。
cc=timedate3[3]。
dd=timedate3[4]。
ee=timedate3[5]。
ff=timedate3[6]。
t=10*aa+bb。
}
voidtime_intt3(void)interrupt3
{
TH0=(65536-50000)/256。
TL0=(65536-50000)%256。
a3++。
if(a3==20)
{
a3=0。
timedate3[6]++。
if(timedate3[6]==10)
{timedate3[6]=0。
timedate3[5]++。
}
if(timedate3[5]==6)
{timedate3[5]=0。
timedate3[4]++。
}
if(timedate3[4]==10)
{timedate3[4]=0。
timedate3[3]++。
}
if(timedate3[3]==6)
{timedate3[3]=0。
timedate3[2]++。
}
if(timedate3[2]==10)
{timedate3[2]=0。
timedate3[1]++。
}
if(timedate3[1]==2&&timedate3[2]==4)
{timedate3[1]=0。
timedate3[2]=0。
}
aa=timedate3[1]。
bb=timedate3[2]。
cc=timedate3[3]。
dd=timedate3[4]。
ee=timedate3[5]。
ff=timedate3[6]。
t=10*aa+bb。
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交通灯方案设计书实验报告硬件原理图 程序 交通灯 方案设计 实验 报告 硬件 原理图