第6章作业及答案.docx
《第6章作业及答案.docx》由会员分享,可在线阅读,更多相关《第6章作业及答案.docx(19页珍藏版)》请在冰豆网上搜索。
第6章作业及答案
第6章作业
1、说明定时器T0的四种工作方式。
(P.145第6题)
M1M0
工作模式
功能说明
00
0
13位的定时/计数模式,TL0的高3位没用。
01
1
16位的定时/计数模式
10
2
8位、初始值自动加载的定时/计数模式。
11
3
将T0分成两个相互独立的、8位的定时/计数模式。
2、假设单片机晶振fosc=6MHz,若要求定时分别为0.1ms,1ms,10ms,定时器T0工作在方式0、方式1、方式2时,其初值应为多少?
晶振fosc=6MHz,则机器周期为2us
定时0.1ms时的初始值:
50=110010B
模式0:
(213-50)=(8192-50)=8142=1111111001110B
TH0=#FEH0;TL0=#0EH
模式1:
(216-50)=(65536-50)=65486=1111111111001110B
TH0=#0FFH;TL0=#0CEH
模式2:
(28-50)=(256-50)=206=11001110B
TH0=#0CEH;TL0=#0CEH
定时1ms时的初始值:
500=111110100B
模式0:
(213-500)=(8192-500)=7692=1111000001100B
TH0=#0F0H;TL0=#0CH
模式1:
(216-500)=(65536-500)=65036=1111111000001100B
TH0=#0FEH;TL0=#0CH
定时10ms时的初始值:
5000=1001110001000B
模式1:
(216-5000)=(65536-5000)=60536=1110110001111000B
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:
MOVTMOD,#00000011B;T0工作于模式3
MOVTCON,#0;清TR0,TF0
MOVTL0,#0E7H;高电平初值。
256-25
SETBP1.0;P1.0口输出高电平
SETBTR0;启动定时器T0
LOOP1:
JNBTF0,LOOP1;检测T0是否溢出
CLRTF0;清除溢出标志
CLRTR0;关闭定时器
MOVTL0,#6AH;写低电平初值256-150
SETBTR0;启动定时器T0
CLRP1.0;使P1.0输出低电平
LOOP2:
JNBTF0,LOOP2;检测T0是否溢出
CLRTF0;清除溢出标志
CLRTR0;关闭定时器
MOVTL0,#0E7H;写高电平初值256-25
SETBTR0;启动定时器T0
SETBP1.0;使P1.0输出高电平
SJMPLOOP1;重复
方法2:
MOVTMOD,#03H;T0工作于模式3
MOVTCON,#0;清TR0,TF0
MOVTL0,#0E7H;高电平初值。
256-25
SETBP1.0;P1.0口输出高电平
SETBTR0;启动定时器T0
LOOP:
JNBTF0,LOOP;检测T0是否溢出
CLRTF0;清除溢出标志
CLRTR0;关闭定时器
JNBP1.0,NEXT;P1.0口为低电平转移,
;高电平顺序执行
MOVTL0,#6AH;定时器T0写入低电平的定时初值
SETBTR0;启动定时器T0
CLRP1.0;P1.0口输出低电平
SJMPLOOP;返回重复
NEXT:
MOVTL0,#0E7H;定时器T0写入高电平的定时初值
SETBTR0;启动定时器T0
SETBP1.0;P1.0口输出高电平
SJMPLOOP;返回重复
4、假设单片机晶振fosc=12MHz,用T1定时,试编程由P1.0和P1.1引脚分别输出周期为2ms和500us的方波。
(P.145第14题)
晶振fosc=6MHz→机器周期为1us
定时器T0使之工作于模式1
定时250us的初值为:
65536-250=65286=1111111100000110B
=FF06H
方法一:
MOVTMOD,#10H;T1工作于模式1
MOVTCON,#0;TR1、TF1清零
MOVTH1,#0FFH;65536-250=(FF06H)
MOVTL1,#05H;
MOVR7,#4;2ms是500us的4倍
SETBP1.0;P1.0置高电平
SETBP1.1;P1.1置高电平
SETBTR1;启动定时器T1
LOOP:
JNBTF1,LOOP;定时器是否溢出?
CLRTF1;定时器溢出后,清除定时器溢出标志
CPLP1.1;取反P1.1
DJNZR7,NEXT;4倍关系是否满足?
MOVR7,#4;重写4倍关系
CPLP1.0;取反P1.0
NEXT:
CLRTR1;关闭定时器T1
MOVTH1,#0FFH;重写定时器T1的初值
MOVTL1,#06H;
SETBTR1;启动定时器T1
SJMPLOOP;返回重复
方法二:
MOVTMOD,#20H;T1工作于模式2
MOVTCON,#0;TR1、TF1清零
MOVTH1,#6;定时500us的初值(256-250)=6
MOVTL1,#6;
MOVR7,#4;500us与2ms是4倍的关系
SETBP1.0;将P1.0置高电平
SETBP1.1;将P1.1置高电平
SETBTR1;启动定时器T1
LOOP:
JNBTF1,LOOP;定时器T1是否溢出
CLRTF1;清溢出标志TF1
CPLP1.1;取反P1.1口
DJNZR7,LOOP;(R7)-1→(R7),(R7)是否为0
CPLP1.0;取反P1.0口
MOVR7,#4;重写R7
SJMPLOOP;返回重复
5、编写程序,其功能为:
当P1.2引脚的电平上跳时,对P1.1输入的脉冲进行记数;当P1.2引脚的的电平下跳时,停止记数,并将结果存入R7R6中。
(P.146第17题)
MOVTMOD,#05H;定时器T0工作于方式1,计数方式
MOVTCON,#0;清除TF0、TR0。
MOVTH0,#0;定时器T0初始值清零
MOVTL0,#0;
LOOP1:
JNBP1.2,LOOP1;P1.2的电平是否上跳
SETBTR0;启动定时器T0开始计数
LOOP2:
JBP1.2,LOOP2;P1.2的电平是否下跳
CLRTR0;停止计数
MOVA,TL0;将计数结果写入R7、R6,
MOVR6,A;R6写入低8位
MOVA,TH0;
MOVR7,A;R7写入高8位
6、设fosc=12MHz,编写程序,其功能为:
对T0进行初始化,使之工作于模式2,产生200us的定时,并用查询T0溢出标志TF0的方法,控制P1.0引脚输出周期为2ms的方波。
(P.146第18题)
MOVTMOD,#02H;T0工作于模式2,定时方式
MOVTCON,#0;清除TF0、TR0。
MOVTH0,#56;(256-200)=56
MOVTL0,#56;
MOVR7,#5;200us与1ms是5倍的关系
SETBTR0;启动定时器T0
SETBP1.0;将P1.0置高电平
LOOP:
JNBTF0,LOOP;检测T0的溢出标志
CLRTF0;清除T0的溢出标志
DJNZR7,LOOP;是否到5次
MOVR7,#5;重新写入计数次数
CPLP1.0;取反P1.0口
SJMPLOOP;循环往复
7、fosc=6MHz,用模式1编程实现:
以定时器T1进行外部事件计数,每计数1000个脉冲后,定时器T1转为定时工作方式,定时10ms后又转为计数方式,如此循环不止。
(P.145第8题)
MOVTCON,#0;清TF1、TR1
START:
MOVTMOD,#50H;T1工作于模式1,计数方式
MOVTH1,#0FCH;(65536-1000)=FC18H
MOVTL1,#18H;
SETBTR1;启动T1,计数开始
LOOP1:
JNBTF1,LOOP1;检测T1溢出标志
CLRTF1;清除T1溢出标志
MOVTMOD,#10H;T1工作于模式1,定时方式
CLRTR1;关闭T1
MOVTH1,#0ECH;(65536-5000)=EC6EH
MOVTL1,#6EH;
SETBTR1;启动定时器T1
LOOP2:
JNBTF1,LOOP2;检测T1溢出标志
CLRTF1;清除T1溢出标志
CLRTR1;关闭T1
SJMPSTART;循环不止
第5章参考作业及答案
8、89C51单片机的P3.3口有1Hz的方波输入,P3.5口有频率介于1KHz—5KHz的周期信号输入,试利用定时器T1的相关功能,编程计算该周期信号的频率,并将其存于片外RAM2100H单元中。
MOVTMOD,#D0H;T1:
方式1、计数、开关由TR1和P3.3联合控制
CLRTF1;清除溢出标志
CLRTR1;关闭定时器
MOVTH1,#0;写入计数初值
MOVTl1,#0;
LOOP1:
JNBP3.3,LOOP1;等待P3.3为高电平
SETBTR1;启动定时器T1
LOOP2:
JBP3.3,LOOP2;等待计数结束
CLRTR1;关闭定时器T1
CLRC;清除进位标志
MOVA,TL1;读取计数脉冲数的低8位
RLCA;低8位×2
MOVDPTR,#2100H;片外目的数据存储器地址指针
MOVX@DPTR,A;低8位存入要求的目标地址
INCDPTR;目标地址+1
MOVA,TH1;读取计数脉冲数的高8位
RLCA;低8位×2
MOVX@DPTR,A;低8位存入要求的目标地址
方法二:
利用中断方式
思路:
P3.3引脚上输入1Hz的方波,即每隔1秒钟中断一次,利用中断间隔测P3.5引脚的脉冲数。
ORG0000H
SJMPMain ;转移到主程序
ORG001BH
AJMPT1 ;转移到真正的中断服务程序
ORG0030H
Main:
MOVTMOD,#50H ;定时器T1:
方式1、计数、开关由软件控制
CLRTF1 ;清除定时器溢出标志
CLRTR1 ;关闭定时器T1
MOVIE,#08H ;允许定时器T1中断
MOVIP,#0 ;未设置中断优先级别
MOVTH1,#0 ;计数初值
MOVTL1,#0 ;
CLRF0 ;清除开始计数标志
SETBEA;开中断
SJMP$ ;等待中断
T1:
JBF0,NEXT;判断是否开始计数
SETBTR1 ;启动计数器
SETBF0 ;计数标志置1
SJMPNEXT1 ;转移
NEXT:
CLRTR1 ;关闭计数器
CLRF0 ;计数标志清0
MOVDPTR,#2100H ;地址指针指向目标地址
MOVA,TL1;读计数器的低8位
MOVX@DPTR,A ;存计数器的低8位
MOVA,TH1 ;读计数器的高8位
INCDPTR ;地址指针加1
MOVX@DPTR,A;存计数器的高8位
NEXT1:
JNBP3.3,NEXT1 ;等待P3.3引脚上出现高电平
RETI ;中断返回
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的控制字为:
MOVTMOD,#20HMOVTCON,#0
(2)参考程序如下:
ORG0000H
SJMPMain
ORG000BH
AJMPT0
ORG0030H
Main:
MOVTMOD,#20H;定时器T1工作于方式2
CLRTR0;关闭定时器T1
CLRTF0;清除定时器T1溢出标志
MOVIE,#02H;允许定时器T1中断
MOVIP,#0;不设置悠闲级别
MOVTH0,#6;定时器T1初值
MOVTL0,#6;(256-250=6)
MOVR7,#2;定时0.5ms与1ms的2倍的关系
SETBTR0;启动定时器T1
SETBEA;开中断
SJMP$
T0:
DJNZR7,NEXT;两次是否到?
未到则中断返回,到则继续
CPLP1.0;取反P1.0口
MOVR7,#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扫描的方式编程。
参考程序如下:
MOVTMOD,#06H;定时器T0工作于方式2
CLRTR0;关闭定时器T0
CLRTF0;清除定时器T0的溢出标志
MOVTH0,#156;计数100的初值
MOVTL0,#156;256-100=156
SETBTR0;启动定时器T0
LOOP:
JNBTF0,LOOP;等待溢出
CLRTF0;清除定时器T0的溢出标志
CPLP1.0;取反P1.0口
SJMPLOOP;重复循环
11、(同第7题)按以下要求编写8051单片机定时器的初始化程序:
(1)T0作为定时,定时时间为10ms.
(2)T1作为计数,记满1000溢出。
(1)设晶振fosc=12MHz,则T0在方式1时的初始值为X=65536-10000=55536
10000=8192+1024+512+256+16=10011100010000
X=1101100011110000B=#D8F0H
定时器T1在方式1时的初始值为:
Y=65536-1000
1000=512+256+128+64+32+8=111111000
Y=1111111000001000B=FE08H
(2)初始化参考程序
MOVTMOD,#01010001B;T0方式1(定时),T1方式1(计数)
MOVTCON,#0;清TR0、TF0、TR1、TF1
MOVIE,#0AH;允许T0、T1中断
MOVIP,#0;不设置优先级
MOVTH0,#D8H;T0的初始值
MOVTL0,#0F0H;65536-10000=D8F0H
MOVTH1,#0FEH;T1的初始值
MOVTL1,#08H;65536-1000=FE08H
SETBTR0;启动定时器T0
SETBTR1;启动定时器T1
SETBEA;开中断
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=1111000001100B
=1111000000110B
=F00CH
因为在作13位计数器用时,TL1高3位未用,应写0,X的低5位装入TL1的低5位,所以TL1=#0CH;X的高8位应装入TH1,所以TH1=#F0H。
参考源程序如下:
MOVTCON,#0;清TF1、TR1
MOVTMOD,#0;定时器T1工作于方式0
MOVTH1,#0F0H;定时500us的初值
MOVTL1,#0CH;8192-500=7692=F00CH
SETBTR1;启动定时器T1
LOOP:
JNBTF1,LOOP;等待定时500us的溢出
CLRTF1;清除溢出标志
CPLP1.1;取反P1.1口
CLRTR1;关闭定时器T1
MOVTH1,#0F0H;重写定时500us的初值
MOVTL1,#0CH;重写定时500us的初值
SETBTR1;启动定时器T1
SJMPLOOP
13、试用定时/计数器T1对外部事件计数。
要求每计数100,就将T1改成定时方式,控制P1.7输出一个脉宽为10ms的正脉冲,然后又转为计数方式,如此反复循环。
设晶振频率为12MHz。
定时器T1确定工作于方式1
计数100的初始值为:
65536-100
100=64+32+4=01100100B
65536-100=1111111110011100B=FF9CH
定时10ms的初始值为:
65536-10000
5000=4096+512+256+128+8=1001110001000
65536-5000=60536=1110110001111000B=EC78H
参考程序如下:
LOOP3:
CLRTR1;关闭定时器T1
CLRTF1;清除定时器T1的溢出标志
MOVTMOD50H;定时器T1工作于方式1,计数
MOVTH1,#0FFH;计数100的初值
MOVTL1,#9CH;65536-100=FF9CH
SETBTR1;启动定时器T1
LOOP1:
JNBTF1,LOOP1;等待计数100溢出
MOVTMOD,#10H;定时器T1工作于方式1,定时
CLRTF1;清除定时器溢出标志
CLRTR1;关闭定时器T1
MOVTH1,#0ECH;定时10ms的初值
MOVTL1,#78H;65536-5000=EC78H
SETBTR1;启动定时器T1
LOOP2:
JNBTF1,LOOP2;等待定时10ms溢出
CPLP1.7;取反P1.7口
SJMPLOOP3;返回循环
14、若单片机晶振为12MHz,利用定时器1方式1,产生1ms的定时,在P1.0脚产生周期为2ms方波,用查询方式工作,查询标志为TF1。
已知fosc=12MHz→1个机器周期为1us
1ms=1000us
初值=65536-1000=54536
64536转换为二进制:
1111110000011000
T0的低8位:
00011000(18H)
T0的高8位:
11110000(FCH)
则有:
(TL0)←#18H;(TH0)←#0FCH
参考源程序如下:
MOVTCON,#10H;定时器T1工作于方式1
MOVTMOD,#0;清除TR1、TF1
MOVTH1,#0FCH;定时1ms的初值
MOVTL1,#18H;65536-1000=FC18H
SETBTR1;启动定时器T1
LOOP:
JNBTF1,LOOP;等待定时1ms的溢出
CLRTF1;清除溢出标志
CPLP1.0;取反P1.0口
CLRTR1;关闭定时器T1
MOVTH1,#0FCH;重写定时1ms的处值
MOVTL1,#18H;重写定时1ms的处值
SETBTR1;启动定时器T1
SJMPLOOP;返回循环
15、系统时钟频率为6MHz,试用定时器T0作外部计数器,编程实现每计到1000个脉冲,使T1开始2ms定时,定时时间到后,T0又开始计数,这样反复循环不止。
(1)定时器T0工作于方式1,计数1000的初值为:
65536-1000
1000=512+256+128+64+32+8=0000000111111000B
65536-1000=1111110000011000B=FC18H
(2)晶振fosc=6MHz,机器周期为2us,定时器T0工作于方式1,定时1ms的初值为:
65536-500
500=256+128+64+32+16+4=0000000111110100B(取反+1可得到结果)
(65536-500)=65036=1111111000001100B
TH0=#0FEH;TL0=#0CH
(3)参考程序如下:
LOOP3:
MOVTMOD,#00000101B
CLRT