51单片机-串口通信入门

发布者:huanran最新更新时间:2021-10-14 来源: eefocus关键字:51单片机  串口通信  发送字符 手机看文章 扫描二维码
随时随地手机看文章

1.波特率

串口通信就是单片机与电脑端,单片机与单片机,单片机与模块器件之间互发信息进行通信,比如单片机发送一个“1”的字符给电脑端,电脑端的窗口就会接收到“1”。我们常用的波特率为9600,所谓9600指的是一秒钟单片机可以发送9600个数据位,也就是1秒钟的时间里单片机可以发送(9600/8)=1200字节。

如果我们想发送一个字符“A”给电脑端的窗口,那么字符“A”对应的ASCII值就是65,二进制表示为01000001。


2.通信引脚

单片机的P3.1是发送引脚,也就是说要发送字符“A”,这个引脚的变化如下图所示

10.1.png

单片机要发送一个字节给电脑端,首先发送引脚需要先拉高,然后拉低持续(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.代码

1.波特率


串口通信就是单片机与电脑端,单片机与单片机,单片机与模块器件之间互发信息进行通信,比如单片机发送一个“1”的字符给电脑端,电脑端的窗口就会接收到“1”。我们常用的波特率为9600,所谓9600指的是一秒钟单片机可以发送9600个数据位,也就是1秒钟的时间里单片机可以发送(9600/8)=1200字节。


如果我们想发送一个字符“A”给电脑端的窗口,那么字符“A”对应的ASCII值就是65,二进制表示为01000001。


2.通信引脚


单片机的P3.1是发送引脚,也就是说要发送字符“A”,这个引脚的变化如下图所示


10.1.png


单片机要发送一个字节给电脑端,首先发送引脚需要先拉高,然后拉低持续(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,最后点击“打开串口”。

10.01.png

不断地间隔按K4,就会看到电脑端显示出单片机发送过来的字符数据

10.02.png


关键字:51单片机  串口通信  发送字符 引用地址:51单片机-串口通信入门

上一篇:51单片机-超声波模块
下一篇:51单片机-简洁式串口通信

推荐阅读最新更新时间:2024-11-16 21:55

INT0和INT1中断计数 PROTEUS 和51单片机教程
功能:INT0和INT1中断计数,INT0和INT1分别计数和清零,也可以把两个连在一起计数 PROTEUS 和51单片机教程 程序的C语言代码如下: /* INT0与INT1中断计数 */ #include typedef unsigned char uint8; typedef unsigned int uint16; sbit K3 = P3^4; sbit K4 = P3^5; void delay(uint16 x) { uint16 i,j; for(i = x; i 0; i --) for(j = 114; j 0; j --); } code uint8 LED_CODE = {0x
[单片机]
INT0和INT1中断计数 PROTEUS 和<font color='red'>51单片机</font>教程
51单片机播放音乐(一):蜂鸣器
蜂鸣器 蜂鸣器分为有(震动)源的和无源的,有源的无法控制频率,所以用无源的才能播放音乐。无源蜂鸣器需要自己控制输入变化的信号才能发声,最简单的就是输入方波信号了,通过单片机控制方波的频率就能发出不同音调的声音 这是发出50%占空比方波的代码: int i; while (1) { for (i = 0; i 10; ++i); // 改变循环次数可以改变方波频率 P1_0 = 1; for (i = 0; i 10; ++i); P1_0 = 0; } 乐谱转成循环次数 首先要有蜂鸣器乐谱,就是用频率和持续时间表示一个音符的乐谱,至于如何获取蜂鸣器乐谱可以看我上一篇文章。由于单片机的运行速度很慢,如果在单片
[单片机]
<font color='red'>51单片机</font>播放音乐(一):蜂鸣器
51单片机-按键的扫描检测与消抖
触发按键,简称按键,是电路设计中常用的器件之一。种类很多,有贴片式的,有直插式的,有四条腿的,也有两条腿的。一般根据需求,进行高低、大小的选择。 如上图所示,样式非常多。记得我第一次去中发买按键的时候,老板问我要什么样的,我也不知道,就说常用的就行。老板嘿嘿一笑,知道我是新人,就拿了几款常见的给我选。 现在自然不会这么笨,一般来说,选择的参数也就这么几项,尺寸、高度、封装方式。例如我想买一种按键,我就直接问老板:6*6*5,四脚贴片的按键有木有? 6*6是什么意思?占地面积,单位是毫米,就是说长和宽都是6mm的。 5是高度,按键整体高度,单位是毫米。要求精细的,会说明按键座的高度和按键头的高度。
[单片机]
学<font color='red'>51单片机</font>-按键的扫描检测与消抖
51单片机之IO口输入的内部工作原理 ;IO内部电路分析;独立按键实现和消抖
(一)IO口驱动能力:(注意:1的时候是驱动电流,0是驱动灌电流) 灌电流:在P0口为0V时,支持外接的电源流入的电流为12mA. 灌电流 如上图所示,当单片机输出低电平时,允许电路向单片机引脚内灌入电流,这个电流就叫做“灌电流”,从而发光二极管被点亮,发光二极管所在的电路可以叫做“灌电流负载”。 拉电流 如上图所示,当单片机输出高电平时,允许电路从单片机的引脚拉出电流,这个电流就叫做“拉电流”,从而发光二极管被点亮,发光二极管所在的电路可以叫做“拉电流负载” 上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。用单片机输出高电平,但由于后续电路的影响,输出的高电平不高,就是达不到VCC,影响电
[单片机]
<font color='red'>51单片机</font>之IO口输入的内部工作原理 ;IO内部电路分析;独立按键实现和消抖
8051单片机实战分析(以STC89C52RC为例) | 03 - LED流水灯
1 原理图 从图中不难看出,整个P2端口都接有LED,写代码时需要驱动整个P2端口。 2 代码 #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 #include intrins.h //因为要用到左右移函数,所以加入这个头文件 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define led P2 //将P2口定义为led 后面就可以使用led代替P2口 /**********************************************************
[单片机]
80<font color='red'>51单片机</font>实战分析(以STC89C52RC为例) | 03 - LED流水灯
51单片机玩转物联网基础篇01-开发环境搭建
前言 上至航天,下至儿童玩具,凡事沾一点智能的东西,都离不开单片机的身影…,本文开始,我们学习STC89C52单片机,这款单片机属于8051系列单片机,51单片机作为入门级单片机不仅在教学实验中应用广泛,在实际项目中应用亦是十分广泛。 一、基础知识 1.什么是单片机? 单片机是一个单片微型计算机,由中央处理器CPU、数据存储器RAM、程序存储器ROM、输入/输出设备(键盘、显示屏等)等集成到一块芯片上组成。 2.单片机能做什么? 前言中开篇便比较好的阐释了单片机的功能,凡是沾点智能的影子的东西,都离不开单片机的身影,尤其是当下物联网正发展的如火如荼,单片机又迎来新的春天,目前智能仪表、智能小家电用的比较多的便是51单片机+
[单片机]
<font color='red'>51单片机</font>玩转物联网基础篇01-开发环境搭建
51单片机串口通信需要加超时中断吗?
接收数据时,超过一定时间就算出错. 这个超时的时间是单片机自己算出的吗?超时的时间是由编程序的人定的,他定多长就多长 从一段程序开始 实现电脑向 单片机发送一些数据,单片机返回Iget +数据 #include #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i;//声明标志位 flag uchar code table = I get void init() { TMOD=0x20;//设置T1定时器工作方式为2 8位初值自动重装的8位定时器 这里设置了两个计数器的工作方式 TH1=0xfd; /
[单片机]
基于51单片机的便携远程多路数据采集系统
引言: 在工业生产和各种科学技术研究过程中,常常要对各种数据进行采集和处理,通常用的采集方式是在PC机或者工控机内安装数据采集卡,例如 A/D卡及RS-422卡、RS-485卡。采集卡易受机箱内环境的影响,以及计算机插槽数量和地址、中断资源的限制,不能挂接很多设备。尤其是在进行油井压裂作业时,因为压裂工作现场比较危险,而又同时需要对压裂时的各种数据进行采集和处理,以便进行远程实时监控,因此利用工控机进行远程数据采集处理,就难以满足远程数据传输和便携的要求。本文探讨一种基于单片机和手提电脑的远程数据采集系统,既可以进行远程数据采集,而且灵活轻便利于携带,同时也减低了设备成本。 1 主要芯片介绍 AT89C52是一个低功耗,高性能
[单片机]
基于<font color='red'>51单片机</font>的便携远程多路数据采集系统

推荐帖子

求基于单片机音乐彩灯控制电路
基于单片机的数字音乐芯片控制电路,通过对音响设备输出端子中输出信号的音乐节奏进行识别和数据采集,合理地利用芯片的接口技术,并利用嵌入式单片机系统实现对音乐节奏识别,灯光系统的智能控制,使灯光随着音乐的节奏、大小、音调而变化(1)基本性能要求①有三路不同控制方法的彩灯,用不同颜色的LED表示;②第一路为音乐节奏控制彩灯,按音乐节拍变换彩灯花样;③第二路按音量大小控制彩灯。音量大,彩灯亮度加大,且彩灯被点亮的数目增多,反之亦然;④第三路按音调高低控制彩灯,低音时,某一
fyhsam 51单片机
Micrium针对STR9的UC/OS系统
从Micrium网站上下载了移植到STR9上的UC/OS系统,生成intel标准格式的.hex文件时因为文件太大而出错,只能生成.sim文件。CAPS软件如何烧录.sim文件呢?Micrium针对STR9的UC/OS系统从Micrium网站上下载的移植到STR9上的UC/OS系统根本就生成不了.hex的文件。没有人遇上这问题吗?试了试把一些用不上的c函数注释掉,并且让编译器最大优化size。虽然生成了一个.hex文件,但把程序下载到板上后,使用ping
64331351 stm32/stm8
改造4-20mA两线制无源数显表第九帖(硬件照片)
搞到半夜了,终于把所有硬件都准备齐,先给个照片吧,明天再收官软件总调。目标仪表由电流源驱动并处于测电流模式:硬件合影:总合影图中左下绿板为自制实验板,上半部是光耦隔离板,本项目最终用板;下半部分是针对需要改造对象仪表主板上应用的主控芯片--ATMEL单片机ATMega329而选用的同厂家芯片ATMega88,为尽量接近仪表所采用芯片便于模拟实际效果,主要测试串口隔离通信
7905 安森美和安富利物联网创新设计大赛
数字万用表图纸
数字万用表图纸数字万用表图纸不错,顶一个!LZ有没有FLUKE19万用表图纸呀你要做万用表??!不是我自已一个万用表有点问题了,想找找这图纸Re:数字万用表图纸挣钱!!!Re:数字万用表图纸没签只好回帖Re:数字万用表图纸没钱只好回帖Re:数字万用表图纸好东西收下了好东西,好东东,谢了!下载来看看~~顶一下请教一下楼主,八位半电表目前国内有人做出来了吗?有什么技术上的难点?谢谢!非常感谢楼主的辛勤工作!先下留着,谢谢楼主了呵呵好东
ailiaowjd PCB设计
can总线通信
在WINCE下,想通过调用WIN32函数完成CAN总线通信功能,即通过CreateFile()获取CAN1的句柄,再通过调用ReadFile()和WriteFile()进行收发操作,大概思路就是这些,谁做过类似的项目,最好有具体的源码,兄弟我感激不尽!can总线通信帮顶一下.源码没有,只能帮顶。引用楼主chenglidexiaoxue的帖子:在WINCE下,想通过调用WIN32函数完成CAN总线通信功能,即通过CreateFile()获取CAN1的句柄,再通过调用ReadFile
jjphero 嵌入式系统
刚发现ST的旧网站还可以用,直接通过IP访问
http://211.100.26.51/只是不知道还会不会update刚发现ST的旧网站还可以用,直接通过IP访问前几个页面真他妈快,不过到里面就没东西了,估计转移了只能看看页面,下载链接都无效了这是来自路由服务器的缓冲区,需要获取具体文件时就会发现原服务器不存在了。哈哈,还不知道看来大伙还是比较怀念旧网站
64331351 stm32/stm8
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved