C51单片机06(串行通信)_第1页
C51单片机06(串行通信)_第2页
C51单片机06(串行通信)_第3页
C51单片机06(串行通信)_第4页
C51单片机06(串行通信)_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章串行异步通信接口单片机单片机的串行异步通信接口对于单片机,从外部观察,与串行接口有关的只有RXD、TXD两条线123456789101112131415161718192021222324252627282930313233343536373839401011001110110011RXDTXDC51串行口功能与结构方式0——同步移位寄存器方式(波特率直接由系统时钟产生)方式1——8位异步通信方式(波特率由定时器T1决定)方式2——9位异步通信方式(波特率直接由系统时钟产生)方式3——9位异步通信方式(波特率由定时器T1决定)MCS-51串行口结构1011001110110011串行口的特殊功能寄存器从用户编程的角度观察:收发数据寄存器SBUF地址为99H串口控制寄存器SCON地址为98H电源控制寄存器PCON地址为87H串行口数据寄存器SBUF两个独立的物理寄存器,发、收共用地址CPU向SBUF写数据,写入发送数据寄存器在发送时钟控制下,先发送一个低电平起始位低位在前,高位在后,逐个发送数据位最后发送一个高电平停止位发送完数据位后,发送中断标志TI置“1”CPU读SBUF,读的是接收数据寄存器检测起始位接收数据位,移入移位寄存器接收有效,接收中断标志RI置“1”串行口控制寄存器SCON定义串行口的工作方式,进行接收、发送控制和监控串行口的工作过程SM0SM1——工作方式选择SM2——多机通信控制REN——允许接收控制TB8——发送数据的第9位RB8——接收数据的第9位TI——发送中断标志RI——接收中断标志SM0SM1SM2RENTB8RB8TIRID7D6D5D4D3D2D1D0系统复位时SCON全部清零发送中断标志TI方式0时,当发送数据第8位结束后,由内部硬件使TI置位方式1、2、3时,在停止位开始发送时由内部硬件使TI置位TI置位,产生内部中断interrupt4,通知CPU开始发送下一个数据CPU响应中断后,TI不能自动清零,必须用软件清零接收中断标志RI方式0时,当接收数据第8位结束后,由内部硬件使RI置位方式1、2、3时,若接收有效,由内部硬件使RI置位RI置位,产生内部中断interrupt4,通知CPU从接收数据寄存器中取走数据CPU响应中断后,RI不能自动清零,必须用软件清零电源控制寄存器PCON主要用于电源控制SMOD——波特率加倍位,用于对串行口的波特率控制SMODD7D6D5D4D3D2D1D05.3.3串行口的工作方式SM0SM1方式功能波特率000移位寄存器fosc/120118位异步通信取决于定时器T11029位异步通信fosc/32或fosc/641139位异步通信取决于定时器T1方式0——移位寄存器用来外接移位寄存器,用作扩展I/O接口串行数据通过RXD输入、输出同步时钟通过TXD输出发送和接收数据时低位在前、高位在后,长度8位波特率固定为fosc/12方式0发送过程TI=0时,CPU执行一条向SBUF写数据的指令,启动发送过程经过一个机器周期,写入发送数据寄存器的数据按低位在前、高全在后的顺序,从RXD依次发送,同步时钟从TXD送出8位数据(一帧)发送完毕,标志位TI置1,向CPU申请中断如要再次发送数据,必须用软件将TI清0方式0接收过程RI=0,将REN置1,启动一次接收过程串行数据通过RXD接收,同步移位脉冲通过TXD输出RXD上的串行数据依次移入移位寄存器8位数据(一帧)全部移入后,接收控制器将8位数据并行送入SBUF硬件使中断标志RI置1,向CPU申请中断CPU响应中断后,从接收数据寄存器SBUF中取出数据,然后用软件使RI清0方式1——8位异步通信帧信息结构:1个起始位8个数据位1个停止位TXD发送数据RXD接收数据波特率=2SMOD×(T1的溢出率)/32方式1的发送过程TI=0,CPU执行一条向SBUF写数据的指令,启动发送过程数据由TXD引脚送出在发送时钟作用下,先通过TXD送出一个低电平的起始位,然后依次送出8位数据,其后是一个高电平的停止位一帧数据发送完毕,发送中断标志TI置1,向CPU申请中断方式1的接收过程REN置1,接收器开始工作,以所选波特率的16倍速率对RXD引脚上的电平进行采样发现起始位(负跳变),开始接收数据,在接收移位脉冲控制下依次把接收的数据移入移位寄存器8位数据及停止位全部接收后,置RI=1,向CPU申请中断方式2、方式3——9位异步通信帧信息结构:1个低电平起始位9个数据位1个高电平停止位TXD发送数据端RXD接收数据端方式2波特率:fosc/32或者fosc/64方式3波特率: =2SMOD×(T1的溢出率)/325.3.4串行口的编程及应用串行口工作方式设置的说明SCON=0x50;方式1:TI=0,CPU执行一条向SBUF写数据的指令,启动发送过程一帧数据发送完毕,发送中断标志TI置1,向CPU申请中断SM0SM1SM2RENTB8RB8TIRID7D6D5D4D3D2D1D001010000从单片机发送一个字符到PC(查询方式)//经串口把数据从单片机发送到计算机的“串口助手”并显示在“接收/键盘发送缓冲区”#include<reg52.h>

voidcom_init(void) //初始化串口子程序{PCON=0x00; //波特率不加倍

SCON=0x50; //串行口工作在方式1,波特率由定时器T1决定

TMOD=0x20; //定时器T1工作在方式2(8位自动重置定时器)

TH1=0xFd;TL1=0xFd; //晶振11.0592MHz,波特率9600TR1=1; //定时器1启动 }从单片机发送一个字符到PC(查询方式)voidMain(){

com_init(); SBUF=68; //把大写字母D送入发送缓冲区

while(!TI); //发送完毕,TI自动置位

while(1); //循环等待}思考怎样才能连续不断地向PC发送一个字符?#include<reg52.h>#defineucharunsignedcharvoidcom_init(void) //初始化串口子程序{PCON=0x00; //波特率不加倍

SCON=0x50; //串行口工作在方式1,波特率由定时器T1决定

TMOD=0x20; //定时器T1工作在方式2(8位自动重置定时器)

TH1=0xFd;TL1=0xFd; //晶振11.0592MHz,波特率9600TR1=1; //定时器1启动 }voiddelay(uchar

milisec) //延时程序{

uchar

i,j;

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

for(j=0;j<150;j++);}voidMain(){

com_init(); SBUF=68; //把大写字母D送入发送缓冲区

while(1) {

if(TI==1) //如果一个字符发送完毕

{ SBUF=68; //重新装入发送缓冲器

TI=0; //发送标志

delay(500); //延迟一段时间,便于观察

} }}从单片机发送一个字符串到PC//经串口发送一个字符串到计算机“串口助手”从单片机发送一个字符串到PC#include<reg52.h>#defineucharunsignedcharvoidcom_init(void) //初始化串口{ PCON=0x00; //波特率不加倍

SCON=0x50; //串口设置为方式1,8位数据

TMOD=0x20; //定时器T1设置为方式2 TH1=0xFd;TL1=0xFd; //晶振11.0592,波特率9600TR1=1; //定时器T1启动 }使用指针的实现方法voidMain(){

ucharcodeBuffer[]="WelcomeToTheMCUWorld.";

uchar*p=Buffer; //指向待发送数据首地址

com_init(); //初始化异步通信端口

while(1) { SBUF=*p; //把一个字符送入发送缓冲区,开始发送

while(!TI); //循环检测TI标志,直到TI=1,发送完成

p++; //指针指向下一个待发送字符

if(*p=='\0')break; //若遇到字符串结尾标志‘\0’,结束循环

TI=0; //TI清零,准备再向SBUF写入一个字符

} while(1);}程序下载之后,必须重新启动才能看到结果不使用指针的实现方法voidMain(){

uchari=0;

ucharcodeBuffer[]="WelcomeToTheMCUWorld.";

com_init(); while(1) { SBUF=Buffer[i];

while(!TI); i++;

if(Buffer[i]=='\0')break; TI=0; } while(1);}异步通信程序下载异步通信程序下载异步通信程序下载异步通信程序下载练习在单片机上多次按下4*4键盘阵列中的键,通过串行口把键位置码依次上传到PC机“串口助手”的“接收/键盘发送缓冲区”内从PC发送一个十六进制数字到单片机在“串口助手”的“单字符串发送区”输入一个十六进制数字,单击“发送字符/数据”按钮,这个数字就下载到单片机,并在数码管LED0上显示若在“单字符串发送区”一次输入多个十六进制数字,只能稳定显示最后一个从PC发送一个十六进制数字到单片机从PC发送一个十六进制数字到单片机#include<reg52.h>unsignedcharcodetable[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voidcom_init(void) //串口初始化{PCON=0x00;SCON=0x50; //串口方式1 TMOD=0x20; //定时器T1设置为方式2(8位自动重置)TH1=0xFd; //晶振11.0592MHz,波特率9600TL1=0xFd;TR1=1; //启动定时器1}从PC发送一个十六进制数字到单片机voidMain() //采用查询方式{

