一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 1458|回复: 5
收起左侧

[51单片机] 51单片机串口接收程序的问题

[复制链接]
发表于 2017-8-11 10:46 | 显示全部楼层 |阅读模式
本帖最后由 假发及腰 于 2017-8-11 11:00 编辑

本人写了一个程序在单片机开发板试验运行,电脑第一次发十六进制aa0200ac给单片机串口时,D0(灯)有反应,但当我再发十六进制aa0000aa给单片机时发现D1并没有反应,望大神指导
12M的晶振,三个字节头部,数据位个数由第三个字节定,最后一位为检验和位(中断处理函数里面的receive其实是receive【i】但是不知道为什么发上来就没有了,手动编辑加上也不行)

#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;

}




发表于 2017-8-13 00:21 | 显示全部楼层
还没测试,不过觉得中断的地方逻辑不少,而且并排的if好多


——————————————
个人有强迫证,所有的 if/for等代码块,全写上{}完整配对

代码的结构还好,逻辑显得过于复杂
发表于 2017-8-13 13:40 | 显示全部楼层
Baud Rate 错。
51 只能用 11.0592MHz 晶振,才可以除出准确的串埠传输速度。
发表于 2017-8-13 14:23 | 显示全部楼层
Joe_Black 发表于 2017-8-13 13:40
Baud Rate 错。
51 只能用 11.0592MHz 晶振,才可以除出准确的串埠传输速度。

用12M的,波特率有点点偏差一样可以通讯,以前好像试过
发表于 2017-8-14 20:30 | 显示全部楼层
12T的51不要用12M,误差太大!!!!!!
11.0592M是首选
发表于 2017-8-15 16:29 | 显示全部楼层
程序写的太水了,编译因该都编译不通过把,数组赋值都没有下标

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-3-29 04:57 , Processed in 0.059169 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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