选择T0工作于方式2(8位重置初值)定时50μs
fosc=24MHz机器周期T?12?12106?0.5?10?6s?0.5?s
fosc24?(28
-X)×0.5μS=50μs X=156=9CH
方法1: MOV TMOD,#02H
MOV TH0,#9CH MOV TL0,#9CH
CLR P1.2 ;P1.2=0 SETB TR0
HIGH: SETB P1.2 ;P1.2=1,输出50μs高电平 HIGH1: JBC TF0,LOW ;50μs到清TF0,转输出低电平
AJMP HIGH1 ;50μs未到,转HIGH1等待
LOW: MOV R7,#7 ;350μs=7×50μs
CLR P1.2 ;P1.2=0输出350μs低电平
LOW1: JBC TF0,LOW2 ;50μs到清TF0,转LOW2 AJMP LOW1
LOW2: DJNZ R7,LOW1 ;7次未到,转LOW1
AJMP HIGH ;7次到,转HIGH,输出50μs高电平
方法2: MOV TMOD,#02H ;设置T0为方式2定时
MOV TH0,#9CH ;赋初值 MOV TL0,#9CH CLR P1.2
SETB TR0 ;启动T0工作
L1: SETB P1.2 ;P1.2=1,输出50μs高电平 MOV R7,#8
DEL: JBC TF0,REP ;50μs到清TF0,转输出低电平
AJMP DEL
REP: CLR P1.2 ;P1.2=0输出350μs低电平 DJNZ R7,DEL
AJMP L1
方法3: 选择T0工作于方式1定时50μs
(216
-X)×0.5μS=50μs X=65436=FF9CH
选择T0工作于方式1定时350μs
(216
-X)×0.5μS=350μs X=64836=FD44H
START: MOV TMOD,#01H ;设置T0为方式1定时 LP0: MOV TH0,#0FFH ;赋初值定时50μs
MOV TL0,#9CH CLR P1.2
SETB TR0 ;启动T0工作 SETB P1.2
LP1: JBC TF0,LP2 ;P1.2=1,输出50μs高电平 SJMP LP1
11
LP2: CLR P1.2
MOV TH0,#0FDH ;赋初值定时350μs MOV TL0,#44H
LP3: JBC TF0,LP4 ;P1.2=1,输出350μs低电平 SJMP LP3 LP4: SJMP LP0
6.在80C51单片机中,已知时钟频率为12MHz,请编程使P1.0和P1.1分别输出周期为2ms和500μs的方波。
方法1:选择T0工作于方式1定时250μs
fosc=12MHz机器周期T?1212f?12?106?1?10?6s?1?s osc(216
-X)×1μS=250μs X=65286=FF06H MOV TMOD,#01H MOV TH0,#0FFH MOV TL0,#06H SETB TR0
DEL: MOV R7,#4 ;1ms=4×250μs
D250: JBC TF0,D2 ;250μs到清TF0,转移
AJMP D250 ;250μs未到,等待
D2: CPL P1.1
MOV TH0,#0FFH ;重装初值 MOV TL0,#06H
DJNZ R7,D250 ;4次未到,转D500
CPL P1.0
AJMP DEL ;4次到,转DEL
方法2:选择T0工作于方式2定时250μs
(28
-X)×1μS=250μs X=6 MOV TMOD,#02H MOV TH0,#06H MOV TL0,#06H SETB TR0
DEL: MOV R7,#4 ;1ms=4×250μs
D250: JBC TF0,D2 ;250μs到清TF0,转移
AJMP D250 ;250μs未到,等待
D2: CPL P1.1
DJNZ R7,D250 ;4次未到,转D250
CPL P1.0
AJMP DEL ;4次到,转DEL
方法3:选择T0工作于方式2定时250μs,中断
(28
-X)×1μS=250μs X=6 T1工作于方式1定时1ms,中断
12
(216
-X)×1μS=1000μs X=64536=FC18H ORG 0000H LJMP MAIN ORG 000BH LJMP T00 ORG 001BH LJMP T11
MAIN: MOV TMOD,#12H
MOV TH0,#06H MOV TL0,#06H MOV TH1,#0FCH MOV TL1,#18H MOV IE,#8AH SETB TR0 SETB TR1 SJMP $
T00: CPL P1.1 RETI
T11: MOV TH1,#0FCH
MOV TL1,#18H CPL P1.0
RETI
方法4:选择T0工作于方式3定时250μs,中断。
(28
-X)×1μS=250μs X=6
T0方式3时TL0占用TR0、TF0,TH0占用TR1、TF1。 ORG 0000H LJMP MAIN ORG 000BH LJMP ITL0 ORG 001BH LJMP ITH0
MAIN: MOV SP,#50H
MOV TMOD,#03H MOV TH0,#06H MOV TL0,#06H MOV R7,#4 SETB TR0 SETB TR1
MOV IE,#8AH SJMP $
ITL0: MOV TL0,#06H
CPL P1.1
RETI
ITH0: MOV TH1,#06H
13
DJNZ R7,ITH01 MOV R7,#4 CPL P1.0
ITH01: RETI
7.设系统时钟频率为24MHz,试用定时器T0作外部计数器,编程实现每计到1000个脉冲,使T1开始2ms定时,定时时间到后,T0又开始计数,这样反复循环不止。
fosc=24MHz机器周期T?12?fosc12?0.5?10?6s?0.5?s 624?10T0作外部计数器选择工作于方式1:
16
1000=2-X X=64536=FC18H T1定时2ms选择工作于方式1:
16
(2-X)×0.5μS=2000μs X=61536=F060H MOV TMOD,#15H
START: MOV TH0,#0FCH
MOV TL0,#18H SETB TR0 JNB TF0,$ CLR TF0 CLR TR0
MOV TH1,#0F0H MOV TL1,#60H SETB TR1 JNB TF1,$ CLR TF1 CLR TR1 SJMP START
8.利用80C51单片机定时器/计数器测量某正脉冲宽度,已知此脉冲宽度小于10ms,主机频率为12MHz。编程测量脉冲宽度,并把结果转换为BCD码顺序存放在以片内50H单元为首地址的内存单元中(50H单元存个位)。
二进制数转换成BCD码是利用按权展开式计算,由于是BCD码计算中要用DA A指令 设脉冲由/INT0输入,T0工作于方式1
fosc=12MHz机器周期T?12?fosc12?1?10?6s?1?s 612?10MOV MOV MOV MOV JB SETB JNB JB CLR TMOD,#09H TL0,#00H TH0,#00H R0,#4EH P3.2,$ TR0 P3.2,$ P3.2,$ TR0
;设T0为方式1,GATE=1
;等待P3.2变低 ;启动T0准备工作 ;等待P3.2变高 ;等待P3.2再次变低 ;停止计数
14
MOV INC MOV MOV MOV CLR
LOOP1: MOV
INC DJNZ MOV
LOOP4: MOV
MOV CLR
LOOP2: MOV RLC MOV
INC DJNZ MOV
LOOP3: MOV ADDC DA MOV
INC DJNZ DJNZ SJMP
@R0,TL0 R0
@R0,TH0 R1,#50H R5,#3 A
@R1,A R1
R5,LOOP R7,#10H R0,#4EH R6,#2 C
A,@R0 A
@R0,A R0
R6,LOOP2 R5,#3 A,@R1 A,@R1 A
@R1,A R1
R5,LOOP3 R7,LOOP4 $
;存放计数的二进制数低字节入4EH ;存放计数的二进制数高字节入4EH ;BCD码首址 ;BCD码字节数 ;清存BCD码单元
;二进制数位数 ;二进制数首址 ;二进制数字节数
;2字节二进制数左移1位 ;BCD码字节数 ;BCD码乘2加C运算
第7章作业参考答案
P175 2,6,7
2.某异步通讯接口按方式3传送,已知其每分钟传送3600个字符,计算其传送波特率。 解:11(位)×3600(字符/秒)/60秒=660位/秒
注:方式3为11位异步通讯方式。
6.已知定时器T1设置为方式2,用做波特率发生器,系统时钟频率为24MHz,求可能产生的最高和最低的波特率是多少?此时串口工作于方式1或3
{fosc}2SMOD{波特率}??3212?(256?X){波特率}MAX2SMOD{fosc}2124?106?????125000
3212?(256?X)3212?(256?255)2SMOD{fosc}2024?106?????244
3212?(256?X)3212?(256?0)15
{波特率}min