第6章作业及答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第6章作业
1、说明定时器T0的四种工作方式。

(P.145 第6题)
2、假设单片机晶振fosc=6MHz,若要求定时分别为0.1ms , 1ms , 10ms,定时器T0工作在方式0、方式1、方式2时,其初值应为多少?
晶振fosc=6MHz,则机器周期为2us
定时0.1ms时的初始值:
50=110010 B
模式0:(213-50)=(8192-50)=8142=1111 1110 0 1110 B
TH0=#FEH0 ; TL0=#0EH
模式1:(216-50)=(65536-50)=65486=1111 1111 1100 1110 B
TH0=#0FFH ;TL0=#0CEH
模式2:(28-50)=(256-50)=206=1100 1110 B
TH0=#0CEH ; TL0=#0CEH
定时1ms时的初始值:
500=111110100 B
模式0:(213-500)=(8192-500)=7692=1111 0000 0 1100 B
TH0=#0F0H ; TL0=#0CH
模式1:(216-500)=(65536-500)=65036=1111 1110 0000 1100 B
TH0=#0FEH ; TL0=#0CH
定时10ms时的初始值:
5000=1001110001000 B
模式1:(216-5000)=(65536-5000)=60536=1110 1100 0111 1000 B
TH0=#0ECH ; TL0=#78H
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 ;重复
方法2:
MOV TMOD , #03H ; T0工作于模式3
MOV TCON , #0 ; 清TR0 , TF0
MOV TL0 , #0E7H ; 高电平初值。

256-25
SETB P1.0 ; P1.0口输出高电平
SETB TR0 ; 启动定时器T0
LOOP: JNB TF0 , LOOP ; 检测T0是否溢出
CLR TF0 ; 清除溢出标志
CLR TR0 ; 关闭定时器
JNB P1.0 , NEXT ; P1.0口为低电平转移,
; 高电平顺序执行
MOV TL0 , #6AH ; 定时器T0写入低电平的定时初值
SETB TR0 ; 启动定时器T0
CLR P1.0 ; P1.0口输出低电平
SJMP LOOP ; 返回重复
NEXT: MOV TL0 , #0E7H ; 定时器T0写入高电平的定时初值 SETB TR0 ; 启动定时器T0
SETB P1.0 ; P1.0口输出高电平
SJMP LOOP ; 返回重复
4、假设单片机晶振fosc=12MHz,用T1定时,试编程由P1.0和P1.1引脚分别输出周期为2ms和500us的方波。

(P.145 第14题)
晶振fosc=6MHz→机器周期为1us
定时器T0使之工作于模式1
定时250us的初值为:65536-250 = 65286 = 1111 1111 0000 0110 B = FF06 H
方法一:
MOV TMOD , #10H ; T1工作于模式1
MOV TCON , #0 ; TR1、TF1清零
MOV TH1 , #0FFH ; 65536-250=(FF06H)
MOV TL1 , #05H ;
MOV R7 , #4 ; 2ms是500us的4倍
SETB P1.0 ; P1.0置高电平
SETB P1.1 ; P1.1置高电平
SETB TR1 ; 启动定时器T1
LOOP: JNB TF1 , LOOP ; 定时器是否溢出?
CLR TF1 ; 定时器溢出后,清除定时器溢出标志 CPL P1.1 ; 取反P1.1
DJNZ R7 , NEXT ; 4倍关系是否满足?
MOV R7 , #4 ; 重写4倍关系
CPL P1.0 ; 取反P1.0
NEXT: CLR TR1 ; 关闭定时器T1
MOV TH1 , #0FFH ; 重写定时器T1的初值
MOV TL1 , #06H ;
SETB TR1 ; 启动定时器T1
SJMP LOOP ; 返回重复
方法二:
MOV TMOD , #20H ; T1工作于模式2
MOV TCON , #0 ; TR1、TF1清零
MOV TH1 , #6 ; 定时500us的初值(256-250)=6 MOV TL1 , #6 ;
MOV R7 ,#4 ; 500us与2ms是4倍的关系
SETB P1.0 ; 将P1.0置高电平
SETB P1.1 ; 将P1.1置高电平
SETB TR1 ; 启动定时器T1
LOOP: JNB TF1 , LOOP ; 定时器T1是否溢出
CLR TF1 ; 清溢出标志TF1
CPL P1.1 ; 取反P1.1口
DJNZ R7 ,LOOP ; (R7)-1→(R7),(R7)是否为0
CPL P1.0 ; 取反P1.0口
MOV R7 , #4 ; 重写R7
SJMP LOOP ; 返回重复
5、编写程序,其功能为:当P1.2引脚的电平上跳时,对P1.1输入的脉冲进行记数;当P1.2引脚的的电平下跳时,停止记数,并将结果存入R7R6中。

