;有人提问:
;利用单片机的定时方式0,实现外部脉冲宽度(在5到250ms)的测量。要求画出电路图。在线等
;问题补充:写出程序,测量结果存储在R0中。
;=================================================
;做而论道对此题给出了答案:
;外部脉冲宽度(在5到250ms)之间,测量存放在R0。程序如下。
ORG 0000H
JMP START
ORG 000BH
JMP T0_INT
;------------;初始化
START:
MOV SP, #60H
MOV TMOD, #01H ;/*T0定时方式1*/
MOV TH0, #HIGH(65536 - 1000) ;1ms@12MHz
MOV TL0, #LOW (65536 - 1000)
SETB ET0
SETB EA
MOV R0, #0
;------------;电路:要把外部脉冲,接在P1.0
JB P1.0, $ ;等待高电平结束.
JNB P1.0, $ ;等待低电平结束.
SETB TR0 ;到了高电平,就启动T0开始计时.
JB P1.0, $ ;等待高电平结束.
CLR TR0 ;到了低电平,结束T0计时.
CALL DISPLAY ;显示
SJMP $ ;程序到此结束, R0中就是脉宽的毫秒数.
;-------------;1ms执行一次
T0_INT:
MOV TL0, #LOW (65536 - 993) ;重新写入初始值.
MOV TH0, #HIGH(65536 - 993) ;1ms@12MHz
INC R0 ;1ms加一次一.
RETI
;---------------------------------
;原题目,并没有提出显示测量结果的要求,这就不便观察。
;为此,下面补充了显示电路(以三个74HC595来驱动数码管)和程序。
SDAT_595 BIT P3.0
SCLK_595 BIT P3.1
S_UP_595 BIT P3.2
;**************************************************
;595发送程序
;**************************************************
OUT_595:MOV R2, #8
CPL A
O_1: RLC A
NOP
MOV SDAT_595, C
NOP
CLR SCLK_595
NOP
SETB SCLK_595
NOP
DJNZ R2, O_1
RET
;**************************************************
;显示程序
;**************************************************
DISPLAY:
MOV A, R0 ;把脉宽数据,分解成
MOV B, #100 ;BCD码
DIV AB;
MOV 30H, A ;百位
MOV A, #10;
XCH A, B;
DIV AB;
MOV 31H, A ;十位
MOV 32H, B ;个位
MOV R0, #32H ;把30H 31H 32H
MOV R7, #3 ;送出去显示
D_1:
MOV A, @R0
MOV DPTR, #TAB
MOVC A, @A+DPTR
CALL OUT_595
NOP
SETB S_UP_595
DEC R0
CLR S_UP_595
DJNZ R7, D_1
RET
;**************************************************
;七段码表
;**************************************************
TAB:
DB 00111111B
DB 00000110B
DB 01011011B
DB 01001111B
DB 01100110B
DB 01101101B
DB 01111101B
DB 00000111B
DB 01111111B
DB 01101111B
DB 00000000B
END
;=================================================
;程序在PROTEUS中运行的图像如下:
上一篇:基于51单片机的4×4矩阵键盘电子琴
下一篇:单片机89S51,4×4矩阵键盘,控制16个发光二极管
推荐阅读最新更新时间:2024-03-16 16:02