第06章 单片机串行通信系统 习题解答.docx

上传人:b****2 文档编号:2185517 上传时间:2023-05-02 格式:DOCX 页数:13 大小:104.86KB
下载 相关 举报
第06章 单片机串行通信系统 习题解答.docx_第1页
第1页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第2页
第2页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第3页
第3页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第4页
第4页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第5页
第5页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第6页
第6页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第7页
第7页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第8页
第8页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第9页
第9页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第10页
第10页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第11页
第11页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第12页
第12页 / 共13页
第06章 单片机串行通信系统 习题解答.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

第06章 单片机串行通信系统 习题解答.docx

《第06章 单片机串行通信系统 习题解答.docx》由会员分享,可在线阅读,更多相关《第06章 单片机串行通信系统 习题解答.docx(13页珍藏版)》请在冰点文库上搜索。

第06章 单片机串行通信系统 习题解答.docx

第06章单片机串行通信系统习题解答

第6章单片机串行通信系统习题解答

一、填空题

1.在串行通信中,把每秒中传送的二进制数的位数叫波特率。

2.当SCON中的M0M1=10时,表示串口工作于方式2,波特率为fosc/32或fosc/64。

3.SCON中的REN=1表示允许接收。

4.PCON中的SMOD=1表示波特率翻倍。

5.SCON中的TI=1表示串行口发送中断请求。

6.MCS-51单片机串行通信时,先发送低位,后发送高位。

7.MCS-51单片机方式2串行通信时,一帧信息位数为11位。

8.设T1工作于定时方式2,作波特率发生器,时钟频率为11.0592MHz,SMOD=0,波特率为2.4K时,T1的初值为FAH。

9.MCS-51单片机串行通信时,通常用指令MOVSBUF,A启动串行发送。

10.MCS-51单片机串行方式0通信时,数据从P3.0引脚发送/接收。

二、简答题

1.串行口设有几个控制寄存器?

它们的作用是什么?

答:

串行口设有2个控制寄存器,串行控制寄存器SCON和电源控制寄存器PCON。

其中PCON中只有PCON.7的SMOD与串行口的波特率有关。

在SCON中各位的作用见下表:

SCON

D7

D6

D5

D4

D3

D2

D1

D0

位名称

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

位地址

9FH

9EH

9DH

9CH

9BH

9AH

99H

98H

功能

工作方式

选择

多机通信控制

接收允许

发送第9位

接收第9位

发送中断

接收中断

2.MCS-51单片机串行口有几种工作方式?

各自的特点是什么?

答:

有4种工作方式。

各自的特点为:

 

SM0

SM1

方式

功能

波特率

0

0

方式0

移位寄存器方式

fosc/12

0

1

方式1

8位异步通信方式

可变

1

0

方式2

9位异步通信方式

fosc/32或fosc/64

1

1

方式3

9位异步通信方式

可变

 

3.MCS-51单片机串行口各种工作方式的波特率如何设置,怎样计算定时器的初值?

答:

串行口各种工作方式的波特率设置:

工作方式O:

波特率固定不变,它与系统的振荡频率fosc的大小有关,其值为fosc/12。

工作方式1和方式3:

波特率是可变的,波特率=(2SMOD/32)×定时器T1的溢出率

工作方式2:

波特率有两种固定值。

当SM0D=1时,波特率=(2SM0D/64)×fosc=fosc/32

当SM0D=0时,波特率=(2SM0D/64)×fosc=fosc/64

计算定时器的初值计算:

 

4.若fosc=6MHz,波特率为2400波特,设SMOD=1,则定时/计数器T1的计数初值为多少?

并进行初始化编程。

答:

根据公式

N=256-2SMOD×fosc/(2400×32×12)=242.98≈243=F3H

TXDA:

MOVTMOD,#20H;置T1定时器工作方式2

MOVTL1,#0F3H;置T1计数初值.

MOVTH1,#0F3H

MOVPCON,#80H;置SMOD=1

5.用8051串行口外接CD4094扩展8位并行输出口,驱动8个LED发光二极管。

画出硬件电路图,编写程序,使LED发光二极管从左到右依次闪亮。

答:

电路图如下

LED发光二极管从左到右循环点亮的C51参考程序:

#include//包含51单片机寄存器定义的头文件

#include//包含函数_nop_()定义的头文件

unsignedcharcodeTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//流水灯控制码,该数组被定义为全局变量

