基于51单片机异步串行通信程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于51单片机的异步串行通讯1.串行工作方式1,波特率与T1定时器的溢出率有关2.进行中断法的串行通讯#includereg51.h#defineucharunsignedchar#defineuintunsignedint//------------------宏定义-------------------//ucharcodeprefix[]=Iget;//前缀---字头ucharflag,a_receive,i;/*--------------------------------------------------------------------------------------------------------------------------本程序的思想:一串口通讯方式一进行单片机与上位机(串口调试助手)的实时通讯,反应异步串行通讯特点---------------------A:设置定时器1,形成波特率,进行中断形式的串口通讯---------------------------------------------------------------------B:单片机先发送字头(prefix),接收到调试助手发送来的数据后紧随发送回调试助手-----------------------------------------C:本程序中进入中断是由串行接收中断标志(RI=1单片机接收到一帧数据后由硬件自身引起,后续软件复位,以接收下次中断)-------D:发送完一帧数据,不进入中断程序,(复位发送中断标志,时间较短也不一定能进入中断,可能中断确认不能完成)-----间歇肯定串口中断功能进行避免由发送中断标志引起的串口中断--------------------------------------------------------------------E:主程序中的delay()函数的应用原因,由于所采用的的波特率较低300,所以读取数据较慢,以延时函数等待数据的读取,--读取时,是在T1定时器决定的波特率确定的,来一个周期,读一个位的数据,所以采用延时保证数据可读完。----------------------------F:采用波特率300的原因在于,本设备晶振频率12MHZ,在300波特率时其误差为零。--------------------------------------------G:在上位机中发送字符时,只能发送一个字节的数据,其原因在于,在中断程序中仅进行了一次读的操作,即只读到一个字节的数据---------------------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------------------------*/voidinit_timer1(){TMOD=0X20;TH1=TL1=0X98;TR1=1;}//---------------定时器设置----------------------------------------//voidinit_serial(){REN=1;//------允许串行接收------------//SM0=0;//------工作方式一--------------//SM1=1;//-------------------------------//}//------------------串口工作方式设置SCON---------------------------//voidinit_s_break(){EA=1;//总中断ES=1;//串口中断允许位}//-----------------设置串口中断进行串口通信----------------------------//voiddelay(){uintx,y;for(x=1000;x0;x--)for(y=110;y0;y--);}//-------------------------------------------------------------------//voidmain(){init_timer1();init_serial();init_s_break();while(1){if(flag==1){ES=0;for(i=0;i6;i++){SBUF=prefix[i];delay();while(!TI)TI=0;}SBUF=a_receive;delay();while(!TI)TI=0;ES=1;flag=0;}}}//----------------------主程序----------------------------------------//voids_ri_break()interrupt4{RI=0;a_receive=SBUF;delay();flag=1;}

1 / 3
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功