(P.146 第17题)
MOV TMOD , #05H ; 定时器T0工作于方式1,计数方式 MOV TCON , #0 ; 清除TF0、TR0。

MOV TH0 , #0 ; 定时器T0初始值清零
MOV TL0 , #0 ;
LOOP1: JNB P1.2 , LOOP1 ; P1.2的电平是否上跳
SETB TR0 ; 启动定时器T0开始计数LOOP2: JB P1.2 , LOOP2 ; P1.2的电平是否下跳
CLR TR0 ; 停止计数
MOV A , TL0 ; 将计数结果写入R7、R6,
MOV R6 , A ; R6写入低8位
MOV A , TH0 ;
MOV R7 , A ; R7写入高8位
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 ; 循环往复
7、fosc=6MHz,用模式1编程实现:以定时器T1进行外部事件计数,每计数1000个脉冲后,定时器T1转为定时工作方式,定时10ms后又转为计数方式,如此循环不止。

(P.145 第8题)
MOV TCON , #0 ; 清TF1、TR1
START: MOV TMOD , #50H ; T1工作于模式1,计数方式
MOV TH1 , #0FCH ; (65536-1000)=FC18H
MOV TL1 , #18H ;
SETB TR1 ; 启动T1,计数开始
LOOP1: JNB TF1 , LOOP1 ; 检测T1溢出标志
CLR TF1 ; 清除T1溢出标志
MOV TMOD , #10H ; T1工作于模式1,定时方式 CLR TR1 ; 关闭T1
MOV TH1 , #0ECH ; (65536-5000)=EC6EH
MOV TL1 , #6EH ;
SETB TR1 ; 启动定时器T1
LOOP2: JNB TF1 , LOOP2 ; 检测T1溢出标志
CLR TF1 ; 清除T1溢出标志
CLR TR1 ; 关闭T1
SJMP START ; 循环不止
第5章参考作业及答案
8、89C51单片机的P3.3口有1Hz的方波输入,P3.5口有频率介于1KHz—5KHz 的周期信号输入,试利用定时器T1的相关功能,编程计算该周期信号的频率,并将其存于片外RAM2100H单元中。

MOV TMOD , #D0H ;T1:方式1、计数、开关由TR1和P3.3联合控制 CLR TF1 ;清除溢出标志
CLR TR1 ;关闭定时器
MOV TH1 , #0 ;写入计数初值
MOV Tl1 , #0 ;
LOOP1: JNB P3.3 , LOOP1 ;等待P3.3为高电平
SETB TR1 ;启动定时器T1
LOOP2: JB P3.3 , LOOP2 ;等待计数结束
CLR TR1 ;关闭定时器T1
CLR C ;清除进位标志
MOV A , TL1 ;读取计数脉冲数的低8位
RLC A ;低8位×2
MOV DPTR , #2100H ;片外目的数据存储器地址指针
MOVX @DPTR , A ;低8位存入要求的目标地址
INC DPTR ;目标地址+1
MOV A ,TH1 ;读取计数脉冲数的高8位
RLC A ;低8位×2
MOVX @DPTR , A ;低8位存入要求的目标地址
方法二:利用中断方式
思路:P3.3引脚上输入1Hz的方波,即每隔1秒钟中断一次,利用中断间隔测P3.5引脚的脉冲数。

