08级第四次作业讲评

更新时间:2023-11-28 07:32:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课本第二版,160页

8、利用定时器/计数器T0从P1.0输出周期为1s,脉宽为20ms的正脉冲信号,晶振频率为12MHZ。试设计程序。

解法1(讲授者提供):

波形如图所示

20ms

1000ms

从图中可分析出,高电平持续时间是20ms,低电平持续时间是980ms,低电平为高电平持续时间的49倍。

用T0的方式1(16位的定时器方式),定时20ms,采取中断方式,在中断服务程序中,利用R7作为计数的寄存器,赋值50,每次20ms中断之后将R7内容减一,当R7是50时也就是第一次20ms将P1.0置高电平,当R7小于等于49时将P1.0清零,R7减到0了则赋回初值50,而时间常数计算如下式:

其中,定时长度为20ms,并由于晶振频率为12MHZ,所以机器周期长度为1微秒

定时长度2?X?机器周期长度1620?10?3??20000 ?61?10X?65536?20000?45536?0B1E0H

程序如下:

ORG 0 SJMP MAIN ORG 0BH SJMP INT0 ORG 30H

MAIN: MOV TMOD, #1

MOV TH0, #0B1H MOV TL0, #0E0H

SETB ET0 SETB EA

MOV R7, #50 SETB P1.0 SETB TR0 SJMP $

INT0: MOV TH0, #0B1H MOV TL0, #0E0H DJNZ R7, EXIT MOV R7, #50 SETB P1.0 SIMP BACK

T0中断入口地址 开启T0中断允许,开启总中断允许 重装对应20ms的时间常数 1

EXIT: CLR P1.0 BACK: RETI END

解法2(教材著者提供,蓝色字体为原来的,红色字体为增加的批注):

采用定时20ms,然后再计数1、49次的方法实现。

a、T0工作在定时方式1时,控制字TMOD配置:

M1M0=01,GATE=0,C/T=0,可取方式控制字为01H;

b、计算计数初值X:

晶振为12 MHz,所以机器周期Tcy为1μs。 N=t/ Tcy =20×10-3/1×10-6=20000

X=216-N=65536-20000=45536=4E20H(计算错误,正确为0B1E0H)

即应将4EH(错误,应为0B1H)送入TH1中,20H(错误,应为0E0H)送入TL1中。 c、实现程序如下: ORG 0000H

AJMP MAIN ;跳转到主程序

ORG 0030H

MAIN: MOV TMOD, #01H ;设T1工作于方式2

MOV TH0, # 4EH ;装入循环计数初值(错误,应为0B1H) MOV TL0, #20H ;首次计数值(错误,应为0E0H) LP0: SETB P1.0 ACALL NT0 1次的20ms定时,总共20ms的高电平 CLR P1.0 MOV R7, #49 ;计数49次 LP1: ACALL NT0 循环49次的20ms定时,总共980ms的低电平 DJNZ R7, LP1 AJMP LP0 ;以下是20毫秒的子程序

NT0: MOV TH0, # 4EH (错误,应为0B1H) MOV TL0, #20H SETB TR0 JNB TF0, $ CLR TR0 CLR TF0 RET END

9、要求从P1.1引脚输出1000HZ的方波,晶振频率为12MHZ。试设计程序。 解法1(讲授者提供):

1000HZ的方波的周期是1ms,则每隔0.5ms对P1.1取反一次则成为一个方波信号, 用T0的方式1定时0.5ms,采取中断方式,初值计算如下式:

其中,定时长度为0.5ms,并由于晶振频率为12MHZ,所以机器周期长度为1微秒

定时长度2?X?机器周期长度160.5?10?3??500 1?10?62

X?65536?500?65036?0FE0CH

程序如下:

ORG 0 SJMP MAIN ORG 0BH T0中断入口地址 SJMP INT0 ORG 30H

MAIN: MOV TMOD, #1

MOV TH0, #0FEH MOV TL0, #0CH

SETB ET0

开启T0中断允许,开启总中断允许 SETB EA

SETB P1.1 SETB TR0 SJMP $

INT0: MOV TH0, #0FEH MOV TL0, #0CH CPL 1.1

RETI END

解法2(教材著者提供,蓝色字体为原来的,红色字体为增加的批注):

采用T0实现

a、T0工作在定时方式1时,控制字TMOD配置:

M1M0=01,GATE=0,C/T=0,可取方式控制字为01H;

