基于51单片机异步串行通信程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-------本程序的思想:一串口通讯方式一进行单片机与上位机(串口调试助手)的实时通讯,反应异步串行通讯特点--------------
-------A:设置定时器1,形成波特率,进行中断形式的串口通讯--------------------------------------------------------------
void delay()
{
uint x,y;
for(x=1000;x>0;x--)
for(y=110;y>0;y--);
}
//-------------------------------------------------------------------//
void main()
{
init_timeFra Baidu bibliotek1();
//-------------------------------------------------------------------------------------------------------------------*/
void init_timer1()
{
TMOD=0X20;
TH1=TL1=0X98;
ES=1;
flag=0;
}
}
}
//----------------------主程序----------------------------------------//
void s_ri_break() interrupt 4
{
RI=0;
a_receive=SBUF;
delay();
flag=1;
}
uchar code prefix[]="I get ";//前缀---字头
uchar flag,a_receive,i;
/*-------------------------------------------------------------------------------------------------------------------
基于51单片机的异步串行通讯
1.串行工作方式1,波特率与T1定时器的溢出率有关
2.进行中断法的串行通讯
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//------------------宏定义-------------------//
-------B:单片机先发送字头(prefix),接收到调试助手发送来的数据后紧随发送回调试助手----------------------------------
-------C:本程序中进入中断是由串行接收中断标志(RI=1单片机接收到一帧数据后由硬件自身引起,后续软件复位,以接收下次中断)
-------D:发送完一帧数据,不进入中断程序,(复位发送中断标志,时间较短也不一定能进入中断,可能中断确认不能完成)-----
init_serial();
init_s_break();
while(1)
{
if(flag==1)
{
ES=0;
for (i=0;i<6;i++)
{
SBUF=prefix[i];
delay();
while(!TI)TI=0;
}
SBUF=a_receive;
delay();
while(!TI)TI=0;
TR1=1;
}
//---------------定时器设置----------------------------------------//
void init_serial()
{
REN=1;//------允许串行接收------------//
SM0=0;//------工作方式一--------------//
SM1=1;//-------------------------------//
}
//------------------串口工作方式设置SCON---------------------------//
void init_s_break()
{
EA=1;//总中断
ES=1;//串口中断允许位
}
// -----------------设置串口中断进行串口通信----------------------------//
间歇肯定串口中断功能进行避免由发送中断标志引起的串口中断-------------------------------------------------------------
-------E:主程序中的delay()函数的应用原因,由于所采用的的波特率较低300,所以读取数据较慢,以延时函数等待数据的读取,--
读取时,是在T1定时器决定的波特率确定的,来一个周期,读一个位的数据,所以采用延时保证数据可读完。---------------------
-------F:采用波特率300的原因在于,本设备晶振频率12MHZ,在300波特率时其误差为零。-------------------------------------
-------G:在上位机中发送字符时,只能发送一个字节的数据,其原因在于,在中断程序中仅进行了一次读的操作,即只读到一个字节
的数据---------------------------------------------------------------------------------------------------------------
-------A:设置定时器1,形成波特率,进行中断形式的串口通讯--------------------------------------------------------------
void delay()
{
uint x,y;
for(x=1000;x>0;x--)
for(y=110;y>0;y--);
}
//-------------------------------------------------------------------//
void main()
{
init_timeFra Baidu bibliotek1();
//-------------------------------------------------------------------------------------------------------------------*/
void init_timer1()
{
TMOD=0X20;
TH1=TL1=0X98;
ES=1;
flag=0;
}
}
}
//----------------------主程序----------------------------------------//
void s_ri_break() interrupt 4
{
RI=0;
a_receive=SBUF;
delay();
flag=1;
}
uchar code prefix[]="I get ";//前缀---字头
uchar flag,a_receive,i;
/*-------------------------------------------------------------------------------------------------------------------
基于51单片机的异步串行通讯
1.串行工作方式1,波特率与T1定时器的溢出率有关
2.进行中断法的串行通讯
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//------------------宏定义-------------------//
-------B:单片机先发送字头(prefix),接收到调试助手发送来的数据后紧随发送回调试助手----------------------------------
-------C:本程序中进入中断是由串行接收中断标志(RI=1单片机接收到一帧数据后由硬件自身引起,后续软件复位,以接收下次中断)
-------D:发送完一帧数据,不进入中断程序,(复位发送中断标志,时间较短也不一定能进入中断,可能中断确认不能完成)-----
init_serial();
init_s_break();
while(1)
{
if(flag==1)
{
ES=0;
for (i=0;i<6;i++)
{
SBUF=prefix[i];
delay();
while(!TI)TI=0;
}
SBUF=a_receive;
delay();
while(!TI)TI=0;
TR1=1;
}
//---------------定时器设置----------------------------------------//
void init_serial()
{
REN=1;//------允许串行接收------------//
SM0=0;//------工作方式一--------------//
SM1=1;//-------------------------------//
}
//------------------串口工作方式设置SCON---------------------------//
void init_s_break()
{
EA=1;//总中断
ES=1;//串口中断允许位
}
// -----------------设置串口中断进行串口通信----------------------------//
间歇肯定串口中断功能进行避免由发送中断标志引起的串口中断-------------------------------------------------------------
-------E:主程序中的delay()函数的应用原因,由于所采用的的波特率较低300,所以读取数据较慢,以延时函数等待数据的读取,--
读取时,是在T1定时器决定的波特率确定的,来一个周期,读一个位的数据,所以采用延时保证数据可读完。---------------------
-------F:采用波特率300的原因在于,本设备晶振频率12MHZ,在300波特率时其误差为零。-------------------------------------
-------G:在上位机中发送字符时,只能发送一个字节的数据,其原因在于,在中断程序中仅进行了一次读的操作,即只读到一个字节
的数据---------------------------------------------------------------------------------------------------------------