1、串行通信的初步认识
UART串行通信是单片机最常用的一种通信技术,通常用于单片机和电脑之间以及单片机和单片机之间的通信。
通信可分为并行通信和串行通信两种。(1)并行通信:数据的各各位可同时传送。(2)串行通信:数据只能按顺序一个一个位传送。STC89C52中P3^0(RXD)和 P ^1(TXD)是专门用作UART串行通信的引脚。
下面看下图11-1单片机之间的UART串口通信。
说明:GND 表示单片机系统电源的参考地,TXD 是串行发送引脚,RXD 是串行接收引
脚。他们之间通信要保证以下几点。
(1)电源基准相同,所以我们要把两个单片机的 GND 相互
连接起来,
(2)TXD与RXD相连,比如单片机 1 的 TXD 引脚接到单片机 2 的 RXD 引脚上,即此路为单片机 1 发送而单片机 2 接收的通道。同理单片机 1 的RXD接到单片机 2的TXD上。
(3)两者的通信波特率(指发送二进制数据位的速率,即串口每秒钟传送的位数,用baud表示)保持一致,他们之间通信发送的数据,是以二进制低位先,高位后的顺序发送,TXD会先发起始位0,然后从数据低位开始发送每一位数据,最后发停止位1,若该位为0拉低电平一段时间,若该位为1拉高电平一段时间。 “一段时间” = 1 / baud。
如何判断数据何时开始,何时结束?
延迟,提前接收都会使数据接收错误,所以UART通信规定无通信信号发送时,线路保持高电平,数据发送前发0(低电平)表示起始位,然后按数据低位到高位顺序发送每一位,数据发送结束后再发1(高电平)表示停止位,每个数据位切换时间为: 1 / baud。而接收方,无信号接受保持高电平,一旦检测到低电平,就准备开始接收数据,接收完数据后,检测到停止位便准备下一个数据的接收。
串口数据发送示意图
说明:该图为时域图,信号随时间变化的对应关系。
2、USB转串口通信
在单片机电路上添加一个USB转串口芯片,便可实现计算机与单片机之间的串口通信。KST-51开发板用的为CH340T芯片来实现,见下图11-5说明。
CH340T电路说明:把电源、晶振接好后,6 脚和 7 脚的 DP 和 DM 分别接 USB 口的 2 个数据引脚上去,3 脚和 4 脚通过跳线接到了我们单片机的 TXD 和 RXD 上去。
3、UART串口通信的基本应用
3.1 通信的三种基本类型
通信从传输方向上可分为:单工通信,半双工通信和全双工通信三类。
单工通信:允许一方向另外一方传送信息,而另一方不能回传信息。如遥控器
半双工通信:数据可以在双方之间互相传播,但同一时刻只能其中一方发给另外一方。如对讲机
全双工通信:发送数据的同时也能够接收数据,两者同步进行,如电话
3.2 UARM模块介绍
单片机内部有UART模块,实现串口通信。51单片机的UART 串口的结构由串行口控制寄存器SCON、发送和接收电路三部分构成,先来了解一下串口控制寄存器 SCON。
SCON寄存器说明
说明:第0位RI为接收中断标志位,第1位TI为发送中断标志位,这两个为进入串口中断都不会自动清零,都需要软件清零。第4位REN在接收数据时设置为1,第6位SM1和第7位为模式设置,通常使用模式1,模式1:发送一位起始位,8位数据位,一位停止位。SCON其他位很少用到就不介绍。一般使用SCON时,置SCON=0b01010000,即0x50;使用时查手册即可。
波特率发生器说明
在UART模块中波特率发生器(用来控制发送和接受数据的速度)只能由定时器T1或T2产生,T0不能产生,因T2需要配置额外寄存器,下面以定时器T1做为波特率发生器说明。
当定时器T1做为波特率发生器时,定时器T1需配置为模式2–自动重装载模式。定时器重载值计算公式:TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率。和波特率有关寄存器电源管理寄存器PCON,它最高位置1(PCON |= 0x80)可把波特率提高一倍。计算公式变为:TH1 = TL1 = 256 - 晶振值/12 /16 /波特率。
公式说明:晶振值在KST-51开发板为11059200,12是说一个机器周期等于12个时钟周期。16指采取数据的方式是把一位信号采集 16 次,其中第 7、8、9 次取出来,这三次中其中两次如果是高电平,那么就认定这一位数据是 1,如果两次是低电平,那么就认定这一位是 0,
SBUF寄存器说明
串口通信的发送和接收电路在物理上有 2 个名字相同的 SBUF 寄存器,它们的地址也都
是 0x99,但是一个用来做发送缓冲,一个用来做接收缓冲。我们每次只操作 SBUF,单片机会自动根据对它执行的是“读”还是“写”操作来选择是接收 SBUF 还是发送 SBUF,
3.3编写UART串口步骤及程序
编写UART串口步骤:
配置SCON的模式,一般为模式一(0x50)。
配置定时器T1为模式二(0x20),自动重装载模式。
根据波特率计算TH1和TL1的初值(TH1 = 256 - (11059200 / 12 / 32)/baud),需要可使用PCON加倍波特率。
打开定时器寄存器TR1,开启T1。
UART小程序
//UART串口通信小程序
#include void configUART(unsigned int baud); void main() { EA = 1;//使能总中断 configUART(9600);//配置波特率为9600 while(1); } void configUART(unsigned int baud) { SCON = 0x50;//配置串口为模式一 TMOD &= 0x0F;//清零T1的控制位 TMOD |= 0X20;//配置T1为模式一 TH1 = 256 - (11059200/12/32)/baud;//计算T1重载值 TL1 = TH1; //初值等于重载值 ES = 1;//使能串口中断 ET1 = 0;//禁止T1中断 TR1 = 1;//启动T1 } void InterruptUART() interrupt 4 { if(RI) //接收到字节 { RI = 0; //手动清零接收中断标志位 SBUF = SBUF + 4;//接收的数据+4后发回,左边是发送SBUF,右边是接收SBUF } if(TI) //字节发送完毕 { TI = 0;//手动清零发送中断标志位 } } 程序结果图 4、串口调试助手 串口助手中,还有 ‘字符格式的发送’ 和 ‘字符格式显示’,先介绍字符,在一个字节的256个值中取 0 ~ 127共128个值赋予它另外一种含义,让他们分别代表一个常用字符,这个对应关系为ASCII码字符表。这样就在字符和字节数据之间创建了一一对应关系,一个字节即可代表整数,又可代表一个字符,但本质都是一个字节的数据。 串口助手中,选择字符格式发送和十六进制接收。若发送小写a,则接收的数据为字符a对应的十六进制值0x61。十六进制发送和十六进制接收,都是按字节数据的真实值进行的;而字符格式发送和字符格式接收,是按 ASCII 码表中字符形式进行的,但它最终传输的实际上还是一个字节数据。见下例。 说明:例子中以字符格式发送 ‘20’,但实际上是分别发送 字符‘2’ 和 ‘0’ 。而显示则分别显示 字符’1’ 和 字符’2’ 对应的十六进制数值0x32和0x30。 5、通信小程序 实现单片机串口调试助手发送的数据,在开发板数码管上以十六进制显示出来。 #include sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char code LedChar[] = { //数码管显示字符转换表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; unsigned char LedBuff[]={ //数码管+独立LED显示缓冲区 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; unsigned char T0RH;//T0重载值的高字节 unsigned char T0RL;//T0重载值的低字节 unsigned char RxdByte = 0;//串口接收到的字节 void configUART(unsigned int baud); void configTimer0(unsigned char ms); void Ledscan(); void main() { EA = 1; //使能总中断 ENLED = 0;//选择数码管 ADDR3 = 1; configUART(9600);//配置波特率为9600 configTimer0(1);//配置T0定时1ms while(1) { //将接收字节在数码管上以十六进制形式显示出来 LedBuff[0] = LedChar[RxdByte & 0x0F]; LedBuff[1] = LedChar[RxdByte>>4]; } } //串口配置函数,baud为通信波特率 void configUART(unsigned int baud) { SCON = 0x50; //配置串口为模式1 TMOD &= 0x0F;//清零T1的控制位 TMOD |= 0x20; //配置T1为模式二 TH1 = 256 - (11059200/12/32)/baud;//计算T1重载值 TL1 = TH1; //初值等于重载值 ES = 1; //使能串口中断 TR1 = 1; //启动T1 } //配置并启动T0,ms-T0定时时间 void ConfigTimer0(unsigned char ms) { unsigned long tmp; //临时变量 tmp = 11059200 / 12; //定时器计数频率 tmp = (tmp * ms) / 1000;//计算所需要的计数值 tmp = 65536 - tmp + 13; //计算定时器重载值,并补偿中断延时造成的误差 T0RH = (unsigned char)(tmp >> 8);//定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0;//清零T0的控制位 TMOD |= 0x01;//配置T0为模式一 TH0 = T0RH; //加载T0重载值 TL0 = T0RL; ET0 = 1;//使能T0中断 TR0 = 1;//启动T0 } void InterruptUART() interrupt 4 { if(RI) //接收到字节 { RI = 0;//手动清零·接收中断标志位 RxdByte = SBUF ;//接收到的数据保存到接收字节变量中 SBUF = RxdByte;//接收到的数据又发回,用以提醒用户输入的信息是否正确 } if(TI) //字节发送完毕 { TI = 0;//手动清零发送中断标志位 } } void InterruptTimer0() interrupt 1 { TH0 = T0RH;//重新加载重载值 TL0 = T0RL; Ledscan(); //Led扫描显示 } //LED动态扫描函数,需在T0中断中调用 void Ledscan() { static unsigned char i = 0; //动态扫描索引 P0 = 0xFF; //关闭数码管所有段,显示消隐 P1 = (P1 & 0xF8) | i;//位索引值赋值到P1口低三位 P0 = LedBuff[i];//缓冲区中索引值德数据送到P0口 i++; //索引递增循环,遍历整个缓冲区 if(i > 5) { i = 0; } } 6、收获 本章是通信的开章,整体难度不难,学起来也比较轻松,后面应该难度就会上来了,还有八天开学,还有9章没学完,还是加油学吧,奥利奥奥里给!!
上一篇:#51单片机# UART串口通信的基本应用、模块介绍和串口程序
下一篇:【自学51单片机】12 --- 1602液晶初步认识
推荐阅读
史海拾趣
自成立以来,ASPEED Technology一直致力于自主创新技术的研发与客户需求的快速响应。公司拥有一支专业的研发团队,不断推出具有竞争力的新产品和解决方案。同时,ASPEED还积极拓展全球市场,与众多知名企业和机构建立了合作关系,为公司的发展奠定了坚实的基础。正是这种持续的创新与研发精神,使得ASPEED在电子行业中不断发展壮大,成为了一家备受瞩目的企业。
以上五个故事均基于ASPEED Technology公司发展起来的相关事实,展现了公司在并购、产品创新、合作研发等方面的努力和成果。这些故事不仅反映了ASPEED在电子行业中的成长轨迹,也展示了其不断追求卓越、推动行业发展的决心和实力。
在竞争激烈的电子行业中,成本控制是企业生存和发展的关键。CSB公司深知这一点,因此在供应链管理和成本控制方面下足了功夫。公司通过与供应商建立长期合作关系、优化采购流程、提高生产效率等方式,有效降低了生产成本。同时,公司还注重库存管理和物流配送的优化,确保产品能够及时、准确地送达客户手中。
FINTEK公司深知技术创新是企业持续发展的核心动力。因此,公司不断加大研发投入,建立了完善的研发体系和激励机制。通过与国内外知名高校和研究机构的合作,FINTEK在人工智能、物联网、5G通信等前沿领域取得了多项重要技术突破。这些创新成果不仅提升了公司的核心竞争力,也为电子行业的未来发展贡献了重要力量。
随着全球电子行业的竞争日益激烈,Ferroxcube公司意识到,要想保持领先地位,就必须不断创新。于是,公司决定投入巨资建立一个新的研发中心,专注于磁性元件的前沿技术研究。
研发中心的建立吸引了大批优秀的科研人才加入Ferroxcube。在新的研发团队的带领下,公司相继推出了多款具有自主知识产权的新型磁性元件,这些元件在性能、稳定性和可靠性方面都达到了行业领先水平。
其中一款名为“XX磁芯”的产品,凭借其超高的磁导率和极低的损耗,在市场上引起了轰动。这款产品不仅被广泛应用于各类电子设备中,还成为了许多高校和科研机构的研究对象。Ferroxcube因此成为了行业内技术创新的佼佼者。
Artesyn Embedded Technologies自1981年成立以来,一直致力于电源产品的研发与创新。在20世纪90年代,公司推出了一款具有突破性的精密电源产品,该产品以其高效能、低能耗的特点迅速在市场中获得了认可。这一成功不仅使公司获得了更多的市场份额,也为后续产品的研发奠定了坚实的基础。
如果我的网络芯片属于I/O Port Device,我如何知道协议栈有数据包发送?具体点就是,我的NUCLEUS NET如何跟我的驱动的发送程序接口??请高手帮忙解决啊,跪谢了!… 查看全部问答∨ |
|
怎样实现在电视上看电脑上的片(就是让电视充当另一个显示屏,声音也输出到电视或电视音响上,最好不影响电脑正常工作)? 家里的电视是29寸(有s端子),电脑显卡是geforse mx 200(应该没有s端子),请各位专家说详细点步骤! 提前谢谢大家了! ...… 查看全部问答∨ |
|
网上找到一详细描述: 1.开启allegro , file>new>shape symbol. 2.setup>drawing size下将type改为package, 设置好单位,原点坐标,然后OK! 3.用编辑shape的指令以shape的形式画出你想要的焊盘图形,然后再将第2步中的type改回shape(重要) ...… 查看全部问答∨ |
在Active halt mode 怎样配置才能使lcd 显示, CLK_LSICmd(ENABLE); CLK_RTCClockConfig (CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1); CLK_PeripheralClockConfig (CLK_Peripheral_RTC, ENABLE); 其他的都是在初始化时配置的。这 ...… 查看全部问答∨ |
最近使用wince5.0平台 ,但是再设计界面时出现了一些问题,再wince平台下没有flash控件我该怎样实现动画呢望大家指点… 查看全部问答∨ |