传感器实验一:段码管计数
使用MCS-51汇编语言编写程序,完成如下功能:
1. 使用三个数码管显示十进制数值(001~999,可任意设置);
2. 每隔1秒,该数值自动减一,直到归零;
3. 归零后的下一秒,显示一个新的十进制数值(001~999,可任意设置);
4. 每隔1秒,新数值继续自动减一,直到再次归零;
5. 重新执行步骤1,循环往复。
6. 当开关S1按下时,暂停计数;S1松开时,恢复计数。
本实验采用3个74HC164级联控制三个数码管的显示,具体实验原理如下图所示。其中使用单片机P4.5作为模拟串口数据,使用P4.4模拟串口时钟,CLR端接高电平。使用上一个74HC164的Q7作为下一个74HC164的输入端。
74HC164是高速CMOS 器件。74HC164是8位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(A或B)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。 时钟 (CLK) 每次由低变高时,数据右移一位,输入到Q0,Q0 是两个数据输入端(A和B)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。 主复位(CLR)输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
ORG 0000H
LJMP START
ORG 0050H
START:
P4 EQU 0C0H
P4SW EQU 0BBH
CLK EQU P4.4
DAT EQU P4.5
SW EQU P3.6 ;开关
MOV DPTR,#TAB
MOV P4SW,#70H ;设置P4口工作方式
SS:
MOV R6,#9
MOV R5,#9
MOV R4,#9
LOOP:
MOV A,R6
MOVC A,@A+DPTR
LCALL SHOW
MOV A,R5
MOVC A,@A+DPTR
LCALL SHOW
MOV A,R4
MOVC A,@A+DPTR
LCALL SHOW
LCALL DELAY
STOP:
NOP
JNB SW,STOP
CJNE R6,#0,N0
CJNE R5,#0,N1
CJNE R4,#0,N2
LJMP SS
N0:
DEC R6
LJMP LOOP
N1:
DEC R5
MOV R6,#9
LJMP LOOP
N2:
DEC R4
MOV R5,#9
MOV R6,#9
LJMP LOOP
;传8位待显示数字
SHOW:
MOV R0,#8
LL:
CLR CLK
RLC A
MOV DAT,C
SETB CLK
DJNZ R0,LL
RET
;延时1s
DELAY:
MOV R1,#60
L1:
MOV R2,#40
L2:
MOV R3,#230
DJNZ R3,$
DJNZ R2,L2
DJNZ R1,L1
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
采用中断方式:
ORG 0000H
AJMP START
ORG 000BH
AJMP INT_SUB
ORG 0200H
START:
P4 EQU 0C0H
P4SW EQU 0BBH
CLK EQU P4.4
DAT EQU P4.5
SW EQU P3.6 ;开关
MOV DPTR,#TAB
MOV P4SW,#70H ;设置P4口工作方式
MOV R7,#0;用于循环20次产生1s定时
MOV TMOD,#01H;设置为软件启动,定时器模式,工作模式方式1
MOV TH0,#3CH;给定时/计数器设初值,定时时间为50us
MOV TL0,#0B0H
SETB ET0 ;打开T0定时计数器
SETB EA ;打开全局开关
SETB TR0 ;开始计数
SJMP $ ;等待中断
INT_SUB:
MOV TH0,#3CH;重新给定时/计数器设初值
MOV TL0,#0B0H
INC R1 ;R1自增,计数
CJNE R1,#20,RETURN1 ;不等于20(小于20)直接return1,TIME1执行20次,产生1秒中断
MOV R1,#0
JNB SW,RETURN1
LCALL COUTINT //如果不更新r4,r5,r6中的值,段码管是显示上次的值还是不显示,若不显示,则在这里添加显示函数
RETURN1:
LCALL DSL
RETI
COUTINT:
CJNE R6,#0,COUNT_GE
CJNE R5,#0,COUNT_SHI
CJNE R4,#0,COUNT_BAI
MOV R6,#9
MOV R5,#9
MOV R4,#9
SJMP COUNT_EXIT
COUNT_GE:
DEC R6
SJMP COUNT_EXIT
COUT_SHI:
DEC R5
MOV R6,#9
SJMP COUNT_EXIT
COUT_BAI:
DEC R4
MOV R5,9
MOV R6,9
SJMP COUNT_EXIT
COUNT_EXIT:
RETI
;三位数段码管的显示
DSL:
MOV A,R6
MOVC A,@A+DPTR
LCALL DISPLAY
MOV A,R5
MOVC A,@A+DPTR
LCALL DISPLAY
MOV A,R4
MOVC A,@A+DPTR
LCALL DISPLAY
RET ;中断函数内,此处必须是RET,RETI结束中断
;段码管显示函数
DISPLAY:
MOV R0,#8
DS_L:
CLR CLK
RLC A
MOV DAT,C
SETB CLK
DJNZ R0,DS_L
RET
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END