b、计算计数初值X:

晶振为12 MHz,所以机器周期Tcy为1μs。1/1000=1×10-3 N=t/ Tcy =0.5×10-3/1×10-6=500

X=216-N=65536-500=65036=FE0CH

即应将FEH送入TH0中,0CH送入TL0中。

c、实现程序如下:

ORG 0000H

AJMP MAIN ;跳转到主程序

ORG 000BH ;T0的中断入口地址 LJMP DVT0

ORG 0030H

MAIN:MOV TMOD,#01H ;设T0工作于方式2(错误,改为1) MOV TH0,# 0FEH ;装入循环计数初值 MOV TL0,#0CH ;首次计数值 SETB ET0 ;T0开中断

3

SETB EA ;CPU开总中断 SETB TR0 ;启动T0 SJMP $ ;等待中断 DVT0:CPL P1.1 MOV TH0,# 0FEH MOV TL0,# 0CH

SETB TR0 ; (该指令多余) RETI END

10、试用定时器/计数器T1对外部事件计数。要求每计数100,就将T1改成定时方式,控制P1.7输出一个脉宽为10ms的正脉冲,然后又转为计数方式,如此反复循环。设晶振频率为12MHZ。

解法1(讲授者提供):

首先将T1设成方式1的计数模式,所以

(TMOD)= #50H, 而计数初值=65536-100=65436=0FF9CH 所以此时,(TH1)= #0FFH, (TL1)= #9CH 或者将T1设置成方式2的计数模式更为优越,因为此时常数自动重装,如下所示: 首先将T1设置成方式2的计数模式,所以 (TMOD)= #60H, 而计数初值=256-100=156=9CH 所以此时,(TH1)= #9CH, (TL1)= #9CH 而当计够100次之后产生中断,将T1设成方式1的定时模式,所以

(TMOD)= #10H,其中,定时长度为10ms,并由于晶振频率为12MHZ,所以机器周期长度为1微秒,定时初值计算如下:

定时长度216?X?机器周期长度10?10?3??10000 ?61?10X?65536?10000?55536?0D8F0H

所以此时,(TH1)= #0D8H, (TL1)= #0F0H

程序采用中断方式,则计数中断和定时中断都会进入该中断服务程序,由于计数中断和定时中断是交替进行的,所以用一个软件标志位表示进入中断服务程序时的“奇、偶”次,在此选取PSW的一个用户自定义位PSW.5,该位的位名称是F0,规定在F0清零的时候标志着计数功能,F0置位的时候标志着定时功能,并初始化时将F0清零,而在每次进入中断服务程序时都将它取反,从而实现计数功能与定时功能的交替。

程序如下所示:

ORG 0 SJMP MAIN ORG 1BH SJMP INT1

ORG 30H

4

MAIN: MOV TMOD, #50H

MOV TH1, #0FFH MOV TL1, #9CH CLR F0

SETB ET1 SETB EA CLR P1.7 SETB TR1 SJMP $

INT1: CPL F0 ;每次进入中断服务程序,都改变F0的奇偶性

JNB F0, POSI SETB P1.7 ;定时方式期间,P1.7高电平 MOV TMOD, #10H MOV TH1, #0D8H 定时10ms,高电平会持续10ms, MOV TL1, #0F0H 也就是正脉冲的高电平期间 SJMP EXIT POSI: CLR P1.7 ;计数方式期间,P1.7低电平 MOV TMOD, #50H MOV TH1, #0FFH 计数100次,此时也就是正脉冲的 MOV TL1, #9CH 低电平持续期间 EXIT: RETI END

解法2(教材著者提供,蓝色字体为原来的,红色字体为增加的批注):

a、T1工作在计数方式2时,控制字TMOD配置:

M1M0=10,GATE=0,C/T=1,可取方式控制字为60H; T1工作在定时方式1时,控制字TMOD配置:

M1M0=01,GATE=0,C/T=0,可取方式控制字为10H;

b、计算初值X: 定时10ms时:

晶振为12 MHz,所以机器周期Tcy为1μs。 N=t/ Tcy =10×10-3/1×10-6=10000

X=216-N=65536-10000=55536=D8F0H

即应将D8H送入TH1中,F0H送入TL1中。 计数100时:

N=100

X=28-N=256-100=156=9CH

5

本文来源:https://www.bwwdw.com/article/b64t.html

Top