MOV 2AH,#1FH ;设置时间显示初值
MOV R7,#019H ;延时秒数
MAIN3:LCALL DEL1
DJNE R7,MAIN3
MOV R3,#0EEH ;A线禁止,B线警告 MOV R7,#05H ;延时秒数 MAIN4:LCALL DEL1 ;1s延时子程序 DJNE R7,MAIN4
AJMP MAIN ;循环 1s延时子程序DEL1
DEL1:DEC 2AH ;显示秒数减1 MOV A,2AH MOV B,#0AH
DIV AB ;秒数转换为十进制 ADD A,#2AH
MOVC A,@A+PC ;查表个位数的字形码 MOV R1,A MOV A,B ADD A,#24H
MOVC A,@A+PC ;查表十位数的字形码 MOV R2,A
MOV R6,#40H ;设置循环次数 LOOP: MOV A,R2 ;十位数的字形码 MOV R4,#0EFH ;位控码
ACALL DISP ;调用显示子程序 MOV A,R1 ;个位数的字形码 MOV R4,#0DFH ;位控码 ACALL DISP
MOV A,R3 ;“信号灯”控制码
MOV R4,#0FBH ;“信号码”共阴极控制 ACALL DISP
DJNZ R6,LOOP ;循环 RET ;返回 TABLE:DB C0H,F9H,A4H,B0H,99H DB 92H,82H,F8H,80H,90H 显示子程序DISP
DISP: MOV R0,#0B0H ;设置循环次数 MOV R5,A DISP1:MOV A,R5
MOV P1,A ;字形码输出 MOV A,R4
MOV R3,A ;位控制码输出 DJNZ R0,DISP1 ;循环 RET ;返回
6
3.主支线路口的交通信号灯控制
由主线和支线构成的路口,其交通控制原则是尽可能保证主线的畅通,因此通常情况下都是主线放行。只有在支线有车辆到达时,才放行支线。具体描述如下:
·在通常情况下,主线为绿灯,支线为红灯。当支线有车辆到达时,延迟5s后使主线由绿灯变黄灯。再过5s,主线由黄灯变绿灯,支线由红灯变绿灯。
·支线绿灯后,如主线到达车辆少于3辆,则支线绿灯维持25s,然后变黄灯,再经5s钟,变为红灯,同时主线由红灯变为绿灯。
·若支线变绿灯后的25s之内,主线有3辆以上车辆到达,则在第三辆车到达之时,支线变为黄灯,延迟5s后变为红灯,同时主线由红灯变为绿灯。
电路连接如图所示。
其中按键K1代表支线有车辆到达,按一下后主线发光二极管黄灯亮,然后转红灯亮,同时支线发光二极管应转绿灯亮。
按键K2代表主线有车辆到达。如在支线放行期间,按键K2按3次,代表主线有3辆车到达。这时支线发光二极管立即变黄灯,然后转红灯亮,而同时主线发光二极管转为绿灯亮。
由于按键K1接P1.7,因此通过测试P1.7的电平状态就可以了解支线是否有车辆到达。而按键K2需按下3次才有效。为此最好采用中断方式实现,具体说就是计数溢出中断,使用MCS-51的定时器/计数器进行计数。每按下一次按键K2,计数器加1,按3次后就产生计数溢出。假定使用定时器/计数器1,根据交通信号灯控制的需要,应采用定时工作方式2,以利用其计数溢出后计数初值自动重装的特点。保证控制的自动性和连续性。主程序及中断服务程序流程图如下图。 4.有急救车优先的交通信号灯控制
在定时交通信号灯控制的基础上,增加允许急救车优先通过的要求。当有急救车到达时,路口的信号灯全部变红,以便让急救车通过。假定急救车通过时间为10s,急救车通过后交通灯恢复先前的状态。另假设按键K1代表有急救车到来,并以中断方式进行处理。
主程序
ORG 8100H AJMP MAIN ORG 8003H AJMP INT
MAIN: SETB EA ;开中断
SETB EX0 ;允许外中断0
CLR IT0 ;外中断0电平触发方式 LOOP: MOV R0,#0F3H ;A线放行,B线禁止 MOV P1,R0
MOV R7,#19H ;延时25s
LOOP1:LCALL DELAY ;调用1s延时子程序 DJNZ R7,LOOP1
MOV R0,#0F5H ;A线警告,B线禁止 MOV P1,R0
MOV R7,#05H ;延时5s
LOOP2:LCALL DELAY ;调用1s延时子程序
7
DJNZ R7,LOOP2
MOV R0,#0DEH ;A线禁止,B线放行 MOV P1,R0
MOV R7,#19H ;延时25s
LOOP3:LCALL DELAY ;调用1s延时子程序 DJNZ R7,LOOP3
MOV R0,#0FEH ;A线禁止,B线警告 MOV P1,R0
MOV R7,#05H ;延时5s
LOOP4:LCALL DELAY ;调用1s延时子程序 DJNZ R7,LOOP4
AJMP MAIN ;循环
1s延时子程序DELAY(略) 中断服务程序
INT: MOV P1,#0F6H ;两线都禁止 MOV R7,#0AH ;延时10s INT1: ACALL DELAY DJNZ R7,INT1
MOV P1,R0 ;恢复原状态 RETI ;中断返回
参考资料2
乐曲演奏器(简易电子琴设计)
声音是由物体振动产生的。乐器中弓和弦的摩擦振动,交变电流推动喇叭纸盘的振动等,都会发出声音。振动频率不同,所发出的声音也就不同,有规律的震动发出的声音叫“乐音”。乐谱中每一个音符都与一个频率相对应,例如,C调中音“1”,其频率f?524Hz。音乐中所用的音频大约在27Hz~4.1KHZ,而人耳能听到的音频大约在18HZ~18KHZ。
单片机用作可编程乐曲演奏器的原理是:
通过控制定时器的定时来产生不同频率的方波,驱动喇叭便发出不同音阶的声音,再利用延迟来控制发音时间的长短,即可控制音调中的节拍。把乐谱中的音符和相应的节拍变换为定时常数和延迟常数,做成数据表格存放在存储器中。有程序查表得到定时常数和延迟常数,分别用于控制定时器产生方波的频率和发出该方波的持续时间。当延迟时间到时,再查下一个音符的定时常数和延迟常数。一次进行下去,就可以自动演奏出悦耳动听的乐曲。
下面是歌曲“新年好”的一段简谱:
1=C 1 1 1 5 | 3 3 3 1 | 1 3 5 5 | 4 3 2 — | .
用定时器T0方式1来产生歌谱中个音符对应频率的方波,由P1.0输出驱动喇叭。节拍的控制可通过调用延时子程序D200(延时200ms)次数来实现,以每拍800ms的节拍时间为例,那么一拍需要循环调用D200延时子程序4次。同理,半拍就需要调用D200子程序2次。设单片机晶振频率为6MZ,乐曲中的音符、频率及定时常数三者的对应关系如下:
8
音符 频率 (HZ) 半周期 (ms) 定时值 5 392 1.28 FD80 6 440 1.14 FDC6 7 494 1.01 FE07 1 524 0.95 FE25 2 588 0.85 FE57 3 660 0.76 FE84 4 698 0.72 FE98 5 784 0.64 FEC0 6 880 0.57 FEE3 7 988 0.51 FF01
乐曲演奏控制程序如下:
ORG 000BH
MOV TH0,R1 ;定时器T0中断入口 MOV HL0,R0 ;重装定时初值 CPL P1.0 RETI
ORG 1000H
MAIN:MOV TMOD,#01H ;主程序
MOV IE,#82H ;定时器T0方式1 MOV DPTR,#TAB ;表格首地址 LOOP:CLR A ;查表
MOVC A,@A+ DPTR ;定时初值高8位存R1 MOV R1,A INC DPTR CLR A
MOVC A,@A+ DPTR
MOV R0,A ;定时初值低8位存R0 ORL A,R1
JZ NEXT0 ;R0、R1全0为休止符
MOV A,R0 ;R0、R1全1为乐曲结束 ANL A,R1
CJNE A,#0FFH,NEXT SIMP MAIN
NEXT:MOV TH0,R1 ;装入定时初值
MOV HL0,R0
SETB TR0 ;启动定时器 SJMP NEXT1 NEXT0:CLR TR0
NEXT1:CLR A ;查表
MOVC A,@A+ DPTR ;延时常数存R2 MOV R2,A INC DPTR
LOOP1:ACALL D200 DJNZ R2,LOOP1
9
INC DPTR AJMP LOOP
D200 :MOV #81H ;延时200ms子程序 D200B: MOV A,#0FFH D200A: DEC A
JNZ D200A DEC R3
CJNE R3,#00H,D200B RET
TAB: DB 0FEH,25H,02H,0FEH,25H,02H DB 0FEH,25H,04H,0FDH,80H,04H DB 0FEH,84H,02H,0FEH,84H,02H DB 0FEH,84H,04H,0FEH,25H,04H DB 0FEH,25H,02H,0FEH,84H,02H
DB 0FEH,0C0H,04H,0FEH,0C0H,04H
DB 0FEH,98H,02H,0FEH,84H,02H DB 0FEH,57H,08H,00H,00H,04H DB 0FFH,0FFH END
10