RT: RETI
6.已知单片机系统时钟频率fosc=6MHz,试编写程序,利用定时器T0工作在方式3,使P1.0和P1.1分别输出周期为1ms和400μs的方波。
ORG 0000H
AJMP MAIN
ORG AJMP ORG AJMP ORG MOV MOV SETB SETB SETB SETB SETB SJMP
CTC250:CPL
MOV RETI CTC100:CPL
MOV RETI
000BH CTC250 001BH CTC100 0100H TMOD,#03H TL0,#6 TH0,#156 EA ET0 ET1 TR0 TR1 $ P1.0 TL0,#6 P1.1
TH0,#156
MAIN: MOV
7.将定时器T1设置为外部事件计数器,要求每计数100个脉冲,T1转为1ms定时方式,定时到后,又转为计数方式,周而复始。设系统时钟频率为6MHz,试编写程序。
ORG AJMP ORG
0000H MAIN 0050H JS100 0100H
TMOD,#01100000B TH1,#156 TL1,#156 EA ET1 TR1
TF1,NEXT1 LOOP1 TR1 DS1ms $
0200H
MAIN: SJMP
ORG
JS100: MOV
MOV
MOV SETB SETB
SETB
LOOP1: JB SJMP NEXT1: CLR
AJMP SJMP ORG
21
DS1ms: MOV
MOV MOV SETB SETB
TMOD,#00000000B TH1,#F0H TL1,#0CH EA ET1 TR1
TF1,NEXT2 LOOP2 TR1 JS100 $
SETB
LOOP2: JB SJMP NEXT2: CLR
AJMP SJMP END
8.设单片机系统时钟频率fosc=6MHz,现利用定时器T1方式2产生110bps波特率,试计算出定时器的初值。
依据公式: 波特率=2SMOD/32*T1溢出率 取SMOD=0
T1溢出率=1/(28—初值) 计算得出: 定时器的初值为114
9.由MCS-51单片机的串行口的方式1发送1,2,?,FFH等255个数据,试用中断方式编写发送程序(波特率为2400,fosc=12MHz)。
ORG 0000H
AJMP MAIN ORG 0100H
MAIN: MOV TMOD,#20H MOV TH1,#0F3H MOV TL1,#0F3H SETB EA SETB TR1 MOV MOV MOV MOV
PCON,#00H SCON,#50H A,#01H R5,#255
SETB TI SJMP $ ORG ACOUT: CLR MOV
0023H TI
SBUF,A
INC A
DJNZ R5,TNEXT CLR CLR TNEXT: RETI
22
ES TR1
END
10.设计一个单片机的双机通信系统,并编写通信程序。将甲机内部RAM 30H~3FH 存储区的数据块通过串行口传送到乙机内部RAM 40H~4FH存储区中去。
习题六
1.利用8051定时器的门控位测量某正脉冲高电平的宽度。已知正脉冲宽度小于10ms,fosc=12MHz。试编程测量脉宽,并把测试的结果转换为BCD码存入片内50H开始的连续单元中,十位和个位存入50H单元。
解:该题与[例5.6]类似。
分析:[例5.6] 当GATE=1、TR0=1,只有/INT0引脚上出现高电平时,T0才被允许计数。利用这一功能测试/INT0引脚上正脉冲的宽度(以机器周期数表示)。
设外部待测脉冲由/INT0 (P3.2)输入,T0工作在方式1,设置为定时状态,GATE置?1?,测试时,在/INT0端为?0?时置TR0 为?1?,当/INT0端变为?1?时启动计数; /INT0端再次变为?0?时停止计数。此时的计数值就是被测正脉冲的宽度。如下图所示:
/INT0 (P3.2) 对T0初始化 │←T0从0开始计数→│TR0←0,停止T0计数, TMOD←09H, 读出T0值
TR←1
程序如下: ORG
0000H
LJMP MAIN ORG 0100H
TMOD,#09H ;T0工作于方式1定时,GATE=1 TL0,#00H TH0,#00H P3.2, WAIT1
;等待P3.2变低 ;启动T0
;等待P3.2变高 ;等待P3.2再变低 ;T0停止计数
TR0 P3.2,WAIT2 P3.2,WAIT3 TR0
MAIN:
MOV MOV MOV WAIT1:JB SETB WAIT2:JNB WAIT3:JB
CLR
; 16位二进制数转换十进制数。
MOV MOV MOV MOV MOV
R7,TH0;存放计数值 R6,TL0 R5,#00H R4,#0AH R0,#50H 31H,#05 DDIV @R0,02H R0
MOV LOOP:
23
LCALL MOV INC
DJNZ SJMP
31H,LOOP $
DDIV: MOV A,R4 JNZ DDIV0 MOV A,R5
JZ DDIV0: MOV MOV MOV DDIV1:
CLR MOV RLC
MOV MOV RLC MOV MOV RLC MOV MOV RLC MOV MOV SUBB JC MOV MOV SUBB JC INC MOV MOV MOV DDIV2:
DJNZ
CLR
SJMP ERROR: SETB NEXT: RET
24
ERROR
R2,#00H R3,#00H R1,#16 C
A,R6 A R6,A A,R7 A R7,A A,R2 A R2,A A,R3 A R3,A A,R2 A,R4 DDIV2 30H,A A,R3 A,R5 DDIV2 R6 R3,A A,30H R2,A R1,DDIV1 F0 NEXT F0