反复循环。设晶振频率为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 SJMP LOOP ;返回循环 15、系统时钟频率为6 MHz,试用定时器T0作外部计数器,编程实现每计到1000个脉冲,使T1开始2ms定时,定时时间到后,T0又开始计数,这样反复循环不止。
(1) 定时器T0工作于方式1,计数1000的初值为:65536-1000
1000=512+256+128+64+32+8=0000 0001 1111 1000 B 65536-1000=1111 1100 0001 1000 B = FC18H
(2) 晶振fosc=6MHz,机器周期为2us,定时器T0工作于方式1,定时1ms的初值为:65536-500
500=256+128+64+32+16+4 = 0000000111110100 B (取反+1可得到结果)
(65536-500)=65036=1111 1110 0000 1100 B
TH0=#0FEH ; TL0=#0CH (3) 参考程序如下:
LOOP3: MOV TMOD , #0000 0101 B CLR TF0 CLR TR0
MOV TH0 , #0FCH MOV TL0 , #18H SETB TR0
LOOP1: JNB TF0 , LOOP1 CLR TF0 CLR TR0
MOV TMOD , #01H MOV TH0 , #0FEH MOV TL0 , #0CH SETB TR0
LOOP2: JNB TF0 , LOOP2 SJMP LOOP3