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