求基于单片机芯片设计的交通灯电路图及程序?
答案:3 悬赏:60
解决时间 2021-11-17 11:47
- 提问者网友:我是女神我骄傲
- 2021-11-16 16:29
求基于单片机芯片设计的交通灯电路图及程序?
最佳答案
- 二级知识专家网友:毛毛
- 2021-11-16 17:27
MOV A, #01111111B
main: mov p1, A
MOV P3, A
RR A
MOV R0, #10
lcall ccc
ljmp main
;延时20s
ccc: mov r1, #200
bbb: mov r2, #250
aaa: djnz r2, aaa
djnz r1, bbb
djnz r0, ccc
ret
main: mov p1, A
MOV P3, A
RR A
MOV R0, #10
lcall ccc
ljmp main
;延时20s
ccc: mov r1, #200
bbb: mov r2, #250
aaa: djnz r2, aaa
djnz r1, bbb
djnz r0, ccc
ret
全部回答
- 1楼网友:山君与见山
- 2021-11-16 18:25
MOV A, #01111111B
main: mov p1, A
MOV P3, A
RR A
MOV R0, #10
lcall ccc
ljmp main
;延时20s
ccc: mov r1, #200
bbb: mov r2, #250
aaa: djnz r2, aaa
djnz r1, bbb
djnz r0, ccc
- 2楼网友:洎扰庸人
- 2021-11-16 17:43
课程设计题目及要求:
1.设计题目
交通信号灯控制系统
2.设计基本要求
· 采用89C52单片机芯片控制交通信号灯。
· 以南北方向的交通灯为例,结合实际情况,控制红、黄、绿交通灯。
· 红、黄、绿交通灯的亮和灭的时间可以调节。
3.设计提高要求
· 采用数码管显示红或绿交通灯的剩余时间。
· 通过按键或拔动开关设定红或绿交通灯亮一次的时间。
· 控制东西方向和南北方向的红、黄、绿交通灯的亮与灭。
· 控制键的原理图和接线图用Protel99绘图软件绘制。
单元电路设计
(一) 振荡电路
由于单片机需要高稳定,高频率的实基脉冲,因此需要晶体振荡器。89C51在XTAL1, XTAL2两管脚接晶体振荡器。在晶体振荡器的两端并联两个电容C1,C2参数为30pF,对振荡器频率有微调作用,振荡范围为1.2MHz — 12MHz。
(二) 复位电路
紧急情况与复位按钮
(三) 共阴极LED显示
主芯片的P1端口接了8个发光二极管,这些发光二极管的负极接到P1端口各引脚,而正极则通过一个排电阻接到正电源端,这样,这些发光二极管亮的条件就U1的P1口相引的引脚为低电平,即如果P1口某引脚输出为0,相应的灯亮,如果输出为1,相应的灯灭。
例:MOV P1,#0FH
该行程序将使发光二极管L1-L4熄灭,而L5-L8点亮。
(四) 数码显示电路
U1的P0口和P2口的部份引脚构成了6位LED数码管驱动电路,这里LED数码管采用了共阳型,共阳型数码管的笔段引脚是二极管的负极,所有二极管的正极连在一起,构成公共端,即片选端,对于这种数码管的驱动,要求在片选端提供电流,为此,使用了PNP型三极管作为片选端的驱动,共使用5只三极管,所有三极管的发射极连在一起,接到正电源端,它们的基极则分别连到P2.0?P2.4,这样,当P2.0?P2.4中某引脚输出是高电平时,三极管不导通,不能给相应位的数码管供电,该位数码管的所有笔段都不亮,反之,如果某引脚是低电平时,三极管导通,可以给相应的数码管供电,该位数码管是否点亮,点亮哪些笔段,取决于这些笔段引脚是高或低电平。
所有5位数码管的笔段连在一起,通过限流电阻后接到P0口,因此,究竟哪些笔段亮,取决于P0口的8根线是输出高电平还是低电平。注意,为了简化线路板设计,减少跳线,P0口与笔段的连接并不“规矩”,即不是从最高位到最低位依次连接,具体的连接方法可以参考电路图,这是单片机开发中常用的以“软”代“硬”的例子。
测试
如果灯不亮,说明硬件电路工作不正常,大体有这样的几种情况:
1、振荡电路未起振有条件可以用示波器观察89C51的18脚的波形以确定是否起振,如果没有示波器可以用万用表分别测18脚和19脚的对地电压,如果两者的电压差在2V左右,说明振荡正常,否则是未起振,检测电容C1、C2和晶振是否损坏,安装是否正确。
2、复位电路未能正确工作使用万用表测9脚,如果有电压,说明复位电路在正常工作时的状态不正常,查E1、R1、JP1和相关连接,否则说明正常工作时复位端电平正确;可以测一下复位工作过程是否正常,取一根电线,一端接在单片机的第九脚(RST脚),另一端与正电源端短接,然后撤去电线,如果电路已工作正常,说明复位电路工作不正常,同样要查E1、R1、JP1和相关连接。
3、如果以上两处均正确,可能是发光二极管的正负极安装错误导致不亮,用电线短接P1端各引脚与地,看接在该引脚上的发光管是否亮,如果不亮,就是发光管装反了。
将下面的这段测试程序的代码通过伟福仿真器进行测试:
测试程序:
MOV A,#0FEH
LOOP: MOV P1,A
RR A
LCALL DELAY
AJMP LOOP
DELAY: MOV R7,#255
D1: MOV R6,#255
D2: DJNZ R6,D2
DJNZ R7,D1
RET
END
如果灯不亮,说明硬件电路工作不正常,大体有这样的几种情况:
1、振荡电路未起振有条件可以用示波器观察89C52的18脚的波形以确定是否起振,如果没有示波器可以用万用表分别测18脚和19脚的对地电压,如果两者的电压差在2V左右,说明振荡正常,否则是未起振,检测电容C1、C2和晶振是否损坏,安装是否正确。
2、复位电路未能正确工作使用万用表测9脚,如果有电压,说明复位电路在正常工作时的状态不正常,查E1、R1、JP1和相关连接,否则说明正常工作时复位端电平正确;可以测一下复位工作过程是否正常,取一根电线,一端接在单片机的第九脚(RST脚),另一端与正电源端短接,然后撤去电线,如果电路已工作正常,说明复位电路工作不正常,同样要查E1、R1、JP1和相关连接。
3、如果以上两处均正确,可能是发光二极管的正负极安装错误导致不亮,用电线短接P1端各引脚与地,看接在该引脚上的发光管是否亮,如果不亮,就是发光管装反了。
实际中我们遇到过这样的问题,电容被安装了一个为27P,另一个为103(0.01uf),以上的测试一切正常,但是不能正常工作,因此,安装时要细心,出现问题还要注意查看。以上测试如果通过,说明电路板部份工作正常,可以利用伟福仿真器对电路板来做进行仿真了。
软件部分
程序分主程序和中断程序,可采用汇编语言编程, 计时采用延时程序进行, 延时程序的执行时间为1 秒(若单片机的晶振频率为6MHZ) 用特殊功能寄存器PSW 的第6 位FO (PSW 15) 作A、B 通道的放行标志, PSW 15= 0 时,A 道放行, PSW 15= 1 时,B道放行。工作寄存器R4 作为计数器(对1 秒计数)。A 道放行时, R4 中存放立即数# 5AH (相当于十进制数90) , R4 计数90 次时,A 道放行正好90 秒; B 道放行时, R4 中存放立即数# 3CH (相当于十进制数60) , R4 计数60 次时,B 道放行正好60 秒, 还可根据控制过程中的实际情况来改变R4 中的数据,就能改变A、B 通道的放行时间。紧急车通过的处理用中断服务程序来控制。
源程序:
ORG 0000H
LJMP STAR1
A_BIT EQU 20H ;数码管个位数存放内存位置
B_BIT EQU 21H ;数码管十位数存放内存位置
TEMP EQU 22H ;计数器数值存放内存位置
STAR1: MOV TEMP,#20 ;初始化计数器,从60开始
CLR P1.0 ;南北方向红灯亮
CLR P1.5 ;东西方向绿灯亮
STLOP1: ACALL DISPLAY1 ;调用显示子程序
DEC TEMP ;对计数器减1
MOV A,TEMP ;
CJNE A,#0,STLOP1 ;判断计数器是否满0?
SETB P1.0 ;南北方向红灯灭
SETB P1.5 ;东西方向绿灯
ACALL SHAN ;调用黄灯闪烁程
STAR2: MOV TEMP,#20 ;重新开始开始60秒倒数
CLR P1.2 ;南北方向绿灯亮
CLR P1.3 ;东西方向红灯亮
STLOP2: ACALL DISPLAY2 ;调用数码管显示子程序
DEC TEMP ;计数器减一
MOV A,TEMP ;
CJNE A,#0,STLOP2 ;判断计数器是否为0?
SETB P1.2
SETB P1.3
ACALL SHAN ;调用黄灯闪烁子程?
SJMP STAR1 ;
DISPLAY1:MOV A,TEMP
MOV B,#10
DIV AB
MOV B_BIT,B ;个位在B
MOV A_BIT,A ;十位在A
MOV DPTR,#NUMTAB ;指定查表启始地址
MOV R0,#12 ;
DPL1: MOV R1,#250 ;
DPLOP1: MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P0,A ;送出个位的7段代码
CLR P2.3 ;开个位显示
ACALL D1MS ;显示162微秒
SETB P2.3 ;关闭个位显示,防止鬼影
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P0,A ;送出十位的7段代码
CLR P2.2 ;开十位显?
CLR P2.0
CLR P2.1
ACALL D1MS ;显示162微秒
SETB P2.2 ;关闭十位显示,防止鬼影
DJNZ R1,DPLOP1 ;循环执行250次
DJNZ R0,DPL1 ;循环执行250X4=1000次
RET
DISPLAY2:MOV A,TEMP ;将TEMP中的十六进制数转换成10进制
MOV B,#10 ;10进制/10=10进制
DIV AB ;
MOV A_BIT,B ;个位在B
MOV B_BIT,A ;十位在A
MOV DPTR,#NUMTAB ;指定查表启始地址
MOV R0,#12 ;
DPL2: MOV R1,#250 ;
DPLOP2: MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P0,A ;送出个位的7段代码
CLR P2.0 ;开个位显示
ACALL D1MS ;显示162微秒
SETB P2.0 ;关闭个位显示,防止鬼影
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P0,A ;送出十位的7段代码
CLR P2.1 ;开十位显
CLR P2.2
CLR P2.3
ACALL D1MS ;显示162微秒
SETB P2.1 ;关闭十位显示,防止鬼影
DJNZ R1,DPLOP2 ;循环执行250次
DJNZ R0,DPL2 ;循环执行250X4=1000次
RET
SHAN: MOV R3,#5 ;
ROUND: CLR P1.1 ;
CLR P1.4 ;
ACALL DELAY ;黄灯闪烁五次
SETB P1.1 ;每次间隔一秒
SETB P1.4 ;
ACALL DELAY
DJNZ R3,ROUND ;
RET ;
D1MS: MOV R7,#80 ;2+2X80=162微秒,延时按12MHZ计算
DJNZ R7,$ ;
RET ;
DELAY: MOV R6,#10 ;
YL3: MOV R4,#100 ;
XL2: MOV R5,#71 ;
DL1: NOP ;一秒延时子程序
NOP
NOP
NOP
NOP
DJNZ R5,DL1 ;
DJNZ R4,XL2 ;
DJNZ R6,YL3 ;
RET ;
;共阴数码管显示代码
NUMTAB: DB 03FH ;0
DB 006H ;1
DB 05BH ;2
DB 04FH ;3
DB 066H ;4
DB 06DH ;5
DB 07DH ;6
DB 007H ;7
DB 07FH ;8
DB 06FH ;9
END
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