《【精编版】第6章作业及答案.pdf》由会员分享,可在线阅读,更多相关《【精编版】第6章作业及答案.pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 5 章作业1、说明定时器 T0的四种工作方式。(P.145 第 6 题)M1 M0 工作模式功 能 说 明0 0 0 13 位的定时/计数模式,TL0的高 3 位没用。0 1 1 16 位的定时/计数模式1 0 2 8 位、初始值自动加载的定时/计数模式。1 1 3 将 T0 分成两个相互独立的、8 位的定时/计数模式。2、假设单片机晶振fosc=6MHz,若要求定时分别为0.1ms,1ms,10ms,定时器 T0 工作在方式 0、方式 1、方式 2 时,其初值应为多少?晶振 fosc=6MHz,则机器周期为2us 定时 0.1ms 时的初始值:50=110010 B 模式 0:(213-
2、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)=
3、(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
4、-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 输出
5、低电平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 是否
6、溢出 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 引脚分别
7、输出周期为 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置高电平
8、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清
9、零 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 ;返回
10、重复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,T
11、L0 ;将计数结果写入 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 倍的
12、关系 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 STA
13、RT: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 T
14、F1 ;清除 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 为
15、高电平 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 的方波,即每隔秒钟中断
16、一次,利用中断间隔测P3.5 引脚的脉冲数。ORG 0000H SJMP Main ;转移到主程序 ORG 001BH AJMP T1 ;转移到真正的中断服务程序 ORG 0030H Main:MOV TMOD,#50H;定时器 T1:方式、计数、开关由软件控制 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 ;判
17、断是否开始计数 SETB TR1 ;启动计数器 SETB F0 ;计数标志置 SJMP NEXT1 ;转移 NEXT:CLR TR1 ;关闭计数器 CLR F0 ;计数标志清 MOV DPTR,#2100H;地址指针指向目标地址 MOV A,TL1;读计数器的低位 MOVX DPTR,A;存计数器的低位 MOV A,TH1 ;读计数器的高位 INC DPTR;地址指针加 MOVX DPTR,A ;存计数器的高位 NEXT1:JNB P3.3,NEXT1;等待 P3.3 引脚上出现高电平 RETI ;中断返回9、当系统选用 6MHz晶体振荡器时,由T0 工作在方式为,利用中断响应,产生周期为 2
18、ms(脉冲宽度为 1ms)的方波序列,并由P1.0 输出。(1)写出 T0定时器的方式控制字,T0定时器初值计算。(2)试编写程序完成此功能。思路:方波的周期为 2ms,每隔 1ms对 P1.0 取反,可完成题目要求。系统晶体振荡器的频率为6MHz,机器周期为 2us,定时器 T0 在方式 2 时,最大定时 256us2=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 000
19、0H 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 ;两次是否到?未
20、到则中断返回,到则继续 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 ;关闭定时
21、器 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)设晶振 fosc=12MHz,则 T0 在方式 1 时的初始值为 X=65536
22、-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;不
23、设置优先级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,一般取
24、 0 即可。故 TMOD=00H。下面计算 500s 定时 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 T
25、L1,#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的正脉冲,然后又转为计数方式
26、,如此反复循环。设晶振频率为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 ;定时
27、器 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溢出
28、 CPL P1.7 ;取反 P1.7 口 SJMP LOOP3 ;返回循环14、若单片机晶振为12MHz,利用定时器1 方式 1,产生 1ms的定时,在 P1.0脚产生周期为 2ms方波,用查询方式工作,查询标志为TF1。已知 fosc=12MHz1 个机器周期为 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
29、工作于方式 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,试用定时
30、器 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