历史上的今天
返回首页

历史上的今天

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

正在发生

2021年08月26日 | 51单片机-简洁式串口通信

2021-08-26 来源:eefocus

1.串口配置函数

上一讲的讲解是让大家对《手把手教你学51单片机》文档的第十一章的第一个例程的辅助理解,我们没有写单片机接收电脑端发送回来的数据字节做处理的代码。因为这些都是IO端口模拟的串口通信,由于51单片机本身集成有串口模块,所以我们使用其硬件资源即可,无需在软件方面做过多的细节描写,如有兴趣了解串口更多细节,请反复阅读《手把手教你学51单片机》文档的第十一章。


那么宋老师已经很详细地把串口的相关知识讲解清楚,我们直接模仿他的编程思想来实现我们想实现的功能即可。


串口配置函数我们直接运用宋老师的代码,这里讲解一两处配置的知识。


首先“SCON=0x50;”是让SCON寄存器的第4位和第6位都置1,其他位置0,在文档的表11-2已有讲解。


“TH1 = 256 - (11059200/12/32)/baud;”是波特率设置的计算公式,可不用深究,由于串口的使用要占用定时器1,那么定时器1的定时中断将不能使用,所以必须使“ET1=0;”禁止其产生定时中断,也就是使用了串口,那么“void TIM1_IRQHandler() interrupt 3”将不能再出现在程序书写中。


不过呢,串口也有相应的中断函数,像ET0,ET1一样,这些都是子开关,串口中断的子开关为ES,“ES=1;”和“EA=1;”就开启了串口的中断函数。我们串口发送数据的时候会产生中断,接收到数据的时候也会产生中断,这两个瞬间我们在中断函数里需要执行相关任务。


要知道串口有动作的时候,总会有RI或者TI被置1,前者意为接收到完整的8位的数据,也就是接收到一个字节然后RI就被置1。后者意为单片机发送完一个完整的字节了,TI被置1。这些瞬间都需要我们在串口中断函数中让其清0,以备下次它们能再次被置1。


我们现在要实现的功能很简单,就是电脑端通过串口发送一个数据给单片机,这个数据被单片机接收到之后,让这个数据再加1,然后单片机再通过串口把加1后的数据发送回去给电脑端让它在窗口上显示。


2.代码

#include  

#include //详见第六章第8讲

#include    //详见第八章第11讲

   

u8 RXDBUF;//缓存接收到的数据

void ConfigUART(u16 baud)

{

    SCON  = 0x50;  //配置串口为模式1

    TMOD &= 0x0F;  //清零T1的控制位

    TMOD |= 0x20;  //配置T1为模式2

    TH1 = 256 - (11059200/12/32)/baud;//计算T1重载值

    TL1 = TH1;     //初值等于重载值

    ET1 = 0;       //禁止T1中断

    ES  = 1;       //使能串口中断

    TR1 = 1;       //启动T1

}

 

void main()

{  

    LED_Init();      //初始化LED硬件模块

    EA = 1;          //闭合总中断开关

    ConfigUART(9600);//串口波特率设置为9600

    while(1);

}

 

void InterruptUART() interrupt 4

{

    if (RI)              //RI等于1就满足if条件语句,意为接收到字节

    {

        RI = 0;          //手动清零接收中断标志位

        RXDBUF = SBUF;   //接收到的数据保存到接收缓存变量中

        SBUF = RXDBUF+1; //发送回去给电脑端的数据

    }

    if (TI)              //TI等于1满足if条件语句,意为字节发送完毕

    {

        TI = 0;          //手动清零发送中断标志位

    }

}


这里讲解一下串口中断函数,像“if(RI){RI=0;}”和“if(TI){TI=0;}”这些都是在串口中断函数中必须要去执行的任务,当然如果在其他函数里有清0这两个位,可不用在串口中断函数中书写,但一定要保证每次都要清0。


SBUF是名字相同作用却不同的缓冲区。


“RXDBUF = SBUF;”SBUF在等于号后面意为这个是单片机接收电脑端数据的缓存区。


“SBUF = RXDBUF+1;”SBUF在等于号前面意为这个是单片机发送给电脑端数据的缓存区,一旦出现“SBUF = xxxx”这样的语句,那就是单片机开始通过串口发送数据出去了。


实验现象如下,与上一讲不同,我们这次选用的是“十六进制显示”模式,我们电脑端发送给单片机的数据也是在“十六进制发送”模式,打上7点击发送,电脑端发送的数据其实是0x07,单片机接收到电脑端发来的数据之后加1:0x07+1=0x08。


0x08这个数据再通过单片机发送回去给电脑端,这样电脑端就显示“08”了。

10.03.png?imageView2/2/w/550

推荐阅读

史海拾趣

高博(GBG)公司的发展小趣事

品质是企业生存之本。谷峰公司始终将产品质量放在首位,建立了严格的质量控制体系,确保每一款产品的性能和质量都达到行业领先水平。同时,公司还注重品牌建设,通过参加国际展会、发布新产品、提供优质服务等方式,不断提升GOFORD品牌的知名度和美誉度。如今,GOFORD已成为电子行业可信赖的高可靠性功率器件供应商之一。

