找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1868|回复: 0
打印 上一主题 下一主题
收起左侧

最简单片机串口帧指令接收程序

[复制链接]
跳转到指定楼层
楼主
ID:301968 发表于 2021-12-28 17:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本程序主要用作串口接收帧指令而产生的相应动作,本程序完全自已编写使用。比较可靠

bit    Uart1_RX_OK_Flag=0;                                       //串口1接收数据正确标志
bit    Uart1_flagTxd = 0;                                           //单字节发送完成标志,用来替代 TXD 中断标志位
u16  xdata Uart1_cntRxd = 0;                                  //接收字节计数器
u8    xdata Uart1_Rxd_buff[200]={0};                   //串口1接收缓冲区串口数据,接收中断中使用
u8    Uart1_flagFrame_50ms = 0;                          //串口1帧接收完成标志,即接收到一帧新数据 串口1帧标志时间为50MS,超过50MS为1帧完
bit   Uart1_flag_en = 0;
                                         //串口1指令使能标志
void Uart1_Init()                //115200bps@24MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0xCC;                //设定定时初值
        TH1 = 0xFF;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
        ES=1;
        TI=0;
}



/* 串口中断服务函数 */
void InterruptUART() interrupt 4
{
        static  u8  i=0;
        u16   temchar=0;


        if (RI)         //接收到新字节
        {
                Uart1_flagFrame_50ms = 0;          //串口1帧接收完成标志清零,即接收到一帧新数据 串口1帧标志时间为50MS,超过50MS为1帧完
                Uart1_flag_en = 1;                     ////接收贞处理标志
                temchar=SBUF;                                                    //清零接收中断标志位      
                RI = 0;                                                                                 //清零接收中断标志位
                if(temchar==0x7f)
                {
                        i++;
                        if(i>=16)
                        {         i=0;IAP_CONTR |= 0x60;        }     //这个作用用于自动重启,自动烧录,不用重新上电
                }
                else
                { i=0;}


                if (Uart1_cntRxd <Uart1_bufcnt)         //接收缓冲区尚未用完时,
                {
                        Uart1_Rxd_buff[Uart1_cntRxd++] = temchar;
                }                                                                                //保存接收字节,并递增计数器
        }
        if (TI)                         //字节发送完毕
        {
                TI = 0;                 //清零发送中断标志位
                Uart1_flagTxd = 1; //设置字节发送完成标志
        }
}




void Uart1_Action()           //串口功能函数,Uart1_drive()中调用
{
        u8 *pbuf; u16 Len=0;
        pbuf=&Uart1_Rxd_buff[0];    //接收缓冲区指针转换,长度转换。
      
         if(CmpMemory(pbuf,&cmd1[0], sizeof(cmd1)-1))  //指令比较,
        {
           
        }      
}



void Uart1_drive()           //串口功能函数,主循环中调用
{
        if(Uart1_flagFrame_50ms>=50&&Uart1_flag_en)       //串口1指令使能标志 ==0) //接收帧计时到,并且未处理数据指令
        {
                  Uart1_Action();
                Clear_array(Uart1_Rxd_buff, Uart1_bufcnt ); //清空RXD接收缓冲区
                    Clear_array(DATA_BUFF_RXD, 8); //清空临时数据缓冲区
               Uart1_cntRxd=0;                                                                                                                         //接收字节清零
              Uart1_flag_en=0;                                 //帧功能处理标志,处理为标志1
              Uart1_flagFrame_50ms=0;
        }
      
}


void TM0_Isr() interrupt 1        //定时器0中断函数1mS
{
    if(Uart1_flagFrame_50ms<50&&Uart1_flag_en)   //串口1帧接收完成标志,即接收到一帧新数据 串口1帧标志时间为50MS,超过50MS为1帧完
    Uart1_flagFrame_50ms++;

}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表