sbitP17=P1^7;

voiddelay(void)

{

unsignedcharm,n;

for(m=0;m<200;m++)

for(n=0;n<250;n++)

;

}

/**************************************************************

函数功能:

发送一个字节的数据

**************************************************************/

voidSend(unsignedchardat)

{

P17=0;//P1.7引脚输出锁存信号,对cd4094锁存

nop_();//延时一个机器周期

_nop_();//延时一个机器周期,保证锁存完成

P17=1;//结束对cd4094的锁存

SBUF=dat;//将数据写入发送缓冲器,启动发送

while(TI==0)//若没有发送完毕,等待

;

TI=0;//发送完毕,TI被置“1”,需将其清0

}

/*******************************************

函数功能:

主函数

******************************************/

voidmain(void)

{

unsignedchari;

SCON=0x00;//SCON=00000000B,使串行口工作于方式0

while

(1)

{

for(i=0;i<8;i++)

{

Send(Tab[i]);//发送数据

delay();//延时

}

}

}

三、Proteus仿真

Proteus仿真

1.在Proteus下,仿真实现6.6节内容。

答:

全自动洗衣机串行方式时间显示Proteus仿真

为节省单片机并口资源,全自动洗衣机时间显示可用串口实现。

一次洗衣时间一般不会超过99分钟,用2位LED数码管显示时间即可。

电路如图6-9所示。

图6-9全自动洗衣机串行方式时间显示电路

图6-9中用AT89C51单片机串行口扩展2个并行口,接2位数码管组成显示电路。

串行口工作于方式0,与外接的2片移位寄存器74LS164连接。

74LS164是一个8位串入并出的移位寄存器,功能是接收AT89C51单片机串行通信口输出的串行数据并转换成并行数据输出,从而驱动LED数码管显示。

74LS164的1、2脚为数据输入端,接单片机串行口的RXD端(P3.0脚),74LS164的第8脚为时钟脉冲输入端(CLK),接单片机串行口的TXD端(P3.1脚),第9脚R为清零端,低电平清零,正常工作时接高电平。

两只LED数码管采用共阴极静态显示方式。

下列程序实现串行两位LED数码管时间显示,显示范围为00—99分钟。

使用串行口进行信息传送,程序编写相当简单,用户只需将需要显示的数据直接送串口发送缓冲器,等待串行中断即可。

汇编语言参考程序:

ORG0000H;在0000H单元存放转移指令

LJMPNAIN;转移到主程序

ORG000BH;定时器T0的中断入口地址

LJMPINTERRUPT;转移到中断子程序

ORG0200H;主程序从0200H开始

MAIN:

MOVTMOD,#01H;使用定时器T0,工作方式1

MOVTH0,#3CH;置初T0值50ms

MOVTL0,#0B0HH

MOVR0,#0;用于存1秒的计数次数

SETBEA;开中断总允许

SETBET0;允许T0中断

SETBTR0;启动计时

LOOP:

LCALLDisplay;循环调用显示子程序

SJMPLOOP

TAB:

DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0~9的共阴极段码

DISPLAY:

;显示子程序(显示分钟)

MOVDPTR,#TAB;将表首地址赋给DPTR

MOVA,30H;将30H中存放的分计数赋给累加器A

MOVB,#0AH;将10赋给累加器B

DIVAB;分计数除以10得十位数放在A中,个位数放在B中

MOVXA,@A+DPTR;查表得十位数的`显示段码

MOVSBUF,A;发送十位数

L1:

JBCTI,L2;判是否发送完,未发完循环等待,若发完则转L2

SJMPL1

L2:

MOVA,B;将个位数赋给累加器A

MOVXA,@A+DPTR;查表得个`位数的显示段码

MOVSBUF,A;发送个位数

L3:

JBCTI,L4;判是否发送完,未发完循环等待,若发完则转L4

SJMPL3

L4:

RET;子程序返回

INTERRUPT:

;中断服务子程序

INCR0;每中断一次(50ms)加1

CJNER0,#20,L5;判是否中断20次,若不是则转L5中断返回,若是则顺序执行

CLRR0;到1秒钟,清R0

INCR1;秒计数加1

CJNER1,#60,L5;判秒是否计满60次,若未满则转L5中断返回,若满则顺序执行

CLRR1;如果秒计满60,将秒计数单元内容清0

INC30H;分钟计数单元30H内容加1

