第06章 单片机串行通信系统 习题解答Word格式.docx
- 文档编号:4105238
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:13
- 大小:104.86KB
第06章 单片机串行通信系统 习题解答Word格式.docx
《第06章 单片机串行通信系统 习题解答Word格式.docx》由会员分享,可在线阅读,更多相关《第06章 单片机串行通信系统 习题解答Word格式.docx(13页珍藏版)》请在冰点文库上搜索。
9EH
9DH
9CH
9BH
9AH
99H
98H
功能
工作方式
选择
多机通信控制
接收允许
发送第9位
接收第9位
发送中断
接收中断
2.MCS-51单片机串行口有几种工作方式?
各自的特点是什么?
有4种工作方式。
各自的特点为:
方式
波特率
方式0
移位寄存器方式
fosc/12
1
方式1
8位异步通信方式
可变
方式2
9位异步通信方式
fosc/32或fosc/64
方式3
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<
reg51.h>
//包含51单片机寄存器定义的头文件
intrins.h>
//包含函数_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;
查表得个`位数的显示段码
发送个位数
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中断返回,若满则顺序执行
如果分计满99,将秒计数单元内容清0
CLR30H;
同时将分计数单元内容清0
L5:
MOVTH0,#3CH;
定时器重新赋初值
RETI;
中断返回
C语言参考程序:
//包含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<
j++);
//通过循环延时
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;
//发送显示个位
//等待发送完毕
//发送完后清中断标志
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;
//定时器重新赋初值
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;
汇编结束
#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 单片机 串行 通信 系统 习题 解答