历史上的今天
返回首页

历史上的今天

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

正在发生

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

2021-08-26 来源:eefocus

1.波特率

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

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


2.通信引脚

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

10.1.png?imageView2/2/w/550

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


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

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

10.02.png?imageView2/2/w/550


推荐阅读

史海拾趣

ADTech公司的发展小趣事

随着QCL技术的成熟和市场需求的增长,AdTech公司开始积极拓展国际市场。通过与全球多家知名企业建立合作伙伴关系,公司成功将产品打入欧洲、亚洲等多个地区。同时,AdTech还积极参与国际技术交流与合作,不断提升自身的研发能力和产品质量。这些举措不仅增强了公司的品牌影响力,也为其带来了更多的商业机会。

Advanced Microelectronic Products Inc公司的发展小趣事

AMP公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。公司建立了一套完善的人才培养机制,通过内部培训、外部引进等方式,不断提升员工的专业技能和综合素质。同时,公司还注重团队建设,鼓励员工之间的合作与交流,营造积极向上的工作氛围。这些举措为AMP公司的持续发展提供了有力的人才保障。

Alan Industries Inc公司的发展小趣事

为了进一步提升竞争力,Alan Industries Inc.积极寻求与其他企业的战略合作。公司与多家知名供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和成本控制。同时,公司还通过并购和投资等方式,整合了产业链上下游资源,形成了完整的产业生态圈。这些战略举措使得公司在市场竞争中更具优势,实现了快速发展。

GS Yuasa Battery Sales UK Ltd.公司的发展小趣事

Alan Industries Inc.自创立之初,就以其对技术研发的不懈追求而闻名。在公司成立的早期,其研发团队成功开发出一款高效能、低功耗的芯片,这一创新产品在市场上引起了巨大反响。随后,公司不断投入研发资源,推出了一系列具有竞争力的电子产品,逐渐在行业中树立了技术领先的地位。这些产品不仅满足了消费者对电子产品性能的需求,还为公司带来了可观的利润,为公司的快速发展奠定了坚实基础。

AUREL公司的发展小趣事

在追求经济效益的同时,AUREL公司也积极履行社会责任。公司注重环保和可持续发展,在生产过程中采用环保材料和节能技术,努力降低对环境的影响。此外,公司还积极参与社会公益事业,为当地社区的发展做出了积极贡献。这些举措不仅提升了AUREL公司的社会形象,也增强了公司的凝聚力和向心力。

请注意,以上故事是基于虚构的,旨在展示一个电子行业公司可能的发展路径和成就。如果您需要关于AUREL公司的具体信息或发展故事,建议直接查阅该公司的官方网站或相关新闻报道。

Codeco Corporation Of Vermont公司的发展小趣事

在国内市场取得成功后,Codeco开始将目光投向国际市场。他们积极拓展海外业务,与多家国际知名企业建立合作关系。通过参加国际展会、设立海外分支机构等方式,Codeco的产品逐渐打入国际市场,赢得了广泛的认可。这一过程中,Codeco不仅提升了品牌知名度,也积累了丰富的国际化运营经验。

问答坊 | AI 解惑

探讨安防人生路,大家来现身说法

从加入安防的那天起,有种如鱼得水的感觉。一转眼几个年头过去了,感受颇深。安防行业跟其他行业一样,职位很多,销售、技术、工程管理、调试、研发(个人一直认为研发不该属于安防,应属于电子或软件),你对哪个有兴趣?如果你选择了销售,那么恭 ...…

查看全部问答>

被某人成为世界难题(干扰和信号),坛里的高手来看看

公司历经三年,耗资3000万始终没有解决问题。我们系统中GPRS wifi 等大功率大电流的模块都是实时工作 在他们工作的时候 系统中模拟电路 始终受到大功率模块的 辐射干扰和传导干扰导致系统无**常工作。 现在我们系统重新架构如上图所示。所有模块 ...…

查看全部问答>

今天收到了论坛寄来的CIII板子,准备开始2.0示波器的软件编写

由于没有相机,不能上图了; 进展过程中与大家分享代码和乐趣…

查看全部问答>

同步连接ActiveSync问题

同步连接问题: 请问谁用过串口或以太网实现过ActiveSync连接啊,我的USB从接口有问题了,所以想改用那些串口,但不知道要修改或设置什么参数,请用过的大虾多指教一下,谢了。…

查看全部问答>

5.6寸真彩色智能终端 比 单色液晶屏还低?

  单片机的各种应用产品设计中,LCD和触摸屏作为人机交换的界面使其应用越来越广泛,但在实际应用中单片机要去直接控制大尺寸的彩色LCD(5.6寸以上)是比较困难的。我公司推出的智能显示产品正是为了单片机可以直接控制大尺寸LCD和触摸屏而 ...…

查看全部问答>

串口这是怎么回事???

接上arm板,可以接收到armlinux启动的信息,但是arm却无法接受键盘的信息!再其他电脑测试下,arm正常 就是串口无法接受信息 这是什么问题??会是串口烧掉了么?烧掉了 为什么还可以发送信息?? 需要换串口芯片??…

查看全部问答>

wince 串口的处理速度问题

    用串口与MCU通信,用57600波特率,8位数据,1位停止位,无校验位。mcu端发送一个数据包号请求命令(共10个字节长度),wince端收到后,解析出包号,把对应包号的数据发送给MCU(共40个字节长度)。mcu端收到数据后继续请求下一包数据 ...…

查看全部问答>

linux嵌入式开发群列表

linux嵌入式开发群列表,很多群: http://linuxembed.5d6d.com/thread-57-1-1.html…

查看全部问答>

modelsim脚本里面有没有复制文件的功能啊

可不可以完成这样的功能:从别的目录下copy一个文件到当前目录下…

查看全部问答>