CJNE30H,#99,L5;判分是否计满99次,若未满则转L5中断返回,若满则顺序执行

CLRR1;如果分计满99,将秒计数单元内容清0

CLR30H;同时将分计数单元内容清0

L5:

MOVTH0,#3CH;定时器重新赋初值

MOVTL0,#0B0HH

RETI;中断返回

C语言参考程序:

#include//包含51单片机寄存器定义的头文件

unsignedcharTab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//数组Tab放0~9的共阴极字段码

unsignedcharint_time;//设中断次数计数变量

unsignedcharsecond;//秒计数变量

unsignedcharminute;//分钟计数变量

voiddelay(void)//延时函数

{

unsignedcharn,j;//设计数循环变量

for(j=0;j<200;j++);//通过循环延时

for(n=0;n<200;n++);//通过循环延时

}

voidDisplayMinute(unsignedcharm)//显示函数

{unsignedcharge,si;//定义变量ge、si,用于存放个位、十位

si=Tab[m/10];//计算出十位的值,查表转换成相应的段码送变量si

SBUF=si;//发送显示十位

while(TI==0);//等待发送完毕

TI=0;//发送完后清中断标志

ge=Tab[m%10];//计算出十位的值,查表转换成相应的段码送变量ge

SBUF=ge;//发送显示个位

while(TI==0);//等待发送完毕

TI=0;//发送完后清中断标志

delay();//调延时函数,是数码管显示有一定的亮度

delay();

}

voidmain(void)//主函数

{

TMOD=0x01;//使用定时器T0,工作方式1

EA=1;//开中断总允许

ET0=1;//允许T0中断

TH0=(65536-46083)/256;//定时器高八位赋初值(50ms)

TL0=(65536-46083)%256;//定时器低八位赋初值

TR0=1;//启动计时

PCON=0x00;//置SMOD=0

SCON=0x00;//串行口工作在方式0

while

(1)//无限循环体

{

DisplayMinute(minute);//调用分钟显示子程序

}

}

voidinterserve(void)interrupt1//计数器T0中断函数

{

int_time++;//每中断一次(50ms)加1

if(int_time==20)//50ms记20次为1秒(仿真时可将次数改小,减少等待时间)。

{

int_time=0;//中断计数变量清0

second++;//秒计数变量加1

}

if(second==60)//判是否到了60秒(仿真时可将次数改小,减少等待时间)。

{

second=0;//如果秒计满60,将秒计数变量清0

minute++;//分钟计数变量加1

}

if(minute==99)//判分钟是否等于99

{minute=0;//如果分钟计满99,将分钟计数变量清0秒计数变量清0

second=0;//将秒计数变量清0

}

TH0=(65536-46083)/256;//定时器重新赋初值

TL0=(65536-46083)%256;

}

2.在Proteus下,仿真实现例6-2内容。

答:

电路如图6-8所示,试编制程序输入K1~K8的状态信息,并存入内部RAM40H。

图6-8串行通讯方式0应用

4014是一个并入串出转换芯片,Q8端为串行数据输出端,CLK为时钟脉冲输入端,P/S为操作控制端,P/S=1:

锁存并行输入数据,P/S=0:

允许串行移位操作。

要完成题目的要求,应先将开关状态锁存,然后串行传送给单片机。

在Proteus下画出电路图。

汇编语言参考程序如下:

ORG0000H;上电后程序从00000H开始,在0000H单元存放转移指令

LJMPKIN;转移到主程序

ORG0100H;主程序从0100H开始

KIN:

MOVSCON,#00H;设定串行口为方式0

CLRES;禁止串行中断

SETBP1.0;锁存并行输入数据

CLRP1.0;允许串行移位操作

SETBREN;允许并启动接收(TXD发送移位脉冲)

JNBRI,$;等待接收完毕

MOV40H,SBUF;存入K1~K8状态数据

SJMP$;循环等待

END;汇编结束

C语言参考程序:

#include//包含特殊功能寄存器库

sbitP1_0=P1^0;//定义P1.0口,程序中用P1_0代替P1.0。

voidmain()//主函数

{

unsignedchari;//定义变量i,将接收到的数据放到变量i中。

P1_0=1;//锁存并行输入数据

P1_0=0;//允许串行移位操作

SCON=0x00;//设定串行口为方式0

while(!

RI){;}//等待接收完毕

RI=0;//清中断标志

i=SBUF;//存入K1~K8状态数据

……

}

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

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2