单片机通过串口与电脑通信
2023-09-11 14:21:43 时间
串口寄存器的配置及使用
可手动配置,也可用STC-ISP工具的波特率计算器生成配置函数
PCON寄存器的SMOD位置1,PCON |= 0x80,设置波特率倍增:
因为波特率倍增了,所以TH1和TL1设置波特率时,要比预设定的波特率小,如要得到9600,则TH1和TL1就要配成4800的,然后再经过倍增得到9600;想要得到4800,就要配置成2400
//串口初始化函数
void UartInit(void) //4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD,波特率倍增
SCON = 0x50; //设定串行口的工作方式是:8位数据,可变波特率,这里RENw位置1,表示允许串行接收,不接收时置0
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF4; //设定定时初值,这里配置的是2400波特率,但使能了SMOD为1,波特率倍增,所以最终波特率为4800
TH1 = 0xF4; //设定定时器重装值,
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //开启总中断
ES = 1; //当需要接收电脑的数据时,是通过中断方式接收的,所以要开启串口中断
}
PCON寄存器的SMOD位置0,PCON |= 0x7F,设置波特率不倍增:
想要什么波特率,TH1和TL1就配置成什么波特率初值
//串口初始化函数
void UartInit(void) //4800bps@11.0592MHz
{
PCON &= 0x7F; //不使能波特率倍速位SMOD,波特率不倍增
SCON = 0x50; //设定串行口的工作方式是:8位数据,可变波特率,这里RENw置1,表示允许串行接收,不接收时置0
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值,不倍增的话,想要多少波特率就配成多少,这里配置的是4800波特率
TH1 = 0xFA; //设定定时器重装值,
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //开启总中断
ES = 1; //当需要接收电脑的数据时,是通过中断方式接收的,所以要开启串口中断
}
单片机给电脑发送数据
配置好初始化函数后,可直接写一个发送数据的方法,比较简单
/**
* @brief串口发送一个字符
* @param要发送的数据
* @retval无
*/
void Uart_SendByte(unsigned char dat)
{
SBUF = dat; //把数据放到SBUF缓冲器中,表示发送数据
while(!TI); //当发送标志TI仍为0时,条件为真则死循环,当TI标志置1,条件为假则退出循环
TI = 0; //数据发送完成后会硬件置1,为了下次发送需要软件置0
}
单片机通过串口发送字符串
/**
* @brief串口发送一个字符
* @param要发送的数据
* @retval无
*/
void Uart_SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/**
* @brief串口发送一个字符串
* @param要发送的字符串
* @retval无
*/
void Uart_SendString(char* str)
{
while(*str != '\0')
{
Uart_SendByte(*str);
str++;
}
}
void main()
{
UartInit();
Uart_SendString("student\r\n"); //串口向电脑发送字符串
Delay1ms(2000);
}
要实现在串口接收助手中换行显示,需要在字符后加上:\r\n,少一个都不行
发送字符串就是不断调用发送一个字符函数将字符逐个发送,遇到’\0’停止
电脑发送数据给单片机
需要开启串口中断接收数据,使能串口中断,即SCON寄存器的REN位置1
无论是发送还是接收都会触发中断,要在中断函数中处理
/**
* @brief中断处理函数
* @param无
* @retval无
*/
void Uart_Routine(void) interrupt 4
{
re_dat = SBUF; //定义一个全局变量接收电脑发来的数据
while(RI == 0);
RI = 0; //RI软件置0
P2 = ~re_dat; //根据接收到的数据将LED灯点亮
Uart_SendByte(re_dat); //同时将接收到的数据再发送到电脑上显示
}
电脑发送字符串控制开关LED灯,开灯"open",关灯"close"
/**
* @brief串口处理函数
* @param无
* @retval无
*/
void Uart_Rountine() interrupt 4
{
static unsigned int p = 0;
while(!RI); //接收中断请求标志位,接收到RI=1,需要软件置0
RI = 0; //软件置0
rec[p] = SBUF; //每次进中断获取一个字节的数据放到rec数组中,然后下标后移,接收完一个字符串
p++;
if(p == size) //判满操作
{
p = 0;
}
if(strstr(rec,"op")) //如果RX收到的字符串有子串“op”则表示开灯
{
LED1 = 0;
LED2 = 0;
p = 0;
memset(rec,'\0',size); //清空rec数组的内容
}
if(strstr(rec,"clo")) //如果RX收到的字符串有子串“clo”则表示关灯
{
LED1 = 1;
LED2 = 1;
p = 0;
memset(rec,'\0',size);
}
}
整体示例代码
#include "reg52.h"
unsigned char re_dat;
//串口初始化函数
void UartInit(void) //4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD,也可选择不使能,不使能时是0x7F
SCON = 0x50; //设定串行口的工作方式是:8位数据,可变波特率,这里REN置1,表示允许串行接收,不接收时置0
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF4; //设定定时初值,这里配置的是2400波特率,但使能了SMOD为1,波特率倍增,所以最终波特率为4800
TH1 = 0xF4; //设定定时器重装值,可根据STC-ISP工具配置
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //开启总中断
ES = 1; //当需要接收电脑的数据时,是通过中断方式接收的,所以要开启串口中断
}
//发送数据函数
void Uart_SendByte(unsigned char dat)
{
SBUF = dat; //把数据放到SBUF缓冲器中,表示发送数据
while(!TI); //当发送标志TI仍为0时,条件为真则死循环,当TI标志置1,条件为假则退出循环
TI = 0; //数据发送完成后会硬件置1,为了下次发送需要软件置0
}
//中断处理函数
void Uart_Routine(void) interrupt 4
{
re_dat = SBUF; //定义一个全局变量接收电脑发来的数据
while(RI == 0);
RI = 0; //RI软件置0
P2 = ~re_dat; //根据接收到的数据将LED灯点亮
Uart_SendByte(re_dat); //同时将接收到的数据再发送到电脑上显示
}
int main()
{
UartInit();
while(1)
{
}
}
相关文章
- 远程办公:在外随时远程控制公司电脑
- 将本地电脑文件复制到虚拟机系统中详细方法
- uni-app - 实现全屏自适应且不变形背景大图,设置一张图片占满全屏(根据手机或电脑尺寸自动拉伸背景图像),用于页面是一张平铺的大图做背景的情况,全端兼容
- 入侵别人电脑后你必须要会的Linux与window系统用命令行下载网络资源的15种方式
- 记一次系统重装后电脑的优化设置
- 如何选择一台适合Java开发的电脑
- 与远程电脑间不能复制粘贴
- 台式机电脑散热之狂想曲——主机机箱散热的另类方法(纯空想中ing)
- Windows7电脑上不去网,ipconfig查询时默认网关会出现0.0.0.0问题的解决
- 查看电脑已连接的WiFi密码
- 为电脑应用软件添加快捷键启动方式(一种添加环境变量的方式)
- 新病毒或已"潜伏"电脑 同样源自美国武器库
- 怎么在windows7系统我的电脑中添加快捷方式