. 串行通讯与并行通信
数字信号是八位二进制数,可以使用信号线传输,一种方案是使用一条数据线按照次序一位一位的传送,每传送完8位为一个字节,这就是串行通信。还有一种方法是使用八条数据线同时传送8个位的数据,一次传送一个字节,这就是并行通信。
俩种通信方式图示如下:
并行通信
特点为传输速度快,控制简单,但远距离传输时成本较高且接收方同时接收各位比较难
串行通信
特点为传输线少,远距离传输时成本低,但数据传输比并行通信复杂
同步通信与异步通信
串行通信分为同步通信与异步通信
1.同步通信
顾名思义,同步通信就是对发送方和接收方的时钟实行直接控制,使双方的数据传输达到完全同步。数据以位的形式连续发送,且传送的字符之间不留间隙,即保持位同步和字符同步。双方的同步可以通过外同步和自同步俩种方式实现。
(前者为外同步,后者为自同步)
2.异步通信
和同步通信不同,异步通信的发送方和接收方使用各自的时钟控制数据的发射接收。异步通信是一种很常见的通讯方式,其发送端可以在任意时候发送字符,但与同步通信不同的是异步通信是以帧的形式发送数据的(异步通信中一个帧数据有十位:分别是一个起始位、八个数据位、一个停止位)
这样理解俩种通信方式:下课了,二狗喊铁蛋一起吃饭。同步通信就是:如果铁蛋听到了二狗叫他就马上和他去吃饭,如果一次没听到二狗就继续喊,直到铁蛋听到他的话并且和他去吃饭为止。异步通信就是:二狗喊了铁蛋一声然后就自己去吃饭了,铁蛋收到消息后可能立即去吃饭,也可能等一会去吃饭。(读者自行脑补hhh*.*)
图示如下:
- 实现51单片机串口通信的知识储备
目的:用异步通信实现单片机与计算机之间的数据交流
1.波特率
波特率可以衡量数字信号传输的速率,其大小为每秒传输二进制数的位数,单位为:bps。比如:每秒传输300帧数据,一帧数据是十个二进制数,则传输速率就是300x10=3000(bps)。单片机和计算机的传输速率要一致。
2.波特率的设置
计算机的波特率可以在界面上直接调整,那单片机的波特率要怎么设置呢?
我们一般是把T1(定时中断1)作为波特率的发生器,而且利用的是T1的工作方式2。
此时波特率的计算公式为:
解释一下公式内容:
一.SMOD
SMOD属于PCON寄存器,不可位寻址,大家可以把其理解为波特率加倍标志,置0的时候不加倍,置1的时候波特率加倍。
二. fosc
fosc就是单片机的晶振频率,一般是11.0529MHz(还有一种情况是12MHz,但其误差相对较大,一般不予采用)1M=1000,000
三.(256-T初)
T1的工作方式2是八位数据自动装填(八位二进制数的范围是0~255,共256个数),初始值在开始时装入TH1和TL1,工作时只有TH1计数,当TH1溢出时把TL1中的初始值重新赋值给TH1,这样就实现了自动装填。
(256-T初)代表着每次定时器计数的次数。
3.如何设置波特率(假如设置波特率为9600bps)
首先-设置定时器T1的工作方式:编辑TMOD寄存器为TMOD=0X20;使定时器T1处于工作方式2;
然后-计算T1的初始值并装载TH1和TL1,波特率为9600bps时TH1=0XFD、TL1=0XFD;
最后-启动T1:编辑TCON寄存器中的TR1,使TR1=1(打开T1定时器)。通过设置PCON寄存器PCON=0X00设置SMOD=0。
4.如何确定串行口控制
通过编辑SCON寄存器控制串行口
其实主要是控制串行口的工作方式:SM0=0、SM1=1,和打开串行口的允许接收位:REN=1。
5.打开中断
打开总中断和串口通信中断:EA=1、ES=1。
6.SBUF寄存器
前面讲了一大堆铺垫,相信大家都有一个疑问:单片机是怎么发送数据呢?它又是如何接收数据呢? 如果要细讲这其中的传输原理,那会是复杂难懂的,好在单片机的内部硬件自带发送和接收数据的功能,它是通过SBUF寄存器实现的。
SBUF寄存器有俩个,一个是发送寄存器,另一个是接收寄存器(名字都一样),但在逻辑上SBUF只有一个(地址都为99H),物理结构上,这是俩个完全独立的寄存器。如果CPU写SBUF,数据就会被送入发送寄存器准备发送;如果CPU读SBUF,则读入的数据一定来自接收寄存器。
简单来讲:a=SBUF,代表单片机从计算机接收到了数据(接收到的数据自动存在接收寄存器SBUF中)并且从接收寄存器SBUF读取数据并赋给a。SBUF=a,代表单片机要给计算机发送a数据,只需将a赋给发送寄存器SBUF就行,发送寄存器SBUF会自动给计算机发送SBUF中的数据。
下面是其工作图:
(RXD是接收引脚,
(RXD是接收引脚,TXD是发送引脚)
7.TI与RI
TI和RI都在SCON寄存器中。
TI是发送中断标志位,当数据发送完成后,TI由硬件置1,TI置1后向CPU提出中断申请,进入中断函数后需要软件置0(TI=0;)
RI是接收中断标志位,当数据接收完成后,RI由硬件置1,RI置1后向CPU提出中断申请,进入中断函数后需要软件置0(RI=0;)
8.串口中断
串口中断函数是
void (函数名无所谓) interrupt 4
{
中断程序;
}
一旦TI或者RI为1就执行中断函数,并且需要在中断函数中将TI、RI重新置0。
- 话不多说,上代码!
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar num;
void init() //初始化函数
{
TMOD=0x20;//设置定时器1的工作方式2---8位自动装填
TH1=0xfd;//设置初始值:使比特率为9600bps
TL1=0xfd;
PCON=0x00;//SMOD=0,不加倍
TR1=1;//打开定时器中断开关
REN=1;//打开允许串行接收位
SM0=0;//设置串行口通讯方式为方式1
SM1=1;
EA=1; //打开总中断
ES=1; //打开串口通讯中断
}
void hhh() interrupt 4 //中断函数
{
num=SBUF; //从计算机接收数据,赋给num
RI=0; //数据接收完毕后将RI软件置0
SBUF=num;//向计算机发送数据num
while(!TI); //TI=0时陷入死循环,直至数据发送完毕
TI=0; //数据发送完毕后软件将TI置0
}
void main()//主函数就这么简单
{
init();
while(1);
}
接下来的事情就交给串口调试助手了
上一篇:51单片机—红外遥控
下一篇:C51—模拟IIC总线实现EEPROM存取数据
推荐阅读
史海拾趣
随着公司的发展,Atlanta Micro开始积极拓展市场,与多家知名企业建立了合作关系。通过与这些企业的合作,Atlanta Micro不仅获得了更多的订单和市场份额,还从合作伙伴那里学到了先进的管理经验和技术知识。这种合作共赢的模式,为公司的持续发展提供了有力支持。
随着全球对环保和可持续发展的日益关注,ESR公司积极响应国家政策和市场趋势,致力于实现绿色生产和发展。公司引进先进的环保设备和技术,减少生产过程中的废弃物和污染排放;同时加强资源回收利用和节能减排工作,降低生产成本和能耗。
此外,ESR公司还积极参与环保公益活动和社会责任项目,为推动电子行业的绿色发展和可持续发展贡献自己的力量。这种对环保的关注和投入不仅提升了公司的社会形象也增强了公司的竞争力和可持续发展能力。
华宇创深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到生产过程再到成品检测,每一个环节都严格把控。同时,华宇创还积极参与各类国际认证和标准制定工作,不断提升产品的品质和性能。这些努力使华宇创的产品在市场上赢得了良好的口碑和信誉,品牌知名度也逐渐提升。
2022年,无锡锡产微芯半导体有限公司完成了对安谱隆的收购。这一交易金额超过百亿元,是当年中国最大的半导体并购交易事件之一。锡产微芯的收购不仅为安谱隆提供了更广阔的发展平台,也为其在半导体行业中的进一步发展注入了新的活力。在锡产微芯的支持下,安谱隆开启了新的发展阶段,继续在全球射频市场中发挥着重要作用。
这五个故事展示了安谱隆从恩智浦剥离出来到被锡产微芯收购的发展历程。在这个过程中,安谱隆不仅展现了其强大的技术实力和市场潜力,也经历了资本市场的波折与挑战。然而,正是这些经历使得安谱隆更加成熟和稳健,为其未来的发展奠定了坚实的基础。
ETEQ Microsystems Inc一直将品质管理作为公司的核心竞争力之一。公司建立了严格的质量管理体系,从原材料采购到产品生产、测试、包装等各个环节都严格把控。同时,公司还鼓励员工积极参与品质改进活动,通过持续改进不断提升产品质量和客户满意度。
科山芯创(COSINE)公司成立于2017年,由一群对射频及模拟集成电路芯片充满热情的工程师创立。他们看到了中国电子行业中对于高性能、高品质芯片的巨大需求,于是决定成立一家公司,专注于这一领域的研发与设计。他们的初心是通过自主创新和核心技术,为国内外客户提供有竞争力的解决方案。
目录: 第一章 怎样使用万用表 第一节 万用表 一、万用表的结构与功能 二、万用表的测量原理 三、万用表的使用方法 第二节 数字万用表 一、数字万用表的结构与功能 二、数字万用表的测量原理 三、数字万用表的使用方 ...… 查看全部问答∨ |
发现网上提供的一些用微软的CryptoAPI库存进行数字签名的demo,都是RSA签名,而且签名的公钥和私钥对都是用CryptoAPI中的函数产生的,而不能选择一个私钥进行签名,请问CryptoAPI下能随意选择一个私钥来进行DSA签名吗… 查看全部问答∨ |
如何将vxworks tornado shell打印内容重定向到PC程序的界面上 我想将vxworks tornado shell上的打印内容在我自己写的一个 PC程序的界面上进行显示 是否可以通过shell重定向功能实现呢 ? 请高手指点!!! … 查看全部问答∨ |
NDIS驱动为什么InitializeHandler没有被自动调用??? 一个网卡驱动,使用NDIS5.1, sources里加了CDEFINES=$(CDEFINES) -DNDIS_MINIPORT_DRIVER=1 -DNDIS51_MINIPORT=1 DriverEntry里初始化: NDIS_MINIPORT_CHARACTERISTICS ch; ... ch.MajorNdisVersion &nbs ...… 查看全部问答∨ |
DSP-Sitara团购帖,大家都在期待ing…………https://bbs.eeworld.com.cn/thread-356179-1-1.html… 查看全部问答∨ |