使用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软件中仿真调试通过。 截屏画面如下:
图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/d9f6def4edd22675bd31093a.html# ;--------------------------------------------------- 回答者: 做而论道 - 八级 2009-10-22 17:27 提问者对于答案的评价:谢谢 原文网址:http://zhidao.baidu.com/question/122465370.html ;================================================================== 下面是另外一个问题,是用串行移位寄存器4094芯片驱动数码管的
各位高手,首先我不是伸手派,的确花了很长时间来想这个程序。 买了一块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
|