LOOP:JBC TF0,DONE ; 判计满100次否?若计满则清零TF0且转DONE SJMP LOOP DONE:CPL P1.0 SJMP LOOP 例7.3 已知单片机晶振频率为12MHz,要求使用T0定时0.5ms,使单片机P1.0引脚上连续输出周期为1ms的方波。
分析:首先算出机器周期=12/(12MHz)=1us,所以0.5ms需要T0计数M次 M=0.5ms/1us=500 256<500<8192,所以选择方式0 初值N=213-500=7692=1E0CH 因为选用方式0,低8位TL0只使用低5位,其 TL0=0CH, TH0=0F0H ORG 0000H
RESET: AJMP START
ORG 000BH AJMP T0INT ORG 0100H START: MOV SP,#60H
MOV TH0,#0F0H MOV TL0,#0CH SETB TR0 SETB ET0 SETB EA MAIN: AJMP MAIN T0中断服务程序 T0INT: CPL P1.0
MOV TL0,#0CH MOV TH0,#0F0H RETI
余的均计入高8位TH0的初值。
3、假设单片机晶振fosc=6MHz,请利用T0和P1.0输出矩形波,矩形波的高电平宽50us,低电平宽300us。(P.145 第13)
晶振fosc=6MHz→机器周期为2us
定时器T0使之工作于模式3
定时50us的初值为:256-25=231 (E7H) 定时300US的初值为:256-150=106 (6AH) 方法1:
MOV TMOD , #00000011B ;T0工作于模式3 MOV TCON ,#0 ;清TR0 , TF0
MOV TL0 , #0E7H ;高电平初值。 256-25 SETB P1.0 ;P1.0口输出高电平 SETB TR0 ;启动定时器T0
LOOP1: JNB TF0 , LOOP1 ;检测T0是否溢出 CLR TF0 ;清除溢出标志 CLR TR0 ;关闭定时器
MOV TL0 , #6AH ;写低电平初值 256-150 SETB TR0 ;启动定时器T0
CLR P1.0 ;使P1.0输出低电平
LOOP2: JNB TF0 , LOOP2 ;检测T0是否溢出 CLR TF0 ;清除溢出标志 CLR TR0 ;关闭定时器
MOV TL0 , #0E7H ;写高电平初值 256-25 SETB TR0 ;启动定时器T0
SETB P1.0 ;使P1.0输出高电平 SJMP LOOP1 ;重复
6、设fosc=12MHz,编写程序,其功能为:对T0进行初始化,使之工作于模式2,产生200us的定时,并用查询T0溢出标志TF0的方法,控制P1.0引脚输出周期为2ms的方波。(P.146 第18题)
MOV TMOD , #02H ; T0工作于模式2,定时方式
MOV TCON , #0 ; 清除TF0、TR0。 MOV TH0 , #56 ; (256-200)=56 MOV TL0 , #56 ;
MOV R7 , #5 ; 200us与1ms是5倍的关系 SETB TR0 ; 启动定时器T0 SETB P1.0 ; 将P1.0置高电平
LOOP: JNB TF0 , LOOP ; 检测T0的溢出标志
CLR TF0 ; 清除T0的溢出标志 DJNZ R7 , LOOP ; 是否到5次
MOV R7 , #5 ; 重新写入计数次数 CPL P1.0 ; 取反P1.0口 SJMP LOOP ; 循环往复
9、当系统选用6MHz晶体振荡器时,由T0工作在方式为2,利用中断响应,产生周期为2ms(脉冲宽度为1ms)的方波序列,并由P1.0输出。 (1)写出T0定时器的方式控制字,T0定时器初值计算。 (2)试编写程序完成此功能。
思路:
方波的周期为2ms,每隔1ms对P1.0取反,可完成题目要求。
系统晶体振荡器的频率为6MHz,机器周期为2us,定时器T0在方式2时,最大定时256us×2=512us,达不到1ms的要求,故将定时器T0的初始值选为:256-250=6(定时0.5ms),两次后取反P1.0 口。 (1)T0的初始值为: X=256-250=6 T0的控制字为:
MOV TMOD , #20H MOV TCON , #0 (2)参考程序如下: ORG 0000H SJMP Main ORG 000BH AJMP T0 ORG 0030H
Main: MOV TMOD , #20H ;定时器T1工作于方式2 CLR TR0 ;关闭定时器T1
CLR TF0 ;清除定时器T1溢出标志 MOV IE , #02H ;允许定时器T1中断 MOV IP , #0 ;不设置悠闲级别 MOV TH0 , #6 ;定时器T1初值 MOV TL0 , #6 ;(256-250=6)
MOV R7 , #2 ;定时0.5ms与1ms的2倍的关系 SETB TR0 ;启动定时器T1 SETB EA ;开中断 SJMP $
T0: DJNZ R7 , NEXT ;两次是否到?未到则中断返回,到则继续 CPL P1.0 ;取反P1.0口 MOV R7 , #2 ;重置2倍的关系 NEXT: RETI ;中断返回
12、要求从P1.1引脚输出1000Hz方波,晶振频率为12MHz。试设计程序。
思路:
(1)只要使P1.1每隔500μs取反一次即可得到1ms方波;。
(2)将T1设为定时方式0:GATE=0,C/T(—)=0,M1M0=00;T0不用可为任意,只要不使其进入方式3,一般取0即可。故TMOD=00H。下面计算500μs定时T1的初值:
机器周期: T=1μs ,设初值为X则:
X=8192-500=7692=1111000001100 B =1111000000110 B
= F 0 0 C H
因为在作13位计数器用时,TL1高3位未用,应写0,X的低5位装入TL1的低5位,所以TL1=#0CH;X的高8位应装入TH1,所以TH1=#F0H。 参考源程序如下:
MOV TCON , #0 ;清TF1、TR1
MOV TMOD , #0 ;定时器T1工作于方式0 MOV TH1 , #0F0H ;定时500us的初值 MOV TL1 , #0CH ;8192-500=7692=F00CH SETB TR1 ;启动定时器T1
LOOP: JNB TF1 , LOOP ;等待定时500us的溢出 CLR TF1 ;清除溢出标志 CPL P1.1 ;取反P1.1口 CLR TR1 ;关闭定时器T1
MOV TH1 , #0F0H ;重写定时500us的初值 MOV TL1 , #0CH ;重写定时500us的初值 SETB TR1 ;启动定时器T1 SJMP LOOP
13、试用定时/计数器T1对外部事件计数。要求每计数100,就将T1改成定时方式,控制P1.7输出一个脉宽为10ms的正脉冲,然后又转为计数方式,如此反复循环。设晶振频率为12MHz。
定时器T1确定工作于方式1
计数100的初始值为:65536-100 100=64+32+4=01100100 B
65536-100=1111 1111 1001 1100 B = FF9CH 定时10ms的初始值为:65536-10000
5000=4096+512+256+128+8 =1001110001000
65536-5000=60536=1110 1100 0111 1000 B = EC78H 参考程序如下:
LOOP3: CLR TR1 ;关闭定时器T1
CLR TF1 ;清除定时器T1的溢出标志 MOV TMOD 50H ;定时器T1工作于方式1,计数
MOV TH1 , #0FFH ;计数100的初值
MOV TL1 , #9CH ;65536-100=FF9CH SETB TR1 ;启动定时器T1 LOOP1: JNB TF1 , LOOP1 ;等待计数100溢出
MOV TMOD , #10H ;定时器T1工作于方式1,定时 CLR TF1 ;清除定时器溢出标志 CLR TR1 ;关闭定时器T1 MOV TH1 , #0ECH ;定时10ms的初值 MOV TL1 , #78H ;65536-5000=EC78H SETB TR1 ;启动定时器T1
LOOP2: JNB TF1 , LOOP2 ;等待定时10ms溢出 CPL P1.7 ;取反P1.7口 SJMP LOOP3 ;返回循环
14、若单片机晶振为12MHz,利用定时器1方式1,产生1ms的定时,在P1.0脚产生周期为2ms方波,用查询方式工作,查询标志为TF1。 已知fosc =12MHz→1个机器周期为1us 1ms=1000us
初值=65536-1000=54536
64536转换为二进制:1111 1100 0001 1000 T0的低8位:00011000 (18H) T0的高8位:11110000 (FCH) 则有: (TL0) ←#18H ; (TH0) ←#0FCH 参考源程序如下:
MOV TCON , #10H ;定时器T1工作于方式1 MOV TMOD , #0 ;清除TR1、TF1 MOV TH1 , #0FCH ;定时1ms的初值 MOV TL1 , #18H ;65536-1000=FC18H SETB TR1 ;启动定时器T1
LOOP: JNB TF1 , LOOP ;等待定时1ms的溢出 CLR TF1 ;清除溢出标志 CPL P1.0 ;取反P1.0口 CLR TR1 ;关闭定时器T1
MOV TH1 , #0FCH ;重写定时1ms的处值 MOV TL1 , #18H ;重写定时1ms的处值 SETB TR1 ;启动定时器T1