G-Link Technology公司的发展小趣事

随着物联网技术的飞速发展,蜂鸟无线也紧跟时代步伐,将研发重心向物联网安全领域倾斜。公司推出的Hnt网关,集成了先进的加密芯片和Helium共识机制,有效抵御了物联网设备面临的各种安全威胁。这一创新产品不仅提升了物联网系统的安全性,还降低了运维成本,为物联网行业的健康发展提供了有力支持。蜂鸟无线的这一举措,进一步巩固了其在无线通信和物联网安全领域的领先地位。

Amidon Associates Inc公司的发展小趣事

近年来,随着数字化转型浪潮的兴起,蜂鸟无线也积极投身于这一进程。公司利用自身在通信和物联网领域的技术优势,为制造业、能源、交通等多个行业提供了一站式智能数据服务平台。通过构建工业互联网大数据使能平台,蜂鸟无线帮助企业实现了生产经营数据的汇聚、分析和可视化,助力企业实现智能化管理运营。这一转型不仅提升了蜂鸟无线的服务能力,还为公司带来了新的增长点,推动了公司的持续健康发展。

Global Power Technologies Group公司的发展小趣事
在数字电路中,集基耦合单稳态电路可以用于将高频信号分频为低频信号。
台湾凯励(Carli)公司的发展小趣事

台湾凯励(Carli)公司成立于1986年,总部位于台湾省台中市。在初创阶段,公司就专注于金属膜电容器的研发与生产,凭借对技术的执着追求和对品质的严格把控,逐渐在行业中崭露头角。凯励公司不断引进先进的生产设备和技术人才,积累了大量的技术经验和研发实力,为其后续的发展奠定了坚实的基础。

Hamamatsu公司的发展小趣事

在电子行业中,品质控制和质量管理是企业生存和发展的关键。凯励公司深知这一点,建立了严格的质量管理体系和检测机制。公司从原材料采购到生产制造、产品检测等各个环节都严格把控品质,确保产品的稳定性和可靠性。此外,凯励公司还引进了先进的生产设备和检测仪器,提高了生产效率和产品质量。

问答坊 | AI 解惑

晃晃悠悠这几年(职场轻松谈之射频工程师)

考研时,无意中选择了电磁场微波这个专业,从此就走上了射频工程师这条路,毕业后,顺其自然的进入了一个研究所做着和学校里做的一样的工作。这就是我的职场生涯,平平淡淡。        我想大多数工作都一样,重复的事情多,创 ...…

查看全部问答>

电容器概说

•电容的基本结构: 由两块相互靠近、彼此绝缘的金属板组成.中间常夹上一层电介质。 •充电与放电:使电容器带电叫充电;使充电后的电容器失去电荷叫放电.电容器充电时,跟电源正极相连的极板带正电,跟电源负极相连的极 ...…

查看全部问答>

_wcsicmp 不能比较汉字字符?

我的一段程序        for(dwCheckRecord=dwLow+1;dwCheckRecord…

查看全部问答>

!!!急聘WinCE软件工程师!

    公司最近招聘WinCE软件工程师,从事驱动开发,BSP移植等工作      1.本科以上学历,计算机、自动化、通讯、电子类专业      2.熟练C/C++语言.      2.两年以上的相关嵌 ...…

查看全部问答>

AVRlib函数库

包含所有AVRlib函数[local]1[/local]…

查看全部问答>

LM90与GE 90-30通讯连接不上!

请教LM90的软件DOS版,怎么都和PLC通讯不上,提升NO COMMUNICATION. 不知怎么回事,请教高人。串口是COM1.不知道还要不要其他的设置。…

查看全部问答>

Altium Designer6.9转pdf

本人用的是Altium Designer 6.9,在PCB转pdf打印的时候怎样安装1:1转换,求指导!!!…

查看全部问答>

毕业前清理开发板和电子元件

1、stm32 discovery 一个,80不包邮,送一个usb数据线  2、3、小的直流电机一个,充当赠品4、Easy JTAG并口仿真器一个,ZLG公司的,如果打包的话,充当赠品5、51单片机最小系统一个,15元& ...…

查看全部问答>

一个程序中的小问题。。。

我在msp430里编写一个程序,我想要的是已知 a=sinx,怎么算出b=cosx,但是在程序编写的时候没有办法实现,我用函数库里的调用函数 d=cos(asin(a)), asin(a)出来的结果是在-pi/2~pi/2 之间,也就是说d 计算出来的结果是 abs(cosx),我想要的结果 ...…

查看全部问答>

分享加求助g2553温度串口

首先,我只是个菜鸟,程序东西拼凑起来的。9600-8-1   功能:串口助手显示温度  (我北方的,办公室温度应该没25这么高,可能内部cpu?不懂了)  按下s2后显示“思念是会呼吸的痛!” 问题:s2按下,显示汉字之后 ...…

查看全部问答>