通信
通信基础知识
单片机还可以通过IO口实现多种通信。
串行通信:一条数据线,一次发1bit,发很久。
并行通信:多条数据线,同时发送,发的速度快多了但是费用高、接收困难、抗干扰性差。
异步通信:发送和接收方时钟可以不用完全一致。
同步通信 :发送和接收方时钟要完全一致。
单工、半双工、全双工通信:数据的传输方式,略。
比特率:位/s。
波特率:码元/s。
溢出率:比如13us溢出一次。溢出率就是1/13us。
校验位:如奇偶校验位。
停止位:分隔数据帧。
(有那么一点点感谢通原了~)
串口
串口通信,指外设和计算机之间通过数据线等传输数据的一种通信方式。比如RS-系列,大多数计算机应该都有对应的梯形接口。51单片机内自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现与计算机之间的串口通信!
单片机串口通信的管脚:VCC TXD(发送数据,串行输出)RXD(接收数据,串行输入)SGND(信号接地)。
电脑的串口还有很多管脚,如 RTS CTS,单片机的相对简单很多。
TXD和RXD用正负电压表示逻辑1和0,51单片机采用TTL 晶体管-晶体管逻辑集成电路,用高低电平表示逻辑状态(+5V:1;0V:0),所以需要转换型时候才能与计算机串口通信。
还有两种电平状态:RS232,3~15V 表示低(注意),-15~-3V 表示高。RS485,两线压差(差分信号)2~6V 表示高,-6~-2V 表示低。
STC89C52系列有一个通用异步收发器(UART P30 P31端口),有四种工作模式。
- 模式0:同步移位寄存器;
- 模式1:8位UART,波特率可变(常用);
- 模式2:9位UART,波特率固定;
- 模式3:9位UART,波特率可变.
TXD RXD 直接接到单片机 P30 P31 上. 另一端是单片机上自带的,我们把数据线连到电脑上就接上了。
溢出率到波特率的计算见图。
串口助手和单片机要规定好发送数据的形式。
串口数据缓存寄存器:SBUF。物理上是接收和发送两个寄存器,实际上共用相同的地址,只是使用时有不同的意义。我们只需要把数据放入其中就行,发送原理暂不用弄明白。
SCON:串口控制寄存器。控制电路。包含:
SM0,SM1:设置工作方式。比如我们采用8位 UART,就赋值01.
SM2:与工作方式1无关。
REN:是否允许串行接收状态。1允许接收。
TB8 RB8:接收到的第9位数据,与工作方式1无关。
TI RI:发送接收中断请求标志位。代表发送完了。硬件赋1,需要用软件复位。
赋值的话只有 SM0 SM1=01,和 REN 需要注意,其他的初始值都=0。
PCON:电源管理。包含:
SMOD:可见支路图,用于设置波特率是否加倍。
SMOD1:纠错或协助 SM0 设置工作方式。
IE:打开中断。
移位寄存器会触发对应中断。在中断图中的 TI RI,触发的是同一个中断。
实施串口通信
STC-ISP自带一个串口调试助手。
串口选择左侧和串口号一致的选项。
STC89C52串口初始化函数:
void uart_init(void)
{
TMOD|=0X20; //设置计数器工作方式 2
SCON=0X50; //设置为工作方式 1。40是 REN 关闭,50是打开,代表单片机是否可以接收数据
PCON=0X80; //波特率加倍,0就是不加倍
TH1=0XFA; //计数器初始值设置,根据波特率为9600
TL1=0XFA;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器1
}
初始化函数也可以在 STC-ISP 中生成。这里会发现 12MHZ 的晶振相较 11.0592 MHZ 的晶振误差较大,要通过波特率加倍才能减少一些。这就是 11.0592 MHZ 晶振的设计原因。
单片机向电脑发送数据:给SBUF赋值即可。
在程序中发送可以直接SBUF=0X11;
单片机就会收到11的信息,点击复位按钮后可以在串口助手的接收缓冲区中看到。
赋值后需要一段时间才能发送完成,发送完成后TI不再是0.
void main(){
uart_init();
SBUF=0x11;
while(TI==0);TI=0;//=1说明发送完成,然后手动复位
while(1){}
}
这样就在程序中发送了11信息。
电脑给单片机发送数据:通过串口助手发信息可以通过串口中断interrupt 4
实现。
void uart() interrupt 4 //串口通信中断函数
{
u8 rec_data;
P2=0x00;//这一句使得函数成功触发时LED灯全亮,便于调试
if(RI==1){P2=~SBUF;RI=0;}//因为发送和接收中断共用4中断,这句用于区分具体是发送还是接收中断
//如果是接收中断,RI=1,那么只简单执行这两句即可。
SBUF=rec_data; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
以上程序可以将发送缓冲区中输入的数据发给单片机,单片机再在接收缓冲区中原封不动地呈现出来。文章来源:https://www.toymoban.com/news/detail-483050.html
文本模式和 HEX 模式就是文本和 ASCII 码的转换。文章来源地址https://www.toymoban.com/news/detail-483050.html
到了这里,关于51单片机学习笔记_6 IO通信:电脑与单片机之间的通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!