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-10 11:20

基于51单片机的分贝检测仪设计
一.硬件方案 分贝是由传感器把非电量转换为电量,传感器输出的是0-5伏的电压值且电压值稳定,外部干扰小等。因此,可以直接把传感器输出电压值经过A/D转换器转换得到数据送入单片机进行处理。此外,还需接入液晶显示,键盘设定,报警电路等。 硬件主要由51单片机电路+时钟晶振电路+复位电路(上电自复位,手动复位)+ADC0832模数转换电路+分贝传感器(放大电路)+按键设定电路+LCD1602液晶显示电路+蜂鸣器提示电路: 二.设计功能 (1)采用LCD1602液晶显示屏实时显示分贝值。 (2)使用小麦克风采集声音经过LM358放大信号后经过ADC0832进行采集,最终转换成分贝值。 (3)可以通过按键进行设定分贝限值,设定的分贝
[单片机]
基于<font color='red'>51单片机</font>的分贝检测仪设计
51单片机设计方案TOP10(十)
基于51单片机的多点温度控制系统设计   随着生活水平的提高,人们对家居需求由面积需求变为舒适需求。地板采暖采用辐射方式供暖,符合人体生理需求曲线,如果控制系统选取得当,不仅可以提高房间舒适度,更可以使系统运行费用降低许多。如今一般是在典型位置安装一个温控装置,温控装置连接到壁挂炉,温控器根据室温和温度设定直接控制锅炉运行,各房间不同回路由工作人员凭经验手动调节分水器球阀,改变不同回路的流量,从而达到调节各房间的室温的效果。使用这种控制方法,即使是有经验的工作人员,也难以调节得十分准确,何况各家庭成员由于年龄不同,所需舒适温度不同,需要经常对室温进行调节。   针对以上问题,我们利用 SST89E564RC 单片机及新型测温
[模拟电子]
<font color='red'>51单片机</font>设计方案TOP10(十)
51单片机与PC通信总结
51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。 无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。 在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。 常用的方法有: 接收数据时,使用“中断方式”,清除 RI 后,用一个变量通知主函数,收到新数据。 发送数据时,也用“中断方式”,清除 TI 后,用另一个变量通知主函数,数据发送完毕。 这样一来,收、发两者基本一致,编写程序也很规范、易懂。 更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多
[单片机]
C-51单片机动态显示01234567
上一章用静态显示1234.5,无需循环语句 比较简单,这次用动态显示01234567 直接给参考程序:使用Keil uVision5编程,Proteus 8 Professional进行仿真。 #include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delay(uchar x) { uchar i; while(x--) {
[单片机]
C-<font color='red'>51单片机</font>动态显示01234567
51单片机(二十)—— 定时器产生方波信号
在本文中,我们用定时器0来产生方波信号,包含两个实验,实验1产生一个频率为10kHz的方波信号,实验2产生一个频率为100Hz的方波信号。 实验1 实验1 中定时器0的初始化代码如下所示。 void init_T0(void) { TMOD|= 0x02; //使用方式2,8位自动重装载定时器 TH0=256-50; //给TH0和TL0赋初值,计数周期为50个机器周期 TL0=256-50; //采用12MHz的晶振,计时时长为50us EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } 代码中将定时器0设置
[单片机]
51单片机3个外部中断源中断响应编程举例
某系统有3个外部中断源1、2、3,当某一中断源变为低电平时,便要求CPU进行处理,它们的优先处理次序由高到低依次为3、2、1,中断处理程序的入口地址分别为1000H,1100H,1200H。试编写主程序及中断服务程序(转至相应的中断处理程序的入口即可)。 答:若仅在/INT0引脚接3个外部中断源 ORG 0000H LJMP MAIN ORG 0003H LJMP INT_EX0 ORG 0030H MAIN: CLR IT0 ; 采用低电平有效中断
[单片机]
51 单片机 sprintf 数字格式问题
最近做51小车,期间发现,sprintf在51单片机上发生了一点小意外。 出现意外的源程序如下: #include reg51.h #include stdio.h typedef unsigned char uchar; typedef unsigned int uint; uchar n; uint dat; char buf ; void delay_ms(unsigned int nCount) { unsigned int j = 0,i=0; for (j = nCount; j != 0; j--) for(i = 7960; i != 0; i--); } #define UART #define SENDST
[单片机]
51 单片机 sprintf 数字格式问题
51单片机实现在主函数while循环中驱动数码管的动态扫描程序
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200604 ---- @ModifiedTime: 20200604
[单片机]
<font color='red'>51单片机</font>实现在主函数while循环中驱动数码管的动态扫描程序

推荐帖子

TFT LCD接口芯片 SN65LVDS822
本帖最后由dontium于2015-1-2311:40编辑现在低端的单片机,直接驱动TFT的基本没有,一直想找一款TFT驱动芯片,今看到TI的这个芯片,很合适。以下是TI的介绍:SN65LVDS822是一款采用现代CMOS工艺进行设计的高级FlatLink?LVDS接收器。它具有几个独特的功能,其中包括3个可选CMOS输出转换率,1.8V至3.3V的CMOS输出电压支持,一个引脚分配交换选项,集成差分端接(可配置),一个自动低功
dontium 模拟与混合信号
Cyclone III FPGA硬件电路 电源设计特别考虑地方
CycloneIII需要提供如下电源:Vccint:内核电源;Vccio:Bank1~Bank8,输入输出BUFFER电源;VccA:模拟PLL电源VccD:数字PLL电源关于上面电源具体数字,不同的器件需求不同!特别关注Vref这个电源,这个电源主要为那些特别的IO标准提供能量,主要是提供电压偏置,而不是提供大的输入输出电流的.这个电源可以用LDO或电阻网络分压得到.如果该电压标准在BANK中不用的话,则V
eeleader FPGA/CPLD
世界各国安规符号
安规的目的是防止产品使用者作用产品时因产品质量问题受到伤害。因此,世界各国纷纷制定自己的安规标准,并赋予一种特殊的标志,以以标志为安全的产品,故有“安规认证”。下面列举下常用的一此安规标志符号。1、亚洲亚洲地区常常看到的有中国,中国台湾、韩国与日本。电子产品要在这些地方卖时,要申请该国的安规,并在铭板上标上相应的安规标志。2、美洲有美国、巴西、墨西哥、智利等。电子产品申请美规、巴西规等等时,通过的话会标志上各国的安规符号,这样就可以进入该国市场了。
qwqwqw2088 模拟与混合信号
【PSoC4心得】温度模拟测试箱 ----> 阅读资料,了解篇
非常意外,突然多了一个第三批,偶还排在最后,看起来,我还是那个最后溜进名单的。然后随之被抓进PSoC4群,大家都在说,板子怎么还没到。不过我倒是不太关心这个事情,因为一个实际的工程项目总是会遇到各种意外延迟,阻隔,这种事情我再熟悉不过。因此,实际上,在开发板到来以前,我还可以做很多事情,很多准备,否则,板子到了,我还是的花这些时间,到那时候恐怕就来不及了。于是我开始大量搜集这些资料。并了解了评奖的方式——嗯,我是把它当成一次比赛来做,也算是完了我大学四年没参加过任何比赛
辛昕 单片机
Tcpmp0.72 A4(atlas IV) Wince6.0 上crash的问题
之前已有类似的帖子,但没有答案~~请高手解决~~Tcpmp0.72A4(atlasIV)Wince6.0上crash的问题關注下。。不過...TCPMP的問題向來是很少人回答。。。因為知道大多也不會說。。涉及商業利益問題。。唉。。關注6.0下TCPMP的移植問題各位高手,如能帮我解决问题,现金酬谢也行~~~~具体事项加我MSN:zhen.yang@live.cn.想知道你要什么样功能的TCPMP。能播放所有格式文件的吗?还是针对一中格式文件的。说清楚,我可以给你一份试试
lanfeng143 WindowsCE
《电子工程师必备_九大系统电路识图宝典》
给大家分享一本书:《电子工程师必备_九大系统电路识图宝典》有需要的童鞋欢迎下载!(资料仅供学习交流使用,请勿用于商业用途)下完记得顶贴哟~~链接:https://pan.baidu.com/s/1gW8S-2ikpu9Kc7DVLj3YHA密码:nggh《电子工程师必备_九大系统电路识图宝典》干货满满,受益匪浅,共同努力,感谢分享!!!!网盘上内容过期了,下载不了了。电子工程师必备_九大系统电路识图宝典,很值得收藏的资料过期了,下不了
szjlcgw 模拟电子
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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