使用MCS-51单片机的同步串口功能,利用三片8位并行输出串行移位寄存器74LS164,实现000到999的循环显示,每隔100ms将显示数字加一。
悬赏分:20 - 解决时间:2009-10-22 17:35
;----------------------------------------------------------------
最佳答案:
;利用50H、51H和52H,作为计数单元,每隔100ms加一次一
;每当加一后,将三位数从串行口输出,程序如下:
;---------------------------------------------------
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:
MOV SCON, #0 ;设置串行口工作在方式0
MOV 50H, #0 ;个位清零
MOV 51H, #0 ;十位清零
MOV 52H, #0 ;百位清零
;---------------------------------------------------
DL_LOOP:
CALL DL_100MS ;按照要求延时
MOV A, 50H
ADD A, #1
MOV 50H, A
CJNE A, #10, XIAN_SHI ;在这里控制进位制
MOV 50H, #0
MOV A, 51H
ADD A, #1
MOV 51H, A
CJNE A, #10, XIAN_SHI
MOV 51H, #0
MOV A, 52H
ADD A, #1
MOV 52H, A
CJNE A, #10, XIAN_SHI
MOV 52H, #0
;---------------------------------------------------
XIAN_SHI:
MOV DPTR, #SEGPT
MOV A, 50H ;先串行输出个位
MOVC A, @A+DPTR
MOV SBUF, A
JNB TI, $ ;等待输出结束
CLR TI
MOV A, 51H ;串行输出十位
MOVC A, @A+DPTR
MOV SBUF, A
JNB TI, $
CLR TI
MOV A, 52H ;串行输出百位
MOVC A, @A+DPTR
MOV SBUF, A
JNB TI, $
CLR TI
LJMP DL_LOOP ;反复循环
;---------------------------------------------------
DL_100MS: ;这里的数字,可以自行调整,控制延时时间
MOV R3, #10
D1: MOV R4, #200
D2: MOV R5, #248
DJNZ R5, $
DJNZ R4, D2
DJNZ R3, D1
RET
;---------------------------------------------------
SEGPT:
DB 0C0H, 0F9H, 0A4H, 0B0H ;0、1、2、3
DB 99H, 92H, 82H, 0F8H ;4、5、6、7
DB 80H, 90H, 88H, 83H ;8、9、A、B
DB 0C6H, 0A1H, 86H, 8EH ;C、D、E、F
END
;---------------------------------------------------
上述程序,已经在PROTEUS软件中仿真调试通过。
截屏画面如下:
各位高手,首先我不是伸手派,的确花了很长时间来想这个程序。
买了一块89C52的单片机板子,用了4个4094串联来驱动显示4位数码管。
但是4094上的str接的是P3.2口(INT0口),D口接P3.3(INT1口),clk接P3.4口(T0口)。
一般我看书,不是用D接RXD口,CLK接TXD口嘛。如果按照这个板子的接法,CLK口还能做时钟电路吗?
我觉得不能吧,所以想问问看各位,比如我想从A中送数据去显示到数码管上,我该怎么编这个程序的。
悬赏分:80 - 解决时间:2010-1-1 20:30
;------------------------------------------------
最佳答案:
4094和74LS164功能是基本相同的,都是“串入并出”的移位寄存器,但是它们的引脚排列是不同的。
它们如果接在单片机的串行口上,就可以使用串行口的方式0来输出数据,一般的书上,就是这么介绍的。
楼主的4094没有接在串行口,也可以使用位操作指令,使用并行口来模拟串行口,达到向“串入并出寄存器”输入数据的目的。
发送ACC的内容到4094的子程序如下:
;------------------------------------------------
SEND_ACC:
MOV R2, #8
S_LOOP:
RRC A ;A中的最低位移动到C
MOV P3.3, C ;移动到D口
NOP
CLR P3.4 ;P3.4(CLK)输出一个脉冲
NOP
NOP
SETB P3.4
DJNZ R2, S_LOOP
CLR P3.2
NOP
SETB P3.2 ;P3.2(STR)输出一个脉冲
RET
;完
;------------------------------------------------
回答者: 做而论道 - 十一级 2009-12-16 23:46
原文网址:http://zhidao.baidu.com/question/129631211.html
联系客服