第06章 单片机串行通信系统 习题解答.docx
- 文档编号:9496941
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:13
- 大小:104.86KB
第06章 单片机串行通信系统 习题解答.docx
《第06章 单片机串行通信系统 习题解答.docx》由会员分享,可在线阅读,更多相关《第06章 单片机串行通信系统 习题解答.docx(13页珍藏版)》请在冰豆网上搜索。
第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
#include
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
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状态数据
……
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第06章 单片机串行通信系统 习题解答 06 单片机 串行 通信 系统 习题 解答