如何用c语言串口通讯,串口通信入门
在讲解本章的内容之前请大家先反复阅读《手把手教你学51单片机》文档的第11章内容,很多概念文档都已详细讲解有。
1.波特率
串口通信就是单片机与电脑端,单片机与单片机,单片机与模块器件之间互发信息进行通信,比如单片机发送一个“1”的字符给电脑端,电脑端的窗口就会接收到“1”。我们常用的波特率为9600,所谓9600指的是一秒钟单片机可以发送9600个数据位,也就是1秒钟的时间里单片机可以发送(9600/8)=1200字节。
如果我们想发送一个字符“A”给电脑端的窗口,那么字符“A”对应的ASCII值就是65,二进制表示为01000001。
2.通信引脚
单片机的P3.1是发送引脚,也就是说要发送字符“A”,这个引脚的变化如下图所示
单片机要发送一个字节给电脑端,首先发送引脚需要先拉高,然后拉低持续(1/9600)秒,电脑端检测到这个低电平信号就会准备接收数据字节。然后我们要发送的二进制位是01000001,但是串口通信发送的字节是低位在前,高位在后,所以上图的发送顺序就是01000001反过来为10000010。一个字节发送完成之后还要发送一个停止位1,电脑端接收到这个停止位就认为一个字节发送完成了。
我们用定时器来实现引脚的持续时间,怎么定时(1/9600)秒怎么设置,计算一下就可以了
(1/9600)=X*(12/11059200)
解得X=96。
因为定时时间间隔比较短,所以我们使用定时器0的工作模式2就可以了。填充TH0的初始值就是256-96=160=0xA0。
因为P3.1在“#include”已有定义为TXD,我们直接用即可。通过按K4来启动发送字节数据。
3.代码#include
#include //详见第六章第8讲
#include //详见第八章第11讲
void TIM0_Mode2_Init()
{
TMOD&=0xF0; //清0低四位
TMOD|=0x02; //设置定时器0为工作模式2
TH0 = 0xA0; //计算出波特率9600
TL0 = 0xA0;
ET0 = 1; //闭合定时器0中断的开关
TR0 = 1; //启动定时器0
}
void main()
{
u8 key;
LED_Init(); //初始化LED硬件模块
KEY_Init(); //初始化按键模块
EA = 1; //闭合总中断开关
TIM0_Mode2_Init(); //定时(1/9600)秒
TR0 = 0; //先关闭定时器
while(1)
{
key=KEY_Scan(0,1000);
if(key==4)TR0 = 1;//开启定时器启动一次字节传输,按一次发送一次。
}
}
void TIM0_IRQHandler() interrupt 1
{
static u8 cnt=0,i,TXDBUF=65; //字符“A”的ASCII值为65
cnt++; //cnt一直在1~10之间变化
if(cnt==1)TXD=0; //cnt变为1,发送起始位,这次的中断函数就执行完了,持续够(1/9600)秒之后,再次进入中断函数,然后就是进入发送数据字节的8位的任务
if (cnt>=2 && cnt<=9) //发送8位数据位,从低位开始引脚的变化为 1 0 0 0 0 0 1 0
{
TXD = TXDBUF & 0x01; //“TXDBUF & 0x01”的表达式就是,要么等于1要么等于0,这样P3.1的引脚要么保持高电平,要么保持低电平
TXDBUF >>= 1;
}
if (cnt == 10)
{
TXD = 1; //发送停止位
TR0 = 0; //关闭定时器,结束一次字节传输
cnt=0;
i++;
TXDBUF=65+i; //下次按按键发送的是 B C D E···
}
}
大家可能对中断函数里的内容感到艰涩难度,这里简单说明一下,我们按下K4启动了定时器,然后第一次进入中断函数时,做的任务就是拉低P3.1,然后这次的中断函数的任务就结束了,等过了(1/9600)秒之后,再次进入中断函数,上一次拉低P3.1的时间已经持续够(1/9600)秒了,这第二次的中断函数任务就是拉高P3.1,因为发送字符A这个字节的最低位为1,持续够(1/9600)秒进入第三次执行中断函数,拉低P3.1,第四,第五,第六,第七都是拉低P3.1发送0,以此类推,到第10次中断函数执行就是拉高P3.1发送停止位,关闭定时器结束一次字节的传输,要想再次发送需要按K4启动定时器,“TXDBUF=65+i;
”表示下次发送的是66这个数据,再下次就是发送67······
4.软件设置
在软件界面选择串口助手,选用字符格式显示,查看波特率是否为9600,最后点击“打开串口”。
不断地间隔按K4,就会看到电脑端显示出单片机发送过来的字符数据
如何用c语言串口通讯,串口通信入门相关推荐
- QT 多线程串口通讯 串口助手
前言 模仿XCom写的一个串口助手 没模仿完全 因为帮助页是我不需要的 其次就是协议通讯我也不太懂 所以这2个界面也没有弄 1.讲一些个人认为比较麻烦的实现功能 其实如果用QT比较多应该都明白 那么多 ...
- s7300plc串口通信_s7-300串口通讯.ppt
s7-300串口通讯 串口通信特点 1:点到点连接 2:串形通信 信息字节的每个位按照固定的次序一个连接一个传输 3:通信双方约定统一的传输速率.数据位.奇偶校验.停止位 4:半双工.全双工操作 串口 ...
- 基于VB的串口通讯及其软件实现
1 串口通信的通信机理 PC串行通信是指直接对串行端口的UART(PC机的通用异步收发器,也叫异步通信适配器,是PC机用于异步通信的接口)进行编程实现的通信 一般说来,PC机都有一个或多个串行端口,它 ...
- .NET Core 跨平台 串口通讯 ,Windows/Linux 串口通讯
1,前言 开发环境:在 Visual Studio 2017,.NET Core 2.x 串口通讯用于设备之间,传递数据,物联网设备中广泛使用串口方式连接通讯,物联网通讯协议 :Modbus 协议 A ...
- STM32 CubeIDE(九)串口通讯
STM32 CubeIDE(九)串口通讯 串口通讯 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在 ...
- 51单片机(八).单片机的I2C与串口通讯
STC89C52的I2C与串口通信 I2C总线 单片机电路中的I2C总线(Inter Integrated Circuit Bus)是一种Philips公司推行的串行总线标准.连接在总线上的外设通过总 ...
- 串口通讯基本原理 【详细】
串口通信的基本知识 本文介绍了串口通讯的基本概念.数据格式.通讯方式.典型的串口通讯标准等内容. 串口通讯,RS232,RS485,停止位,奇校验,偶校验 1 串口通讯 串口通讯(Serial ...
- STM32 —— 串口通讯
STM32 -- 串口通讯 什么是串口通讯 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,其通讯协议可分层 ...
- c#串口通讯详解(附源码)
串口通讯 串口通讯是计算机传输数据的一种通讯方式,只不过是以比特位来传输数据的 串口通讯的相关参数 波特率: 波特率的大小代表每秒钟可以传输多少个二进制位,如波特率是9600,能每秒传输9600二进制 ...
最新文章
- Oracle事务和锁
- 「后端小伙伴来学前端了」Vue中Props配合自定义方法实现组件间的通信
- Android使用ImageView显示网络图片
- 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件...
- 转移纸缺陷在线检测系统
- java poi excel模板变量_Java Web之POI操作Excel2016模板
- Python数据挖掘Pandas
- 电商后台管理系统技术总结(黑马)
- php 邮件上传类阿里云邮件上传接口
- 社交网络中基于张量分解的好友推荐
- Prometheus + Grafana 图形化监控实践
- canvas给文字增加阴影效果
- R语言统计方法-我常用的
- 基于pytorch的胶囊网络minst图像分类实现
- 矛与盾---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三十五)
- 【操作系统】操作系统在计算机中扮演的角色
- 王者荣耀服务器维护2020421,王者荣耀维护
- 截图翻译的方法有哪些
- 【微信小程序入门到精通】— 事件绑定的详细解读
- 常见蛋白质种类_关于健身常用的4种蛋白粉
热门文章
- APP 应用内活动运营,有哪些活动形式?
- DayDayUp:佛说:有果必有因。 黑格尔说:世界上没有无缘无故的爱,也没有无缘无故的恨。
- 【论文阅读】7-Discovering Structural Regularity in 3D Geometry
- 计算机无法屏幕亮度,win7电脑屏幕亮度无法调节怎么办?调节屏幕亮度的方法...
- vscode在报错时候自动格式化代码
- 支付宝余额提现收手续费了
- Rust + GO 大战 C/CPP + JAVA
- 10.26 node.js day01
- python求最小公倍数
- Android利用谷歌地图获取并解析经纬度对应的地理位置