历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2021年08月26日 | 51单片机-串口通信入门

发布者:huanran 来源: 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单片机-简洁式串口通信

推荐阅读

你能听出来这是机器人在弹钢琴吗?不久前发生过一件钢琴大师郎朗都相当懵圈的事。那就是机器人竟然也可以弹钢琴了,这不是在抢饭碗吗,为了证明音乐的艺术性,甚至还携其爱徒与拥有“53根”的机器人进行PK 。最后,不得不对机器人的速度表示佩服,甚至还给出评价:机器人弹得速度很匀,而且没有错音。那究竟是什么赋予机器人手指如此的魔性?实现如此精准...
现在,金融科技已深深地嵌入到每一项金融服务业务中。如果没有金融科技,任何银行或保险公司恐怕都将无法运营。同时,对金融服务业而言,网络安全是一个非常现实且迫切的问题。 新思科技近期发布了《金融服务业软件安全状况》报告。数据安全中心Ponemon Institute对金融服务行业当前的软件安全实践进行了独立调查。报告重点呈现了金融服务行业的安全现状...
利用定时器计时,注释非常详细,可自己改变定时时间。单片机源程序如下:#include "reg52.h"#define GPIO_TRAFFIC P2#define GPIO_DIG P0typedef unsigned char u8;typedef unsigned int u16;//3-8译码器引脚位定义sbit LSA = P1^0;sbit LSB = P1^1;sbit LSC = P1^2;//交通信号灯南北方向控制引脚位定义sbit GREEN10 = P2^0;sbit R...
首先按照步骤修改相关信息之后执行make zImage出现了不少错误: 其中有代表性的错误如下: arch/arm/mach-s3c2440/mach-mini2440.c:189: error: array type has incomplete element type arch/arm/mach-s3c2440/mach-mini2440.c:190: error: array index in non-array initializer arch/arm/mach-s3c2440/mach-mini2440.c:190: error: (ne...

史海拾趣

问答坊 | AI 解惑

台湾半导体、集成电路风云人物简介

台湾的半导体产业是全球中占据着举足轻重的地位,tsmc、umc、via、日月光、sis等企业在都在各自领域里的翘楚,我们将集中介绍一些台湾半导体界的风云人物。也希望各位网友能修正和补充。台湾半导体加工业之父  台湾集成电路公司是一家没 ...…

查看全部问答∨

看看你是什么样的工程师吧????

转贴:女工程师的点评 我在一个网站上看到了这个帖子,觉得很有意思,对于我们PLC系统开发人员同样有效,大家分享! 看来成为好男人大家都需努力!!! 女工程师点评电路设计: 好的电路与优秀男人的10大共同点 作者:Eva Ye 每天, ...…

查看全部问答∨

Pool资源释放

我在Filter种Attach的时候,分配了一个Pool: NdisZeroMemory(&PoolParameters, sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));         PoolParameters.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;      ...…

查看全部问答∨

webserver里面如何操作串口?

打开一个网页,如何在网页(asp或html)里面操作wince的串口呢…

查看全部问答∨

51寄存器组问题

51的RAM中有4个寄存器组,可以通过PSW来设置使用那个寄存器组,然后其它的寄存器组就可以当作普通内存使用,我的问题是为什么要设置有四个寄存器组供选择,系统默认一个不就行了,设置有四个寄存器组供选择的好处在哪里?   麻烦请大虾 ...…

查看全部问答∨

红外编码实验 很经典

红外编码实验&nbsp; 很经典…

查看全部问答∨

【晒经典】个人觉得超级经典的电路!

本帖最后由 dontium 于 2015-1-23 13:07 编辑 即将要分析的电路如下,这个电路本人觉得设计的很经典。这个电路主要完成的任务就是监测流经Q1和采样电阻R6中的电流。单片机C8051F330对电流的各种情况做出动作和反应。分析的主要部分不是在单片 ...…

查看全部问答∨

在哪里可以下载到评估套件LM3S8962里面运行的那个程序。就是那个小游戏的源代码。

如题:        我说的是评估套件LM3S8962里面运行的那个程序。就是那个小游戏的源代码。 [ 本帖最后由 hhxianzi 于 2011-9-29 10:33 编辑 ]…

查看全部问答∨

【低功耗】低功耗FPGA电子系统优化方法

首先与实测系统功耗进行对比,验证了Xilinx公司ISE软件包中FPGA功耗估算工具XPower的准确性.然后对FPGA设计中影响系统功耗的几个 相互关联的参数进行取样,通过软件估算不同样点下的系统功耗,找到功耗最低的取样点,得到最佳设计参数,从而达到优化系 ...…

查看全部问答∨

at扩展指令的使用

使用支持AT扩展指令的DTU的问题,例如:发送短信 AT^SMS=158........ \"test ok\" 是不是可以直接在串口中处理这一条指令就可以了啊? 不用设置短信信息格式,短信服务中心地址等等了啊?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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