大家好,欢迎来到IT知识分享网。
目录
1.简介
作用:设备间数据通讯的方式
分类:协议分为RS-232、RS-422(速度不同) 电平分为:UART电平1为-3~-15V的电压, 逻辑0为3~15V。TTL电平:高电平>=2.4V,输出低电平<=0.4V
使用:1.接线方式 RXD:数据输入引脚 TXD:数据发送引脚
2.代码方式:想要接收数据 char data = SBUF 想要发送数据 SBUF = data
3.配置波特率和串口助手
2.使用串口—单片机接受字符
#include "reg52.h" //超声波控制LED sfr AUXR=0x8e; void UartInit(void); void Delay500ms(); void main(void) { char data1='a'; UartInit(); while(1){ Delay500ms(); SBUF= data1; } } void UartInit(void) //9600bps@11.0592MHz { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xBF; //定时器时钟12T模式 AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设置定时器模式 TMOD |= 0x20; //设置定时器模式 TL1 = 0xFD; //设置定时初始值 TH1 = 0xFD; //设置定时重载值 ET1 = 0; //禁止定时器中断 TR1 = 1; //定时器1开始计时 } void Delay500ms() //@11.0592MHz { unsigned char i, j, k; //_nop_(); i = 4; j = 129; k = 119; do { do { while (--k); } while (--j); } while (--i); }
3.串口寄存器配置
作用:配置相同的波特率
方式1:使用串口助手配置
方式2:手动配置(查看单片机手册)
采用 8 4 2 1法配置。
手动配置串口寄存器的代码:
#include "reg52.h" //超声波控制LED sfr AUXR=0x8e; void Delay500ms(); void main(void) { char data1='a'; SCON=0x50;//采用工作方式1进行通讯 PCON &= 0x7F; //要清0就 &上0 ET1=0;//串口用的定时器1,关闭中断。配置相同的波特率 //TCON 定时器控制寄存器 TR1=1; //打开定时器1 //TMOD? 定时器模式寄存器 TMOD &=0x0F; //&0就清0 TMOD |=0x20; // |1就变1 TH1=0xFD; //高位? ? ? 自动重装时TH1将自动装入TL1 TL1=0xFD; //低位 while(1){ Delay500ms(); SBUF= data1; } } void Delay500ms() //@11.0592MHz { unsigned char i, j, k; //_nop_(); i = 4; j = 129; k = 119; do { do { while (--k); } while (--j); } while (--i); }
4.串口发送字符串
复习了一下:字串初始化和打印、指针、数组指针
#include "reg52.h" //超声波控制LED sfr AUXR=0x8e; void Delay500ms(); void init_usb(void); void main(void) { char *data1="hello world \r\n"; char *p=data1; init_usb(); //串口初始化 while(1){ p=data1; Delay500ms(); while(*p!='\n'){ SBUF= *(p++); while(!TI); TI=0; } } } void init_usb(void) { SCON=0x50;//采用工作方式1进行通讯 PCON &= 0x7F; //要清0就 &上0 ET1=0;//串口用的定时器1,关闭中断。配置相同的波特率 //TCON 定时器控制寄存器 TR1=1; //打开定时器1 //TMOD? 定时器模式寄存器 TMOD &=0x0F; //&0就清0 TMOD |=0x20; // |1就变1 TH1=0xFD; //高位? ? ? 自动重装时TH1将自动装入TL1 TL1=0xFD; //低位 } void Delay500ms() //@11.0592MHz { unsigned char i, j, k; //_nop_(); i = 4; j = 129; k = 119; do { do { while (--k); } while (--j); } while (--i); }
5.串口接受数据
不使用中断接受数据缺点是:不能及时相应,有延迟
使用中断接受数据,没有延迟:
#include "reg52.h" //超声波控制LED sfr AUXR=0x8e; sbit led1=P3^6; sbit led2=P3^7; void Delay500ms(); void init_usb(void); void sendmesege(char *p); void main(void) { char data2; init_usb(); //串口初始化 while(1){ p=data1; Delay500ms(); Delay500ms(); sendmesege("hello world"); data2=SBUF; //接受外部数据后产生中断 进入interrupt 4 } } void sendmesege(char *p) { char *data1=p; while(*data1 != '\0'){ SBUF= *(data1++); //发送完成后产生中断 进入interrupt 4 while(!TI); TI=0; } } void UART_Pountine(void) interrupt 4 { if(TI){ //Delay500ms(); led2=~led2; //每次发送完一个字符h e l就进入一次,因为太快,所以感觉一直亮着 } if(RI){ RI=0; led1=~led1; } } void init_usb(void) { SCON=0x50;//采用工作方式1进行通讯 PCON &= 0x7F; //要清0就 &上0 ET1=0;//串口用的定时器1,关闭中断。配置相同的波特率 //TCON 定时器控制寄存器 TR1=1; //打开定时器1 //TMOD? 定时器模式寄存器 TMOD &=0x0F; //&0就清0 TMOD |=0x20; // |1就变1 TH1=0xFD; //高位? ? ? 自动重装时TH1将自动装入TL1 TL1=0xFD; //低位 //TI 中断请求标志位 RI中断请求标志位 EA=1;ES=1; //总中断允许位 串口中断允许位 } void Delay500ms() //@11.0592MHz { unsigned char i, j, k; //_nop_(); i = 4; j = 129; k = 119; do { do { while (--k); } while (--j); } while (--i); }
6.串口支持 字符串-单词的指令控制
原理是:接受到的字符存放在字符串里,然后和设定字符串比较,执行相应操作
注意点:不同的串口助手可能不兼容,这个单片机使用6.86的串口助手正常识别字符,6.91的不行
#include "reg52.h" //超声波控制LED #include "string.h" sfr AUXR=0x8e; sbit led1=P3^6; sbit led2=P3^7; void Delay500ms(); void init_usb(void); void main(void) { char *data1="hello world \r\n"; char *p=data1; init_usb(); //串口初始化 while(1){ p=data1; Delay500ms(); Delay500ms(); while(*p != '\0'){ SBUF= *(p++); //发送完成后产生中断 进入interrupt 4 while(!TI); TI=0; } //data2=SBUF; //接受外部数据后产生中断 进入interrupt 4 } } void UART_Pountine(void) interrupt 4 { static int i=0; static char cmd[12]; if(TI){ //Delay500ms(); led2=~led2; //每次发送完一个字符h e l就进入一次,因为太快,所以感觉一直亮着 } if(RI){ //接受外部数据后产生中断 进入interrupt 4 RI=0; cmd[i]=SBUF; i++; if(strstr(cmd,"en")){ led1=0; i=0; memset(cmd,'\0',12); } if(strstr(cmd,"cl")){ led1=1; i=0; memset(cmd,'\0',12); } if(i==12){ i=0; } } } void init_usb(void) { SCON=0x50;//采用工作方式1进行通讯 PCON &= 0x7F; //要清0就 &上0 ET1=0;//串口用的定时器1,关闭中断。配置相同的波特率 //TCON 定时器控制寄存器 TR1=1; //打开定时器1 //TMOD? 定时器模式寄存器 TMOD &=0x0F; //&0就清0 TMOD |=0x20; // |1就变1 TH1=0xFD; //高位? ? ? 自动重装时TH1将自动装入TL1 TL1=0xFD; //低位 //TI 中断请求标志位 RI中断请求标志位 EA=1;ES=1; //总中断允许位 串口中断允许位 } void Delay500ms() //@11.0592MHz { unsigned char i, j, k; //_nop_(); i = 4; j = 129; k = 119; do { do { while (--k); } while (--j); } while (--i); }
7.蓝牙串口通讯
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/137175.html