ORG 0000H
SJMP Main ;转移到主程序
ORG 001BH
AJMP T1 ;转移到真正的中断服务程序
ORG 0030H
Main: MOV TMOD , #50H ;定时器T1:方式1、计数、开关由软件控制 CLR TF1 ;清除定时器溢出标志
CLR TR1 ;关闭定时器T1
MOV IE , #08H ;允许定时器T1中断
MOV IP , #0 ;未设置中断优先级别
MOV TH1 , #0 ;计数初值
MOV TL1 , #0 ;
CLR F0 ;清除开始计数标志
SETB EA ;开中断
SJMP $ ;等待中断
T1: JB F0 , NEXT ;判断是否开始计数
SETB TR1 ;启动计数器
SETB F0 ;计数标志置1
SJMP NEXT1 ;转移
NEXT: CLR TR1 ;关闭计数器
CLR F0 ;计数标志清0
MOV DPTR , #2100H ;地址指针指向目标地址
MOV A , TL1 ;读计数器的低8位
MOVX @DPTR , A ;存计数器的低8位
MOV A , TH1 ;读计数器的高8位
INC DPTR ;地址指针加1
MOVX @DPTR , A ;存计数器的高8位
NEXT1: JNB P3.3 , NEXT1 ;等待P3.3引脚上出现高电平
RETI ;中断返回
9、当系统选用6MHz晶体振荡器时,由T0工作在方式为2,利用中断响应,产生周期为2ms(脉冲宽度为1ms)的方波序列,并由P1.0输出。

(1)写出T
0定时器的方式控制字,T
定时器初值计算。

(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 ;中断返回
10、有一个频率为10MHz的方波信号,要求用定时器对该方波信号计数,每计满100个脉冲,将P1.1脚上的电平取反。

思路:
利用定时器T0方式2对P3.2引脚上输入的脉冲进行计数,每计数100,取反P1.0口。

定时器T0在方式2时的初始值为:X=256-100=156(9CH)
采用对定时器T0的溢出标志TF0扫描的方式编程。

参考程序如下:
MOV TMOD , #06H ;定时器T0工作于方式2
CLR TR0 ;关闭定时器T0
CLR TF0 ;清除定时器T0的溢出标志
MOV TH0 , #156 ;计数100的初值
MOV TL0 , #156 ;256-100=156
SETB TR0 ;启动定时器T0
LOOP: JNB TF0 , LOOP ;等待溢出
CLR TF0 ;清除定时器T0的溢出标志
CPL P1.0 ;取反P1.0口
SJMP LOOP ;重复循环
11、(同第7题)按以下要求编写8051单片机定时器的初始化程序:
(1)T0作为定时,定时时间为10ms.
(2)T1作为计数,记满1000溢出。

(1)设晶振f osc=12MHz,则T0在方式1时的初始值为X=65536-10000=55536
10000=8192+1024+512+256+16=10011100010000
X=1101 1000 1111 0000 B = #D8F0H
定时器T1在方式1时的初始值为:Y=65536-1000
1000=512+256+128+64+32+8=111111000
Y=1111 1110 0000 1000 B = FE08H
(2) 初始化参考程序
MOV TMOD , #01010001B ; T0方式1(定时),T1方式1(计数)
MOV TCON , #0 ;清TR0、TF0、TR1、TF1
MOV IE , #0AH ;允许T0、T1中断
MOV IP , #0 ;不设置优先级
MOV TH0 , #D8H ;T0的初始值
MOV TL0 , #0F0H ;65536-10000=D8F0H
MOV TH1 , #0FEH ;T1的初始值
MOV TL1 , #08H ;65536-1000=FE08H
SETB TR0 ;启动定时器T0
SETB TR1 ;启动定时器T1
SETB EA ;开中断
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
=1111 0000 0 0110 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
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。

相关文档
最新文档