com_init(); //串口初始化

P2=0; //准备在LED0显示数字

while(1) {

if(RI==1) //接收到有效字符

{ P0=table[SBUF]; //获取数码管段位码

RI=0; //清RI,准备下次接收

} }}“串口助手”的“单字符发送区”输入字符,若选择“十六进制发送”,则只有0~F为有效数字,其它字符均为非法接收的字符保存在SBUF练习(查询方式)在“串口助手”的“单字符发送区”逐个输入十六进制数字,按从左到右的顺序依次显示在单片机的数码管LED0~7上,单片机最多允许接收8个数字#include<reg52.h>ucharcodetable[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchari,j,number[8]={0};voiddelay(uchar

milisec){

uchar

x,y;

for(x=0;x<milisec;x++)

for(y=0;y<150;y++);}voidcom_init(void) //串口初始化{PCON=0x00;SCON=0x50; //串口方式1 TMOD=0x20; //定时器T1设置为方式2TH1=0xFd;//晶振11.0592MHz,波特率9600TL1=0xFd;TR1=1; //启动定时器1 RI=0;}voidMain(){ delay(100); com_init(); //延时100ms,串行口初始化

i=0; P0=0; P2=7; //清除LED显示残留

while(1) {

if(RI==1&&i<=7) {

number[i]=SBUF; //获取串口输入的数据,保存到数组

i++; RI=0; //清除接收中断标志,准备下次接收

}

for(j=0;j<i;j++) //在LED0~7显示输入数据

{ P0=table[number[j]]; P2=j; delay(2); } }} 练习(中断方式)在“串口助手”的“单字符发送区”逐个输入ASCII字符0~9,按从右到左的顺序依次显示在单片机的数码管LED0~7上,若输入字符超过8个,则从LED右端重新开始#include<reg52.h>#defineucharunsignedcharucharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharnumber[8]={0}; //从串口接收的数据voiddelay(uchari) //1ms延时{

uchar

x,j;

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

for(x=0;x<=148;x++); }voiddata_input(void)interrupt4{ staticuchari=7; //重新进入时i的值不变

EA=0;

if(RI==1) //收到一个数据

{

number[i]=SBUF-48; //串口接收的是ASCII码

RI=0; //清除接收中断标志

if(i==0)i=8; i--; } EA=1;}voidcom_init(void){PCON=0x00;SCON=0x50; TMOD=0x20; TH1=0xFd; //设置波特率9600TL1=0xFd;TR1=1; //启动定时器1 ES=1; //开串口中断

EA=1; //开总中断 }voidMain(){

uchari=0; delay(100); //稳定100ms

com_init(); //串行口初始化

P2=0; while(1) { P0=table[number[i]]; P2=i++; delay(1);

if(i==8)i=0; }}练习从PC机用串口助手发送一个字符X,单片机收到字符后,向PC机返回“IgotX”#include<reg52.h>#defineucharunsignedcharucharflag=0,a,i;ucharcodetable[]="Igot";voidcom_init(void) //初始化串口{ PCON=0x00; //波特率不加倍

SCON=0x50; //串口设置为方式1,8位数据

TMOD=0x20; //定时器T1设置为方式2 TH1=0xFd;TL1=0xFd; //晶振11.0592,波特率9600TR1=1; //定时器T1启动

ES=1; //串行口中断允许

EA=1; //总控中断允许}voidMain(){

com_init(); //初始化串行通信端口

while(1) {

if(flag==1) //如果收到串口输入字符

{ ES=0; //关闭串行口中断

for(i=0;i<6;i++) { SBUF=table[i];

while(!TI);TI=0; } SBUF=a; //把串口输入字符送到发送缓存

while(!TI);TI=0; //等待发送结束

ES=1; //开放串行口中断

flag=0; //清除收到标志

} }}voidserial()interrupt4 //中断服务程序{ a=SBUF; //串口输入字符保存到变量a flag=1; //设置收到标志

RI=0; //清除接收标志,准备下次接收}串口电平转换(MAX232)串口与

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论