C51 单片机开发单片机发数据给 PC

码农UP2U

共 2557字,需浏览 6分钟

 ·

2024-07-01 07:30

公众号文章同步阅读网址:www.netor0x86.com

闲话:某人在某剧中有这样一段话,“酒喝不出朋友,烟抽不走寂寞,诉换不来同情,怨改不了命运,炫带不了幸福,愤解不了饥渴,在这个凉薄的世界,自己不强大,什么都是浮云,狐朋狗友说的再美,都抵不过碎银几两”。你认可么?

本篇文章整理了串口的波特率的初始化,以及向 SBUF 发送数据的代码实现。


0x01:串口发送数据的准备

串口发送数据给电脑,那么按照约定会设置串口相关的参数,比较重要的就是波特率。设置波特率并不是单片机一方进行设置,而是单片机和电脑都要进行设置。

波特率表示每秒传送二进制代码的位数,所以两端要一致。

波特率的初始化,也是一系列寄存器的设置,这里可以使用 STC-ISP 来生成,如下图:

从图中我们可以看出,波特率设置为 9600,串口使用的是 串口1,数据位是 8位数据,波特率跟晶振相关,那么就需要用到定时器,这里我们使用 定时器1(8 位自动重载),定时器时钟使用 12T。

然后我们发送数据时,我们就一秒发送一个字符,那么让 STC-ISP 来给我们生成一个软件延时,如下图:

有了上面这两部分,我们就可以完成我们要的功能了。


0x02:代码实现

我们发送的数据是小写字母 a ~ z,然后循环发送,一秒钟发送一个字母。

代码如下:

#include <intrins.h>
#include "reg52.h"

sfr AUXR = 0x8e;    /* 声明AUXR寄存器的地址 */

void UartInit(void)  //9600bps@11.0592MHz
{
 PCON &= 0x7F;
 SCON = 0x50;
 AUXR &= 0xBF;
 AUXR &= 0xFE;
 TMOD &= 0x0F;
 TMOD |= 0x20;
 TL1 = 0xFD;
 TH1 = 0xFD;
 ET1 = 0;
 TR1 = 1;
}

void Delay1000ms()  //@11.0592MHz
{
 unsigned char i, j, k;

 _nop_();
 i = 8;
 j = 1;
 k = 243;
 do
 {
  do
  {
   while (--k);
  } while (--j);
 } while (--i);
}

void main()
{
    char data_msg = 'a';
    
    UartInit();
    
    while (1)
    {
        Delay1000ms();
        SBUF = data_msg;
        data_msg ++;
        if (data_msg > 'z')
        {
            data_msg = 'a';
        }
    }
}

然后通过 STC-ISP 将代码生成的 hex 文件写入单片机,然后打开 STC-ISP 的 串口助手,选择连接单片机的串口,选择相同的 波特率、校验位 和 停止位。最后点击 打开串口 按钮,就可以收到单片机发来的数据了。如下图所示:


我是一个程序员,了解 C、PHP、Java、ASM、Python,有 信安、CISP 证书,写小白也能看得懂的文章,感谢关注!!!

我的网站:https://www.netor0x86.com

我录制的视频课程:

1. 入门级栈溢出分析

2. WEB端获取MAC地址真实项目案例

3. PHP扩展模块开发之DLL编写与调用

4. C语言零基础入门教程

5. PE 文件结构初识与二进制手写可执行程序

浏览 29
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报