微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机串口接收程序出现问题

单片机串口接收程序出现问题

时间:10-02 整理:3721RD 点击:
本人写了一个程序在单片机开发板试验运行,电脑第一次发十六进制aa0200ac给单片机串口时,D0(灯)有反应,但当我再发十六进制aa0000aa给单片机时发现D1并没有反应,望大神指导
12M的晶振,三个字节头部,数据位个数由第三个字节定,最后一位为检验和位

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit D0=P2^0;
sbit D1=P2^1;
sbit D2=P2^2;
unsigned char receive[64]={0};//接收缓存
bit off_whatdog=1;
bit feed_dog_start=0;
bit        feed_dog_stop=0;
#define SYNC_BYTE 0xaa
enum cmd_type {
        CMD_WD_START,
        CMD_WD_STOP,
        CMD_WD_FEED_START,
        CMD_WD_FEED_STOP,
};
struct packagehead
{
         unsigned char synchead;
         unsigned char cmd;
         unsigned char length;
};

struct packagehead pkgh;
void delay2s(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=127;c>0;c--)
        for(b=235;b>0;b--)
            for(a=32;a>0;a--);
    _nop_();  //if Keil,require use intrins.h
}
void InitUART(void)
{
        TMOD |= 0x20;
    SCON = 0x50;
    TH1 = 0xF3;
    TL1 = TH1;
    PCON = 0x80;    //波特率4800
        EA = 1;
    ES = 1;
    TR1 = 1;
}
void main(void)
{
        uint i=0,j=0,a=0,aa=0,b=0,bb=0;
        
    InitUART();
        D2 = 1;
        D1 = 0;
        D0 = 1;

        while (1)
        {
                i=0;
                D2 = ~D2;
                                
                                                
                ES = 1;                 //开中断
                delay2s();
                if(a==0)
                {               
                        if (off_whatdog==1)
                        {
                                aa=1;
                                a=0;
                        }
                        else                 //串口数据接收检验成功,进入这个条件
                        {
                                aa=0;
                                D0 = ~D0;
                                          
                        }
                        ES = 1;                 //开中断
                        delay2s();
                }
                if((aa==0)&&(feed_dog_start==1))
                {
                        a=1;
                        D1 = ~D1;
                }
               
                if(aa==0&&feed_dog_stop)
                {
                         a=0;
                }
        
        }
}
void ser()interrupt 4
{
        static unsigned char i=0;
        static unsigned char total=0;
        RI=0;

        receive=SBUF;
        if(i==0)        
                pkgh.synchead = receive;
        if(i==1)
                pkgh.cmd = receive;
        if(i==2)
                pkgh.length = receive;

        if(i<(pkgh.length+3))
                total+=receive;
        i++;
        if(pkgh.synchead==SYNC_BYTE&&receive[pkgh.length+3]==total )
         {
                if(pkgh.cmd==CMD_WD_STOP)
                         off_whatdog = 1;
                if(pkgh.cmd==CMD_WD_FEED_START)
                {
                         off_whatdog=0;
                }
                if(pkgh.cmd == CMD_WD_START)
                {
                        feed_dog_start = 1;
                }
                if(pkgh.cmd == 0x03)
                {
                        feed_dog_stop = 1;
                }
                i=0;        
                ES=0;      //关中断,恢复完了再ES=1;
               
        }
        if(i>pkgh.length+4)
                i=0;
}

(中断处理函数里面的receive其实是receive【i】但是不知道为什么发上来就没有了,手动编辑加上也不行)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top