用软件实现PIC16f877a异步串行口通信_第1页
用软件实现PIC16f877a异步串行口通信_第2页
用软件实现PIC16f877a异步串行口通信_第3页
用软件实现PIC16f877a异步串行口通信_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用软件实现PIC单片机异步串行口通信的方法在讨论具体实现方式前,我们先来简单回顾一下异步串行通信的格式定义。发送一个完整的字节信息,必须有“起始位”、“若干数据位”、“奇偶校验位”和“停止位”;必须定义每位信息的时间宽度一一每秒发送的信息位个数,即为“波特率”。单片机系统中常用的波特率从30019200b/s。当波特率为1200b/s时,每个信息位的时间宽度为1/1200正833Ps;无数据通信时,数据线空闲状态应该是高电平,“起始位”为低电平,数据位低位先发且后跟奇偶校验位(若有),“停止位”为高电平,如图1所示。起期据故敷数数停乍位位位攥年据据1/.状位数数昌"XXkxXxwx按图1最基本的异步串行通信时序,软件实现UART在不同架构的单片机上有多种方法。

其中数据接收是关键,因异步通信没有可参照的时钟信号,发送方随时都可能发送数据,任何时刻串行数据到来时,系统都应该及时准确地接收。比较而言,本机发送串行数据相对容易只要对发送出去的电平做持续时间的定时即可。按不同的接收技巧并针对PIC单片机的特点,这里介绍两种常用且十分可靠的方法。1三倍速采样法三倍速采样法顾名思义就是以三倍于波特率的频率对接收引脚Rx进行采样,保证检测到“起始位”,又可以调整采样的时间间隔;将有效数据位的采样点控制在码元的中间1/3处,最大限度地减少误码,提高接收的准确性。我们把图1的起始位和部分数据位放大,如图2所示,把每个信息位分成三等份,每等份的时间宽度设为ts,以方便分析。莎|「」二7I3:SOSIS2DxDsDxDxDsDxDxOsDx以三倍频对信息位进行采样时,每个信息位都将可能被采样到三次。当处于空闲状态并检测起始位时,最早检测到起始位低电平的时刻必将落在S0阴影区,虽然每次具体的采样点会在此S0阴影区随机变化。检测到起始位低电平后,间隔4Xts时间,正好是第一位数据位的中间1/3处(图2中Ds阴影区)。此后的数据位、校验位和停止位的采样间隔都是3Xts,所有采样点均落在码元的中间1/3处,采样数据最可靠。PIC单片机采用此法实现软件UART时,硬件上只要任意定义两个I/O引脚,分别初始化成输入(串行数据接收)和输出(串行数据发送)即可;软件上只要实现定时采样,定时时间间隔在中档以上有中断机制的单片机上可以用不同的定时器(TMR0、TMR1、TMR2等)

通过定时中断实现,在低档无中断的PIC单片机上可以控制每次主循环所耗的时间来实现。对于1200b/s波特率,码元宽度为833Ps采样时间间隔即为278Ps。整个串行接收或发送是一个过程控制问题,用状态机方式实现最为高效简易。图3给出了串行接收的参考状态机转移过程。11图3本刊网络补充版()中,介绍了简单的C语言参考源程序。此段程序实现1200b/s全双工串行通信,1位起始位,8位数据位,无校验位,1位停止位,没有帧错误等判别。编译环境为HITECH-PICC编译器V8.00PL4或更高版。在网络补充版的程序中,关键部分是TMR0的中断服务。TMR0每隔278Ps左右中断一次,TMR0的中断响应即为软件UART接收和发送全双工通信过程的实现。通过Hitech-PICC高效的代码编译后,约有150条单字指令代码,整个中断服务平均用约35个指令周期,即实现一路软件UART在4MHz工作频率下占用MCU约12%的运行带宽。理论上,只要保证MCU留有足够的运行带宽给其它任务,在此中断服务程序内把接收和发送的代码再复制一份或多份(数据结构独立),即可实现多路软件UART。当然,如果每路的波特率不同,采样频率必须是最高波特率的三倍。不同波特率的采样点间隔独立调整。此法最大的好处是软硬件配置极其灵活:接收发送的引脚可以任意定义;采样定时可以用不同的定时器实现;利用同一个定时采样可以方便地实现多路软件UART等。缺点是:不管有无数据通信,始终占用MCU运行带宽;串行通信的波特率不能太高,4MHz工作的PIC单片机一般能实现2400bps的全双工通信。当然,可以通过提高MCU的振荡频率来实现高波特率通信,当PIC单片机工作在20MHz时,实现9600b/s绰绰有余。,在中档以上PIC单2起始位中断捕捉、定时采样法实现此法的硬件条件是PIC单片机有外部脉冲下降沿中断触发功能片机中有RBO/INT外部中断脚,CCP1/CCP2脉冲沿捕捉脚,PORTB的第4/5/6/7电平变化中断脚等都可以满足。另外需配备一个定时器,以定时中断方式对接收码元正确采样,或发送串行数据,在中档以上PIC单空闲状态I起始位1数刹位01数拥位1敌据机2AL54i卒14I卓ASOSIS2图4图4设串行数据位宽度为td。起始位到来时刻(图4A点)的下降沿触发一个中断并立即响

