SJMP $ ;等待中断发生
ORG 400H
X0IPG: MOV R3, #TL0 ;将刚过去的那个高电平的宽度送入R2,R3 MOV R2, #TH0
MOV TH0, #0 ;TH0、TL0重装初值为0,为下次测量作好准备 MOV TL0, #0 RETI
END
若上题中被测信号的宽度大于65.536ms,即可能超过两个字节,我们假定其结果不超过3个字节(即在fosc=12MHZ的条件下,被测信号宽度小于16777.216ms),这时为正确记录整个宽度,必须借助一个高位字节寄存器记录第三字节的内容,当T0计时溢出时,该寄存器加1。 程序修改如下(设结果放入R1,R2,R3) ORG 0 LJMP MAIN ORG 3 ;外部中断0入口 LJMP X0IPG ORG 11 ;T0中断入口 INC 30H ;T0每溢出一次,高位字节寄存器30H加1 RETI ;由T0中断返回 ORG 200H MAIN: MOV SP, #50H ;堆栈指针初始化
MOV TMOD, #09H ;T0外部启动,定时器方式,模式1 MOV 30H, #0 ;清除高位字节寄存器 MOV TH0, #0 ;TH0、TL0初值为0 MOV TL0, #0 SETB IT0 ;外部中断0边沿触发模式 SETB EA ;开放中断 SETB EX0 ;允许外部中断0 SETB ET0 ;允许T0中断 SETB TR0 ;T0内部启动信号置1,准备好接收外部启动信号(即P3.2引脚上的高电平) SJMP $ ;等待中断发生
ORG 400H
X0IPG: MOV R3, #TL0 ;将刚过去的那个高电平的宽度送入R1,R2,R3 MOV R2, #TH0 MOV R1, 30H
MOV TH0, #0 ;TH0、TL0重装初值为0,为下次测量作好准备 MOV TL0, #0 MOV 30H, #0 ;清除高位字节寄存器 RETI
附加题2:用T0测量外部脉冲信号的周期,脉冲信号由冲周期<65.536ms,将测量结果送入R2R3。
分析:测量信号周期可借助T0的内部定时方式来完成,当外部脉冲信号的第一个下降沿到来时,触发
(P3.2)输入,假设系统fosc=12MHZ,待测脉
中断,中断服务子程序启动T0计时(T0的初值预设为0);当第二个下降沿再次触发中断时,中断服
务子程序将T0当前值寄存器(TH0,TL0)的内容送入结果单元R2,R3,同时清零TH0,TL0,作为下一次测量的起点;当第三个下降沿触发
中断时,中断服务子程序重复第二次中断的动作,即输出结果,清零
TH0,TL0。依此类推,子子孙孙无穷匮矣。 ORG 0 LJMP MAIN ORG 3 LJMP X0IPG ORG 200H MAIN: MOV SP, #50H ;堆栈指针初始化
MOV TMOD, #01H ;T0内部启动,定时器方式,模式1 MOV TH0, #0 ;TH0、TL0初值为0 MOV TL0, #0 SETB IT0 ;外部中断0边沿触发模式 SETB EA ;开放中断 SETB EX0 ;允许外部中断0 SJMP $ ;等待中断发生
ORG 400H
X0IPG: JB TR0, OUT ;TR0=1,标志T0已开始计时动作,所以可将结果输出
SETB TR0 ;若上式不成立,则TR0=0,表示这是第一次进入中断,开启T0计时,然后返回 SJMP QUIT
OUT: MOV R3, #TL0 ;将刚过去的那个信号周期送入R2,R3 MOV R2, #TH0
MOV TH0, #0 ;TH0、TL0重装初值为0,为下次测量作好准备 MOV TL0, #0
QUIT: SETB TR0
RETI
第七章习题答案
7-1.串行通讯与并行通讯比有哪些优点? 答:优点:传输线路成本低,传输距离远。 缺点:接口电路复杂,数据传输速率慢。
7-2.异步通讯与同步通讯相比有哪些优点?
答:优点:接口电路简单(无需同步时钟电路);数据传送的可靠性较高,能及时发现错误(每个字节都有校验)。
缺点:通讯效率较低。
7-3.单片机串口为什么要设计方式0?
答:串口方式0用于扩展I/O接口,并非用于串行通信。其目的是为了弥补单片机I/O接口的不足。
7-4.单片机串口为什么要设计方式2?
答:方式2为9位UART,多用于多机通信;同时方式2的波特率固定为fosc/32或fosc/64,不需使用T1或T2产生波特率。
7-5.单片机系统时钟为11.0592MHZ对串口有什么好处? 答:对于标准波特率可准确计算出T1或T2的初值。
7-6.与采用T2波特率发生器相比,采用T1作为波特率发生器有什么好处?
答:与T1相比T2作为定时/计数器的功能更为强大,所以一般用T1作为波特率发射器。
7-7.某89C52单片机fosc=11.0592MHZ,要求串口工作在方式3进行发送和接收数据,用T1作为波特率发生器,波特率为19000b/s、SMOD=1,求在进行串行口初始化过程中T1的初值为多少?并编写串行口初始化程序。
答:因为BR=2SMOD×fosc/384÷(28-a),
所以a=28-2SMOD×fosc/(384×BR)=256-2×11.0592M/(384×19000)= 252.9684≈253=FDH INIT: CLR TCLK CLR RCLK; 将T1作为波特率发生器
MOV SCON, #0C0H; 串口定义为方式3 ORL PCON,#80H; SMOD=1
MOV TMOD,#20H; T1模式2内部定时,产生波特率 MOV TL1,#0FDH; 装入初值253 MOV TH1,#0FDH; SETB TR1; 启动T1定时
注意:19000b/s不是标准的BR,所以计算出的初值有误差。一般常用的标准BR为4.8, 9.6, 19.2, 38.4KHz.
7-8.某89C52单片机fosc=12MHZ,要求串口工作在方式1进行发送和接收数据,用T1作为波特率发生器,波特率为62500b/s,求在进行串行口初始化过程中T1的初值为多少?并编写串行口初始化程序。 答:因为BR=2SMOD×fosc/384÷(28-a),分析该式可知,当a=255时BR有最大值;若fosc=12MHZ,当SMOD=0时,BR最大值为31250b/s;SMOD=1时,BR最大值为62500b/s。根据题意,显然因取SMOD=1。 初值a=28-2SMOD×fosc/(384×BR)=256-2×12M/(384×62500)= 255=FFH INIT: CLR TCLK CLR RCLK; 将T1作为波特率发生器
MOV SCON, #40H; 串口定义为方式1 ORL PCON,#80H; SMOD=1
MOV TMOD,#20H; T1模式2内部定时,产生波特率 MOV TL1,#0FFH; 装入初值255 MOV TH1,#0FFH; SETB TR1; 启动T1定时
7-9.某89C52单片机应用系统中有甲、乙两台单片机。试为甲、乙两机分别编制一个串口发送子程序和接收子程序。串口采用方式1、偶校验、T1为波特率发生器、波特率为4800。设fosc=11.0592MHZ,SMOD=1。程序采用查询方式将外部数据存储器2300H~2363H单元中的ASCII码一一从甲机发送到乙机,乙机将串行口接收进来的数据校验合格后依次存放在外部数据存储器1600H~1663H单元中,并把标志位00H(即20H.0)置1;如果接收的数据校验不合格,则清0标志位00H并退出子程序。
答:初值a=28-2SMOD×fosc/(384×BR)=256-2×11.0592M/(384×4800)= 244=F4H 甲机串口发送子程序:
ASTXD: PUSH ACC; ACC内容保护 PUSH PSW; PSW(包含CY位,P位及当前寄存器区等信息)内容保护 MOV PSW,#08H; 当前寄存器区改设为1区
CLR TCLK
CLR RCLK; 将T1作为波特率发生器 ORL PCON,#80H; SMOD=1
MOV TMOD,#20H; T1模式2内部定时,产生波特率 MOV TL1,#0F4H; 装入初值244 MOV TH1,#0F4H; SETB TR1; 启动T1定时
MOV SCON, #40H; 串口定义为方式1
MOV DPTR,#2300H; 指定发送数据首地址 MOV R7,#64H; 指定发送数据个数
LOOP: MOVX A,@DPTR; 取出ASC码(标准ASC码只有7位,最高位可留做奇偶校验位) MOV C,P; 偶校验时,只需将7位ASC码的奇偶信息(P)复制给最高位 MOV ACC.7,C MOV SBUF,A; 取出内容送SBUF,启动串口发送 WAIT: JNB TI, WAIT; 等待发送完成 CLR TI; 清除发送完成标志 INC DPTR DJNZ R7, LOOP POP PSW POP ACC; 恢复现场 RET
BSRXD: PUSH ACC; ACC内容保护 PUSH PSW; PSW(包含CY位,P位及当前寄存器区等信息)内容保护 MOV PSW,#80H; 当前寄存器区改设为2区
CLR TCLK
CLR RCLK; 将T1作为波特率发生器
ORL PCON,#80H; SMOD=1
MOV TMOD,#20H; T1模式2内部定时,产生波特率 MOV TL1,#0F4H; 装入初值244 MOV TH1,#0F4H; SETB TR1; 启动T1定时
MOV DPTR,#1600H; 指定数据存储区首地址
MOV R7,#64H; 指定接收数据总个数
MOV SCON, #50H; 串口定义为方式1,并启动接收
WAIT: JNB RI, WAIT; 等待接收完成 CLR RI; 清除接收完成标志 MOV A,SBUF; 取出接收数据 JB P, ERR; P=1则不满足偶校验要求,出错 ANL A, #7FH; 校验正确,恢复ASC码 LOOP: MOVX @DPTR, A; 送外部存储器 SET 0; 接收成功置1标志00H
INC DPTR; 目标存储器地址加1
DJNZ R7, WAIT; 若未满总个数,等待下个数据接收完成 SJMP RETURN; 接收满总个数,返回 ERR: CLR 0H; 出错,清零00H标志后返回
RETURN: POP PSW; 如果照题意用F0作标志,则该条指令执行后,标志位F0将被覆盖! POP ACC; 恢复现场 RET
7-10.某89C52单片机应用系统中有甲、乙两台单片机。试为甲、乙两机分别编制一个串口发送子程序和接收子程序。串口采用方式3、奇校验、T1为波特率发生器、波特率为9600、附加的第九位数据作为奇偶校验位。设fosc=11.0592MHZ,SMOD=0。程序采用中断方式将外部数据存储器1700H~17FFH单元中的数据从甲机发送到乙机,乙机将串行口接收进来的数据校验合格后依次存放在外部数据存储器2400H~24FFH单元中,完成后把标志位00H(即20H.0)置1;如果接收的数据校验不合格,则清0标志位00H并退出子程序。 答:初值a=28-2SMOD×fosc/(384×BR)=256-20×11.0592M/(384×9600)= 253=FDH 甲机程序: TEND BIT 0 ;以符号名TEND定义标志位0,甲机中该标志用于表示全部数据已发送完成
ORG 0 ;安排主程序及中断入口
LJMP MAIN ORG 23H LJMP AIPGS; 甲机中断服务子程序,发送数据 MAIN: CLR TCLK CLR RCLK; 将T1作为波特率发生器
ANL PCON,#7FH; SMOD=0
MOV TMOD,#20H; T1模式2内部定时,产生波特率 MOV TL1,#0FDH; 装入初值253 MOV TH1,#0FDH; SETB TR1; 启动T1定时
MOV SCON, #0C0H; 串口定义为方式3 MOV SP, #60H; 堆栈指针初始化 SETB ES; 允许串行中断 SETB EA; 开中断系统
MOV DPTR,#1700H; 指定发送数据首地址 MOV 30H, #0; 指定发送数据个数256时初值应写为0,软件计数器用30H,而不使用工作寄存器 CLR TEND; 清除全部数据发送完成标志。 SETB TI; 初始化完成后,人工置位TI,帮助系统首次进入中断 WAIT: SJMP WAIT; 等待进入中断 ;甲机串行口中断服务子程序
AIPGS: PUSH ACC; ACC内容保护 PUSH PSW; PSW(包含CY位,P位)内容保护 CLR TI; 清除发送完成标志 JNB TEND, NEXT; 若全部数据未发送完成,则继续 CLR TR1; 若全部数据发送完成(TEND=1),则停止波特率发生,关闭串行发送。 SJMP QUIT; 由中断程序返回 NEXT: MOVX A,@DPTR; 取出待发送数据 MOV C,P; 奇校验时,将数据的奇偶信息(P)取反后作为奇偶校验位 CPL C MOV TB8 ,C MOV SBUF,A; 取出内容送SBUF,启动串口发送,将8位数据及校验位TB8一并发送出去。 INC DPTR; 发送数据存储地址加1 DJNZ 30H,QUIT; 数据未全部发完,则退出中断,等待当前数据发送完成 SETB TEND; 全部发完后,置1全部完成标志TEND QUIT: POP PSW POP ACC; 恢复现场 RETI
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库51单片微型机原理和接口教程 习题答案(完整版)(6)在线全文阅读。
相关推荐: