《作业及复习资料分析.docx》由会员分享,可在线阅读,更多相关《作业及复习资料分析.docx(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第6章作业1、说明定时器T0的四种工作方式。(P.145 第6题)M1 M0工作模式功 能 说 明0 0013位的定时/计数模式,TL0的高3位没用。0 1116位的定时/计数模式1 028位、初始值自动加载的定时/计数模式。1 13将T0分成两个相互独立的、8位的定时/计数模式。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
2、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
3、 0000 1100 B TH0=#0FEH ; TL0=#0CH定时10ms时的初始值: 5000=10 B 模式1:(216-5000)=(65536-5000)=60536=1110 1100 0111 1000 B TH0=#0ECH ; TL0=#78H3、假设单片机晶振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: MO
4、V TMOD , #00000011B ;T0工作于模式3 MOV TCON ,#0 ;清TR0 , TF0 MOV TL0 , #0E7H ;高电平初值。 256-25 SETB TR0 ;启动定时器T0LOOP1: JNB TF0 , LOOP1 ;检测T0是否溢出 CLR TF0 ;清除溢出标志 CLR TR0 ;关闭定时器 MOV TL0 , #6AH ;写低电平初值 256-150 SETB TR0 ;启动定时器T0LOOP2: JNB TF0 , LOOP2 ;检测T0是否溢出 CLR TF0 ;清除溢出标志 CLR TR0 ;关闭定时器 MOV TL0 , #0E7H ;写高电平
5、初值 256-25 SETB TR0 ;启动定时器T0 SJMP LOOP1 ;重复方法2: MOV TMOD , #03H ; T0工作于模式3 MOV TCON , #0 ; 清TR0 , TF0 MOV TL0 , #0E7H ; 高电平初值。 256-25 SETB P1.0 ; SETB TR0 ; 启动定时器T0 LOOP: JNB TF0 , LOOP ; 检测T0是否溢出 CLR TF0 ; 清除溢出标志 CLR TR0 ; 关闭定时器 JNB P1.0 , NEXT ; P1.0口为低电平转移,; 高电平顺序执行 MOV TL0 , #6AH ; 定时器T0写入低电平的定时初
6、值 SETB TR0 ; 启动定时器T0 CLR P1.0 ; SJMP LOOP ; 返回重复 NEXT: MOV TL0 , #0E7H ; 定时器T0写入高电平的定时初值 SETB TR0 ; 启动定时器T0 SETB 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 = F
7、F06 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 TR1 ; 启动定时器T1LOOP: JNB TF1 , LOOP ; 定时器是否溢出? CLR TF1 ; 定时器溢出后,清除定时器溢出标志 DJNZ R7 , NEXT ; 4倍关系是否满足? MOV R7 , #4 ; 重写4倍关系NEXT: CLR TR1 ; 关闭定时器T1 MOV TH1 ,
8、 #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 TR1 ; 启动定时器T1LOOP: JNB TF1 , LOOP ; 定时器T1是否溢出 CLR TF1 ; 清溢出标志TF1 ; DJNZ R7 ,
9、LOOP ; (R7)-1(R7),(R7)是否为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 SETB TR0 ; 启动定时器T0开始计数 C
10、LR 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
11、 ; MOV R7 , #5 ; 200us及1ms是5倍的关系 SETB TR0 ; 启动定时器T0LOOP: JNB TF0 , LOOP ; 检测T0的溢出标志 CLR TF0 ; 清除T0的溢出标志 DJNZ R7 , LOOP ; 是否到5次 MOV R7 , #5 ; 重新写入计数次数 SJMP LOOP ; 循环往复7、fosc=6MHz,用模式1编程实现:以定时器T1进行外部事件计数,每计数1000个脉冲后,定时器T1转为定时工作方式,定时10ms后又转为计数方式,如此循环不止。(P.145 第8题)MOV TCON , #0 ; 清TF1、TR1START: MOV TMOD
12、 , #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 ; 启动定时器T1LOOP2: JNB TF1 , LOOP2 ; 检测T1溢
13、出标志 CLR TF1 ; 清除T1溢出标志 CLR TR1 ; 关闭T1 SJMP START ; 循环不止第5章参考作业及答案8、89C5KHz的周期信号输入,试利用定时器T1的相关功能,编程计算该周期信号的频率,并将其存于片外RAM2100H单元中。 MOV TMOD , # CLR TF1 ;清除溢出标志 CLR TR1 ;关闭定时器MOV TH1 , #0 ;写入计数初值 MOV Tl1 , #0 ; LOOP1: JNB P3.3 , LOOP1 SETB TR1 ;启动定时器T1 LOOP2: JB P3.3 , LOOP2 ;等待计数结束 CLR TR1 ;关闭定时器T1 CL
14、R 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的方波,即每隔秒钟中断一次,利用中断间隔测P3.5引脚的脉冲数。 ORG 0000H SJMP Main ;转移到主程序 ORG 001BH AJMP T1 ;转移到真
15、正的中断服务程序 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 ;判断是否开始计数 SETB TR1 ;启动计数器 SETB F0 ;计数标志置 SJMP NEXT1 ;转移 NEXT:
16、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 RETI ;中断返回 9、当系统选用6MHz晶体振荡器时,由T0工作在方式为,利用中断响应,产生周期为2ms(脉冲宽度为1ms)的方波序列,并由P1.0输出。(1)写出T0定时器的方式控制字,T0定时器初值计算。(2)试编写程序完成
17、此功能。思路: 方波的周期为2ms,可完成题目要求。系统晶体振荡器的频率为6MHz,机器周期为2us,定时器T0在方式2时,最大定时256us2=512us,达不到1ms的要求,故将定时器T0的初始值选为:256-250=6(定时0.5ms),两次后 口。(1)T0的初始值为: X=256-250=6 T0的控制字为: MOV TMOD , #20H MOV TCON , #0(2)参考程序如下: ORG 0000H SJMP Main ORG 000BH AJMP T0 ORG 0030HMain: MOV TMOD , #20H ;定时器T1工作于方式2 CLR TR0 ;关闭定时器T1
18、CLR TF0 ;清除定时器T1溢出标志 MOV IE , #02H ;允许定时器T1中断 MOV IP , #0 ;不设置悠闲级别 MOV TH0 , #6 ;定时器T1初值 MOV TL0 , #6 ;(256-250=6) MOV R7 , #2 SETB TR0 ;启动定时器T1 SETB EA ;开中断 SJMP $ T0: DJNZ R7 , NEXT ;两次是否到?未到则中断返回,到则继续 MOV R7 , #2 ;重置2倍的关系 NEXT: RETI ;中断返回10、有一个频率为10MHz的方波信号,要求用定时器对该方波信号计数,每计满100个脉冲,将脚上的电平取反。思路:利用
19、定时器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的溢出标志 SJMP
20、LOOP ;重复循环11、(同第7题)按以下要求编写8051单片机定时器的初始化程序:(1) T0作为定时,定时时间为10ms.(2) T1作为计数,记满1000溢出。(1)设晶振fosc=12MHz,则T0在方式1时的初始值为X=65536-10000=55536 10000=8192+1024+512+256+16=100 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) 初始化参
21、考程序 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 ;启动定时器T1SETB EA ;开中断12、要求从P1.1引脚输
22、出1000Hz方波,晶振频率为12MHz。试设计程序。思路:(1)s取反一次即可得到1ms方波;。(2)将T1设为定时方式0:GATE=0,C/T()=0,M1M0=00;T0不用可为任意,只要不使其进入方式3,一般取0即可。故TMOD=00H。下面计算500s定时T1的初值: 机器周期: T=1s , 设初值为X则: X=8192-500=7692=11110 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。参考源程序如下:
23、 MOV TCON , #0 ;清TF1、TR1 MOV TMOD , #0 ;定时器T1工作于方式0 MOV TH1 , #0F0H ;定时500us的初值 MOV TL1 , #0CH ;8192-500=7692=F00CH SETB TR1 ;启动定时器T1LOOP: JNB TF1 , LOOP ;等待定时500us的溢出 CLR TF1 ;清除溢出标志 CLR TR1 ;关闭定时器T1 MOV TH1 , #0F0H ;重写定时500us的初值 MOV TL1 , #0CH ;重写定时500us的初值 SETB TR1 ;启动定时器T1 SJMP LOOP13、试用定时/计数器T1
24、对外部事件计数。要求每计数100,就将T1改成定时方式,控制P1.7输出一个脉宽为10ms的正脉冲,然后又转为计数方式,如此反复循环。设晶振频率为12MHz。定时器T1确定工作于方式1计数100的初始值为:65536-100100=64+32+4=01100100 B65536-100=1111 1111 1001 1100 B = FF9CH定时10ms的初始值为:65536-100005000=4096+512+256+128+8 =1065536-5000=60536=1110 1100 0111 1000 B = EC78H参考程序如下: LOOP3: CLR TR1 ;关闭定时器T1
25、 CLR TF1 ;清除定时器T1的溢出标志 MOV TMOD 50H ;定时器T1工作于方式1,计数 MOV TH1 , #0FFH ;计数100的初值 MOV TL1 , #9CH ;65536-100=FF9CH SETB TR1 ;启动定时器T1LOOP1: 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 ;启
26、动定时器T1 LOOP2: JNB TF1 , LOOP2 ;等待定时10ms溢出 SJMP LOOP3 ;返回循环14、若单片机晶振为12MHz,利用定时器1方式1,产生1ms的定时,在产生周期为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 ,
27、 #10H ;定时器T1工作于方式1 MOV TMOD , #0 ;清除TR1、TF1 MOV TH1 , #0FCH ;定时1ms的初值 MOV TL1 , #18H ;65536-1000=FC18H SETB TR1 ;启动定时器T1LOOP: JNB TF1 , LOOP ;等待定时1ms的溢出 CLR TF1 ;清除溢出标志 CLR TR1 ;关闭定时器T1 MOV TH1 , #0FCH ;重写定时1ms的处值 MOV TL1 , #18H ;重写定时1ms的处值 SETB TR1 ;启动定时器T1 SJMP LOOP ;返回循环15、系统时钟频率为6 MHz,试用定时器T0作外部
28、计数器,编程实现每计到1000个脉冲,使T1开始2ms定时,定时时间到后,T0又开始计数,这样反复循环不止。(1) 定时器T0工作于方式1,计数1000的初值为:65536-10001000=512+256+128+64+32+8=0000 0001 1111 1000 B65536-1000=1111 1100 0001 1000 B = FC18H(2) 晶振fosc=6MHz,机器周期为2us,定时器T0工作于方式1,定时1ms的初值为:65536-500 500=256+128+64+32+16+4 = 10100 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