应该中断。在此中断服务中立即关闭本中断使能位(后续的数据流变化无需触发中断),开启定时器,使其在1.5td后产生定时中断,用于采样第一个数据位(确保SO采样点落在数据位的中心位置处);在处理下降沿中断服务的最后,再检测接收端是否还是0电平,以区分窄脉冲干扰。在SO点采样到第一个数据位后的所有采样间隔都是ltd,直到收到停止位后,关闭定时器中断,重新开放下降沿捕捉中断,准备接收下一个字节。异步数据接收和发送的状态机控制流程,除了起始位判断和定时时间参数设置与前述方式不同外,其它几乎一样,此处不再重复。此法的好处是可以实现较高的通信波特率。对于通信不是很频繁的系统,此软件UART几乎不耗MCU运行带宽,9600b/s接收或发送在4MHz运行的PIC单片机上即可轻松实现;另外,由于下降沿中断可以唤醒处于睡眠的单片机,故极易实现通信唤醒的功能。缺点是不能全双工通信(除非另外单独用一个定时器实现发送定时),异步接收的引脚必须有下降沿触发中断的能力。上面介绍的两种方法在实际产品设计中都得到了很好的验证,最典型的是红外线自动抄表系统。该系统要求收发均为38kHz红外调制,串行数据1200bps半双工通讯。用软件实现此UART,并充分利用PIC单片机CCP模块的脉宽调制PWM输出38kHz载波时,在单片机外除了一个一体化红外接收头和一个红外发射二极管,无需其它任何外围器件,即可完成所有设计要求,最大程度地减化了硬件设计,降低了成本,提高了系统的可靠性和性能价格比。以上的侧重点是基本原理的介绍,希望对大家有所帮助。在接收数据的可靠性处理方面

没有太多涉及。有兴趣者可以在采样时刻到来时对数据做多次采样,以消除干扰误码;或有其它处理技巧,欢迎和笔者作进一步交流。本文来自:DZ3W.COM原文网址:/mcu/picmcu/0080212.htmlPIC16F877A程序如下:#include<pic.h>#defineucharunsignedchar#defineuintunsignedintCONFIG(0X3B31);ucharrecdata;voidinit();voiddelay(uintx);voidinterruptchuankou();voidinit(){TRISC=0XFF;TRISB=0X00;PORTB=0x00;SPBRG=0X19;/设置波特率为9600bps(初值)TXSTA=0X24;〃发送兼控制寄存器,使能串口发送选择高速波特率RCSTA=0X90;/使能串口工作,连续接收//TXIE=1;//允许SCI发送中断请求RCIE=1;〃允许SCI接收完成中断请求RCIF=0;//发送完成,即发送缓冲区空//TXIF=1;//发送完成,即发送缓冲区空PEIE=1;//中断控制,使能外部中断GIE=1;//开放全局中断}voidmain(){init();while(1){switch(recdata)第1个LED灯亮第2个LED灯亮第3个LED灯亮第4个LED第1个LED灯亮第2个LED灯亮第3个LED灯亮第4个LED灯亮第5个LED灯亮第6个LED灯亮第7个LED灯亮第8个LED灯亮}}voidinterruptchuankou(){i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论