
2.单片机用内部定时方法产生频率为100KHz的等宽距形波,假定单片机的晶阵频率为12MHz。请编程实现。
解:等宽距形波指的就是方波,100KHz对应的周期是1/100KHz=10S,现用T0在模式2下定时5μs,每隔5μs在某I/O脚(如选P1.0)上取反一次,即可产生频率为100KHz的等宽距形波。
5μs 定时初值:X=28-t/MC=256-5μs /1μs =251
程序清单(中断编程):
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP CTC0
ORG 0030H
MAIN:MOV TMOD,#02H
MOV TL1,#251
MOV TH1,#251
SETB EA
SETB ET0
SETB TR0
SJMP $
CTC0:CPL P1.0
RETI
3.C51定时器有哪几种工作模式?它们之间有哪些区别?
答:四种工作模式:方式0、方式1、方式2和方式3。
主要区别:计数器长度不同,依此是13、16、8、8,其次是初值重装方式不同,方式0、方式1和方式3均需软件重装,而方式2则硬件自动重装。
5.定时器/计数器用作定时器时,其定时时间与哪些因素有关?作计数器时,对外界计数频率有何?
答:①定时器用作定时器时,其定时时间t = ( 2n-X ) · 12/fosc,由此来看,它与计数器长度、初值、晶振频率有关。
②作计数器时,外界计数频率 ≤ fosc/24。
7.当定时器T0用作模式3时,由于TR1位已被T0占用,如何控制定时器T1的开启和关闭?
答:当设置好工作方式时,T1即自动启动。若要停止,只需送入一个设置T1为方式3的方式字即可。
8.以定时器/计数器1进行外部事件计数。每计数1000个脉冲后,定时器/计数器1转为定时工作方式。定时10 ms后,又转为计数方式,如此循环不止。假定单片机晶振频率为6 MHz,请使用模式1编程实现。
解:根据题意,先将T1设定成计数方式(C//T=1),使其计满1000个脉冲后溢出;然后再将T1设定成定时方式(C//T=0),使其定时10ms,10ms定时时间到后,重新转为计数方式,构成一个循环程序即可。
已知晶振频率为6MHZ,并要求用定时器T1的模式1实现。
①计数时初值计算: X=216-1000=65536-1000=536=FC18H
②定时时初值计算: X=216-t/T=65536-10000/2=60536=EC78H
程序清单: ORG 0000H
LJMP LOOP
ORG 0030H
LOOP: MOV TMOD,#50H;设置T1计数、模式1
MOV TL1,#18H
MOV TH1,#0FCH
SETB TR1
JNB TF1,$
CLR TF1
MOV TMOD,#10H;设置T1定时、模式1
MOV TL1,#78H
MOV TH1,#0ECH
JNB TF1,$
CLR TF1
SJMP LOOP
13.已知C51单片机的fosc=6 MHz,请利用T0和P1.0输出矩形波。矩形波高电平宽为50s,低电平宽为300s。
解: 根据题意,显然T0用作定时,现选用模式2定时50μs。
定时时初值计算:
1中断方式编程
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP CTC0
ORG 0030H
MAIN:MOV R0,#07H
MOV TMOD,#02H
MOV TL0,#231
MOV TH0,#231
SETB TR0
SETB ET0
SETB EA
SJMP $
CTC0: CJNE R0,#07H,LOW
SETB P1.0
DEC R0
SJMP EXIT
LOW: CLR P1.0
DJNZ R0,EXIT
MOV R0,#07H
EXIT:RETI
2查询方式编程
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R0,#00H
MOV TMOD,#02H
MOV TL0,#231
MOV TH0,#231
SETB TR0
LOOP: JBC TF0,WAVE
SJMP LOOP
WAVE: INC R0
CJNE R0,#01H,LOW
SETB P1.0
SJMP LOOP
LOW: CLR P1.0
CJNE R0,#07H,LOOP
MOV R0,#00H
SJMP LOOP
14.已知C51单片机的fosc=12 MHz,用T1定时。试编程由P1.0和P1.1引脚分别输出周期为2 ms和500s的方波。
解: 在P1.0引脚上每隔1000μs(1ms)取反一次,即可输出周期为2ms的方波。
在P1.1引脚上每隔250μs取反一次,即可输出周期为500μs的方波。
如果把T1设定成定时方式,定时时间为250μs,显然T1每溢出一次对P1.1脚取反一次,T1每溢出四次(恰好是1000μs)对P1.0脚取反一次,就可实现题目的要求。
对于fosc=12MHz、250μs的定时,模式2的最长定时时间能满足,编程也相对较精简。
求250μs的初值:
程序清单:
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP CTC1
ORG 0030H
MAIN:MOV R0,#04H
MOV TMOD,#20H
MOV TL1,#06H
MOV TH1,#06H
SETB TR1
SETB ET1
SETB EA
SJMP $
CTC1:CPL P1.1
DJNZ R0,RETURN
CPL P1.0
MOV R0,#04H
RETURN:RETI
18.设fosc=12 MHz。试编写一段程序,功能为:对定时器T0初始化,使之工作在模式2,产生200s定时,并用查询T0溢出标志的方法,控制P1.0输出周期为2 ms的方波。
解:求T0在模式2下定时200μs的初值:
程序清单:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:MOV R0,#05H
MOV TMOD,#02H
MOV TL1,#38H
MOV TH1,#38H
SETB TR0
HERE:JNB TF0,HERE
CLR TF0
DJNZ R0,HERE
MOV R0,#05H
CPL P1.0
SJMP HERE
