单片机proteus仿真设计交通灯汇编语言文档格式.docx
《单片机proteus仿真设计交通灯汇编语言文档格式.docx》由会员分享,可在线阅读,更多相关《单片机proteus仿真设计交通灯汇编语言文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
按照上述控制要求,用发光二极管代替交通灯,用PROTEUS绘制电路图,并仿真调试实现之。
2,发挥部分:
1.有倒计时时间显示。
2若交道口出现紧急情况,交警可将糸统设置成手动:
全路口车辆禁行、行人通行。
紧急情况结束后再转成自动状态。
3当有119、120等特种车辆通过时,糸统自动转为特种车放行,其它车辆禁止状态。
特种车辆通过15秒钟后,糸统自动恢复,用模型车演示。
4其它自选措施。
1.系统功能的确定
功能一:
可以实现红绿灯的转换以及控制路口的基本功能。
功能二:
有倒计时功能和最后十秒绿灯闪烁的功能。
功能三:
出现紧急情况时,可以警察手动控制特殊状态,并维持交通。
功能四:
119或120等特种车经过时,可转换成为特种车道行驶状态,并在情况消除后15秒,恢复原状。
2.方案论证
2.1方案一:
如下图所示,为proteus仿真图。
其中,P1,P0端口的8位分别来控制东西,南北方向的红绿灯。
且运用了4个74LS164的8位移位寄存器(串行输入,并行输出)来控制4个LED的数码显示,通过AT89C51单片机的P3.0,P3.1两个扩展端口来接4个并行连接的74LS164的DIN和CLK两个端口来显示倒计时的功能,这会产生乱码使得显示杂乱,而主程序以顺序执行为主,其中穿插着对P3.7的端口高低电平的测试和跳转语句来实现功能三,并且功能一、二在主程序中实现,没有功能四的的实现程序。
所以,该方案可行却不完善,故不选用。
2.2方案二:
其中,P0,P2端口的8位分别来控制东西,南北方向的红绿灯。
而P1端口的P1.0~P1.6来控制四个LED的码值显示,而P3.0~P3.3这四位用来片选这四个LED。
并且,依旧用P3.7高低电平来实现功能三的内容,并且考虑用P3.6的高低电平来实现功能四的内容。
程序依旧与方案一相似,却可以消除显示乱码,程序杂乱,不易读写。
所以,该方案可行却仍不完善,故不选用。
2.3方案三:
如下页所示仿真图。
其中,在方案二的基础上,将四个LED分开的显示器用两个一起的LED,并且运用动态扫描显示倒计时,而P0,P2端口的8位分别来控制东西,南北方向的红绿灯。
而P1端口的P1.0~P1.7来连接两个LED的数码管的A~F,DP这8个接口处。
P3.0,P3.1分别接每个LED的1,2接口处来控制数码管显示的高低位。
顺次执行的主程序采用中断程序来实现,用P3.2,P3.3的电位变化分别来实现功能三,四。
其中,这可以用跳变触发中断或电平触发中断来实现,主要是IT0,IT1置位就是跳变触发方式,置零就是电平触发方式。
这样,软硬件对于该实验所要求的功能的实现均较易实现,而且程序较易编写和读取。
所以,综上所述,最终选择方案三来进行实验。
3.系统硬件的设计
3.1主控制器的设计以及接口电路的设计(电路图及设计说明)
该电路图的proteus仿真图即和方案三的一致,正常运行时如下所示:
主要运用到的硬件是:
一块AT89C51单片机,两个两段共阴LED显示器,SW1,SW2两个双掷开关以及32个发光二极管。
其中,16个红色,16个绿色发光二极管,每两个为一组。
若P0端口得电压输出电流不足以驱动LED,就利用上拉电阻使LED能正常工作,但不需电阻亦可。
单片机晶振选用12MHz。
4.系统软件的设计
4.1程序的编写思想:
本次实验设计的程序主要包含:
主程序,两个中断程序,显示程序(显示程序里含延时1ms的程序)。
具体见以下叙述。
4.2主程序的设计
主程序中,是顺次执行,从SETBP3.7开始运行南北方向为主的两个60秒,接着CLRP3.7再运行东西方向为主的两个60秒,接着P3.7重新置位,再次循环。
流程图如下:
4.3两个中断程序的设计
两个中断程序分别靠双掷开关SW1和SW2控制高低电位而实现,中断程序START0和中断程序START1为了实现功能三和四。
4.4显示程序的设计
流程图如下所示:
该显示程序主要是为了实现倒计时的显示,先将存在SECOND内的数值从十六进制数转化为十进制,并存在DBUF,DBUF+1(即50H,51H)单元中,然后通过LEDMAP取出字形,并选通每个两段共阴LED的显示管的高,低位显示出来。
5.系统调试
5.1硬件调试
设计小程序让发光二极管导通,点亮二极管,并向两段共阴LED显示管赋值,观察是否显示,调试到所有硬件设备均可正常即可。
5.2软件调试
主要是编程,以下是实现本次实验功能的程序:
SECONDEQU30H
DBUFEQU50H
ORG0000H
LJMPSTART
ORG0003H
LJMPSTART0
ORG0013H
LJMPSTART1
START:
MOVR7,#5
MOVSP,#60H
SETBEA
SETBEX0
SETBEX1
SETBIT0
SETBIT1
MOVTCON,#00H
MOVTMOD,#01H
MOVTH0,#3CH
MOVTL0,#0B0H
CLRTF0
SETBTR0
MOVA,#0FFH
MOVP2,A
MOVP0,A
(以上程序主要是一些赋值程序,和定时器,中断等的开启,以及初始化红绿灯等)
;
************************************
LOOPM:
SETBP3.7
LJMPLOOP
LOOPK:
CLRP3.7
LOOP:
MOVR2,#20
MOVR3,#10
MOVSECOND,#60
JNBP3.7,LP1
LCALLSTATE1
LJMPZ1
LP1:
LCALLSTATE4
Z1:
LCALLDISPLAY
JNBTF0,Z1
DJNZR2,Z1
MOVR2,#20
DECSECOND
LCALLDISPLAY
DJNZR3,Z1
(以上程序主要是通过对P3.7电位的高低来选择红绿灯的状态,状态一和四的选择)
MOVR3,#40
MOVSECOND,#50
JNBP3.7,LP2
LCALLSTATE2
LJMPZ2
LP2:
LCALLSTATE5
Z2:
JNBTF0,Z2
DJNZR2,Z2
DECSECOND
DJNZR3,Z2
(以上程序主要是控制状态二和五的选择)
MOVR4,#1
MOVSECOND,#10
Z3:
JNBP3.7,LP3
LCALLSTATE2
LJMPMM1
LP3:
LCALLSTATE5
MM1:
NBTF0,Z3
JNBP3.7,SS1
MOVP2,#0BFH
LJMPSS2
SS1:
MOVP0,#0BFH
SS2:
DJNZR4,Z3
MOVR4,#1
DJNZR2,Z3
DJNZR3,Z3
(以上程序主要是控制状态二和五的转换选择,且绿灯闪烁)
MOVR3,#50
Z4:
JNBP3.7,LP4
LCALLSTATE3
LJMPMM2
LP4:
LCALLSTATE6
MM2:
JNBTF0,Z4
DJNZR2,Z4
DJNZR3,Z4
(以上程序主要是控制状态三和六的选择)
Z5:
JNBP3.7,LP5
LJMPMM3
LP5:
MM3:
JNBTF0,Z5
DJNZR4,Z5
MOVP1,#75H
JNBP3.7,SS3
MOVP2,#0EEH
MOVP0,#0AEH
LJMPSS4
SS3:
MOVP2,#0AEH
MOVP0,#0EEH
SS4:
DJNZR2,Z5
DJNZR3,Z5
JBP3.7,KK
LJMPLOOPM
KK:
LJMPLOOPK
(以上程序主要是控制状态三和六的选择,且绿灯闪烁,并长跳回去再循环开始)
START0:
ACALLDISPLAY
ACALLDISPLAY
JBP3.2,K0
PUSHACC
MOVA,P0
MOVA,P2
MOVP2,#0A9H
MOVP0,#0A9H
A0:
JBP3.2,A1
ACALLDISPLAY
LJMPA0
A1:
JNBP3.2,A0
POPACC
K0:
RETI
START1:
JBP3.3,K1
MOVA,R2
MOVA,R3
MOVA,SECOND
MOVP2,#56H
MOVP0,#56H
A2:
JBP3.3,A3
LJMPA2
A3:
JNBP3.3,A2
MOVR3,#15
MOVSECOND,#15
A4:
JNBTF0,A4
DJNZR2,A4
DJNZR3,A4
MOVSECOND,A
MOVR3,A
MOVR2,A
K1:
RETI
(以上两段程序主要实现了中断IT0和IT1)
STATE1:
MOVP2,#99H
MOVP0,#0AAH
RET
STATE2:
MOVP2,#95H
STATE3:
MOVP2,#66H
MOVP0,#0A6H
STATE4:
MOVP0,#99H
MOVP2,#0AAH
STATE5:
MOVP0,#95H
STATE6:
MOVP0,#66H
MOVP2,#0A6H
************************************
DISPLAY:
(以下是显示程序及结束)
MOVB,#10
DIVAB
MOVDBUF,A
MOVA,B
MOVDBUF+1,A
MOVR0,#DBUF
MOVR1,#DBUF+1
MOVDPTR,#LEDMAP
DP:
MOVA,@R0
MOVCA,@A+DPTR
MOVP1,A
CLRP3.0
ACALLDELAY
SETBP3.0
MOVA,@R1
CLRP3.1
SETBP3.1
DJNZR7,DP
RET
DELAY:
MOVR6,#01H
AA1:
MOVR5,#0FFH
AA:
DJNZR5,AA
DJNZR6,AA1
LEDMAP:
DB3FH,06H,5BH,4FH,66H,6DHDB7DH,07H,7FH,6FH,77H,7CHDB58H,5EH,7BH,71H,00H,40HEND
(以上是状态一至六的赋值程序)
5.3综合调试
将程序在MedWen上运行以后,将产生的hex格式的文件加载到proteus仿真图上的AT89C51单片机上进行仿真实验。
具体情况如下:
5.3.1正常运行的状态:
5.3.2实现功能三的状态:
5.3.3实现功能四的状态:
6.指标测试
通过5的调试和仿真以后,可以知道程序运行成功,效果不错。
7.总结成果
经过两三个星期的努力,翻阅大量的资料和编程调试,最终得到了自我比较满意的运行结果,可能程序和仿真还有些许瑕疵,但是得到了所要求的功能以及良好的显示效果,所以,实验是比较成功的。
这次的大工作量和编程的经历给了我很多的启示,有编程失败的沮丧和调试成功一霎那的欣喜若狂,在这次汗水和欣喜的夹杂背后,是我对单片机的另一个认识,编程是很重要的一方面,而仿真可以将自己的程序验证出来,并开始和逐步掌握了proteus这一仿真软件,收获颇丰。
8.参考文献
1.《MCS-51系列单片机系统及其应用(第二版)》蔡美琴,张为民等主编,2009.1
2.《单片机原理及应用实验指导书》浙江海洋学院机电工程学院,2008.12
3.《数字电子技术基础》清华大学电子学教研室编,阎石主编,2008.5
4.Baidu搜索“74LS164”寄存器的功能
5.中断程序设计
6.Baidu搜索“proteus”的使用以及仿真过程等