单片机通过串口与电脑通信
串口寄存器的配置及使用
可手动配置,也可用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,表示允许串行接收,不接收时置0TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xF4; //设定定时初值,这里配置的是2400波特率,但使能了SMOD为1,波特率倍增,所以最终波特率为4800TH1 = 0xF4; //设定定时器重装值,ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1EA = 1; //开启总中断ES = 1; //当需要接收电脑的数据时,是通过中断方式接收的,所以要开启串口中断
}
PCON寄存器的SMOD位置0,PCON |= 0x7F,设置波特率不倍增:
想要什么波特率,TH1和TL1就配置成什么波特率初值
//串口初始化函数
void UartInit(void) //4800bps@11.0592MHz
{PCON &= 0x7F; //不使能波特率倍速位SMOD,波特率不倍增SCON = 0x50; //设定串行口的工作方式是:8位数据,可变波特率,这里RENw置1,表示允许串行接收,不接收时置0TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xFA; //设定定时初值,不倍增的话,想要多少波特率就配成多少,这里配置的是4800波特率TH1 = 0xFA; //设定定时器重装值,ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1EA = 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软件置0P2 = ~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,需要软件置0RI = 0; //软件置0rec[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,也可选择不使能,不使能时是0x7FSCON = 0x50; //设定串行口的工作方式是:8位数据,可变波特率,这里REN置1,表示允许串行接收,不接收时置0TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xF4; //设定定时初值,这里配置的是2400波特率,但使能了SMOD为1,波特率倍增,所以最终波特率为4800TH1 = 0xF4; //设定定时器重装值,可根据STC-ISP工具配置ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1EA = 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软件置0P2 = ~re_dat; //根据接收到的数据将LED灯点亮Uart_SendByte(re_dat); //同时将接收到的数据再发送到电脑上显示
}int main()
{UartInit();while(1){}
}
单片机通过串口与电脑通信相关推荐
- 基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)
基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文) 导读:触摸屏能够直观.生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好.触摸屏和单片机通信,需要根据触 ...
- 【硬件控制】5. Pico使用串口与电脑通信
前几节都是在讲树莓派与外部的元件通信,本节来讲树莓派如何与电脑通信 本篇文章会教大家开发一个这样的上位机软件,用来和Pico通信,文章较长,耐心看完 先看一下树莓派Pico的引脚图吧 我们可以看到上面 ...
- 单片机: 串口向电脑发送数据
题目概述: 串口向电脑发送数据. 编程: #include<REG52.h> unsigned char Sec; void UART_Init() { PCON &= 0x7F; ...
- 51单片机:串口向电脑发送数据
单片机的串口配置可以使用SCT-ISP软件,方法如下,我的单片机晶振频率是11.0592Hz 试验程序如下: #include"regx52.h" #include"in ...
- 单片机串口输入c语言,单片机通过串口与电脑连接通信C语言源代码
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define uchar unsigned char uchar time,b_break,b_break_3; uchar buf ...
- C语言串口与网口转换,单片机通过串口与电脑连接通信C语言源代码
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define uchar unsigned char uchar time,b_break,b_break_3; uchar buf ...
- 51单片机_8-1 串口向电脑发送数据
文章目录 要求 效果 资源 main函数 要求 1.配置单片机串口,向电脑发送数据 效果 资源 工程文件压缩包 链接:https://pan.baidu.com/s/1bmbReFGNStYbg45F ...
- 51单片机之——串口通信(含实现部分)
目录 一 串口通信简介 二 前置知识 二 前置准备 三 实现单片机通过串口向电脑发送数据 四 实现单片机通过串口接收电脑发送数据 一 串口通信简介 本篇文章将实现两个部分,第一部分为单片机 ...
- pc-com串口(DB9)管脚定义和单片机uart串口
1.pc的串口com口,也就是RS-232接口定义(DB9) 引脚 定义 符号 1 载波检测 DCD(Data Carrier Detect) 2 接收数据 RXD(Receiv ...
- 51单片机-串口通信(串口向电脑发送信息电脑通过串口控制LED)
文章目录 前言 一.串行通信口的功能以及串行通信口的结构及原理 1.1 串行通信口的功能 1.2 51单片机串口的结构 二.串行通信口的控制寄存器 2.1 串行控制寄存器SCON 2.2 电源控制寄存 ...
最新文章
- spark spark streaming + kafka receiver方式消费消息
- 【08月14日】A股ROE最高排名
- SAP JAM的回收站
- SAP CRM呼叫中心异步搜索功能的实现
- 震惊kafka_5个令人震惊的统计数据证明日志不足
- c ++查找字符串_C ++类和对象| 查找输出程序| 套装1
- 学习Windows Mobile开发系列笔记(win32基本程序框架)
- ABP框架源码学习之修改默认数据库表前缀或表名称
- zbbz 坐标标注lisp_CAD_XY坐标标注AUTO_LISP程序
- python中fbncc_PythonBNCCorpusReader不能处理完整的bnc语料库
- 区块链毕业设计中期检查表模板
- python爬取微信运动_微信运动数据抓取(Python)
- nuvoton uboo2013引导流程 1 - 配置
- 【题解】【AcWing】1564. 哈希
- 打开CMD的方式以及常用的指令
- oracle12c关闭pdb,oracle 12c pdb启动与关闭
- 图片加水印怎么加,快速图片加水印?
- xp win7 绿色chrome
- iOS身份证的正则验证
- π型滤波器 计算_T型π型滤波器计算软件
热门文章
- WS小世界网络python快速实现——调用networkx包
- python语音合成并播放_用Python写一个语音播放软件
- 虚拟机超线程性能分析深入浅出
- Excel通过图片名插入图片
- 文件服务器域用户配额,域账号配额
- 已知分布函数求概率密度例题_助力高考:吃透数学17个必考题型,必定可以考130!(内附解题技巧+例题解析)...
- 经历没有亮点可讲?你需要做份“详历”
- 专利代理人的真实工作状况
- redhat linux 无线网卡,RedHat Linux 6.4安装RTL8188CUS无线网卡驱动
- linux shell命令行与脚本编程---处理输入输出