51单片机学习笔记_6 IO通信:电脑与单片机之间的通信

本文介绍了单片机通过IO口进行通信的基本概念,包括串行通信、并行通信、异步与同步通信的差异。详细讲解了串口通信中的串行接口如UART,以及51单片机的串口通信配置,如波特率、溢出率、校验位和停止位。还提到了STC89C52系列单片机的UART工作模式,并给出了初始化函数示例以及如何进行数据发送和接收。此外,文章还涉及了电脑与单片机间的通信以及串口助手的使用。

通信

通信基础知识

单片机还可以通过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 表示低。

image-20230128231105461

STC89C52系列有一个通用异步收发器(UART P30 P31端口),有四种工作模式。

  • 模式0:同步移位寄存器;
  • 模式1:8位UART,波特率可变(常用);
  • 模式2:9位UART,波特率固定;
  • 模式3:9位UART,波特率可变.

image-20230129013008311

TXD RXD 直接接到单片机 P30 P31 上. 另一端是单片机上自带的,我们把数据线连到电脑上就接上了。

image-20230129014312317

溢出率到波特率的计算见图。

串口助手和单片机要规定好发送数据的形式。

image-20230129193307966

串口数据缓存寄存器: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自带一个串口调试助手。

image-20230103020705868

串口选择左侧和串口号一致的选项。

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; //清除发送完成标志位
}

以上程序可以将发送缓冲区中输入的数据发给单片机,单片机再在接收缓冲区中原封不动地呈现出来。

文本模式和 HEX 模式就是文本和 ASCII 码的转换。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰海宽松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值