C51 单片机开发单片机发数据给 PC
共 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 文件结构初识与二进制手写可执行程序