74HC164级联控制三个数码管计数

传感器实验一:段码管计数

使用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)输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。

74HC164级联控制三个数码管计数_第1张图片

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

 

你可能感兴趣的:(硬件模块)