/*****************************************************************************
函数功能:单片机接收电脑串口发送的字符串,已验证正常,最大可接收100个字符
最近一直在研究这个串口接收字符串问题,也看了网上很多例子都不能实现,现在
终于将此程序调试成功.
设计者:空心菜
联系qq:190719416
修改时间2016/07/15 下午15:22
****************************************************************************/
#include<at89x52.h>
#define uint unsigned int
#define uchar unsigned char
#define Fclk 11059200UL  //晶体频率
#define BitRate 9600UL    //波特率
uchar st[100];            //保存串口数据的缓冲区数组,如果想接收更多的字符可创建多个数组
volatile uchar Sending;
static uchar i=0;
uchar flag;
/****************************************************
函数功能:串口初始化
入口参数:无
返    回:无
备    注:无
*****************************************************/
void InitUART(void)
{
    EA=0;                          //暂时关闭中断
    TMOD&=0x0F;                    //定时器1模式控制在高4位
    TMOD=0x20;                    //定时器1工作在模式2,自动重装模式,定时器0工作在模式1,16位定时
    SCON=0x50;                    //串口工作在模式1
    TH1=256-Fclk/(BitRate*12*16);  //给定时器装初值
    TL1=256-Fclk/(BitRate*12*16);
    PCON|=0x80;                    //串口波特率加倍
    ES=1;                          //串行中断允许
    TR1=1;                        //启动定时器1
    REN=1;                        //允许接收
    EA=1;                          //允许中断
}
/*****************************************************
函数功能:串口中断处理
入口参数:无
返    回:无
备    注:无
******************************************************/
void UartISR(void) interrupt 4
{
    if(RI)
    {
        RI=0;   
        st[i++]=SBUF;      //把电脑串口发送到缓冲区的数据保存到数组   
        flag=1;
    }
    if(TI)            //发送完1字节数据
    {       
字符串函数连接        TI=0;           
        Sending=0;      //清正在发送标志
    }
}
/****************************************************
函数功能:往串口发送字符串数据
入口参数:无
返    回:无
备    注:将数组中的数一个个发送到电脑串口
*****************************************************/
void UartPutString()
{
    uchar j=0;
    uchar x;
    uint num;
    if(flag==1)     
    {
        flag=0;                //判断电脑是否有发送数据出来,有的话就将标志位置0
    }
    num++;
    if(num==10000&&flag==0) 
    //如果延时一段时间后,标志位还是为0,说明没有接收到数据,可以进行数据输出
    {
        num=0;
        for(x=0;x<i;x++)        //i变量是接收到的字节数
        {
            Sending=1;          //设置发送标志
            SBUF=st[j++];       
            //将数组中的数据写入到串口缓存,让电脑串口显示出来
            if(j==i)j=0;        //如果输出的字符完毕,将j清0
            while(Sending);      //等待发送完毕
        }
        i=0;                  //将接收字符数清0,等待下次接收
    }
}
main()
{   
    InitUART();
    while(1)
    {               
        UartPutString();   
    }
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。