完整版第6章作业及答案.docx

上传人:b****8 文档编号:29022205 上传时间:2023-07-20 格式:DOCX 页数:19 大小:81.42KB
下载 相关 举报
完整版第6章作业及答案.docx_第1页
第1页 / 共19页
完整版第6章作业及答案.docx_第2页
第2页 / 共19页
完整版第6章作业及答案.docx_第3页
第3页 / 共19页
完整版第6章作业及答案.docx_第4页
第4页 / 共19页
完整版第6章作业及答案.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

完整版第6章作业及答案.docx

《完整版第6章作业及答案.docx》由会员分享,可在线阅读,更多相关《完整版第6章作业及答案.docx(19页珍藏版)》请在冰豆网上搜索。

完整版第6章作业及答案.docx

完整版第6章作业及答案

第5章作业

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1