STC12 串口通讯问题 程序非常简单 困扰好几天了

2019-07-15 18:50发布

现象:
1:我用stc-isp软件给单片机下载程序后重启开发板
2:再次点stc-isp软件上的下载/编程按钮,这次我不重启开发板,为了模拟通讯,一直循环给开发板发数据。
3:没过多久,led1或者led2会点亮。
我的理解:
1:理论上TEnd=0或者1,但是这里TEnd还会等于256或者-255。不会再等于其他任何数据。
2:如果是定时器太短,导致主程序跑不动延时了,TEnd完全会不定期等于其他数据,但是没有,他只会等于256或者-255这两个特殊数据。
3:我怀疑是数据溢出 因为这两个数据跟8bit,byte有关系。
#include<reg52.h>
#define uchar8 unsigned char //8
#define uint16 unsigned int //16
#define ulong32 unsigned long //32

sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;

ulong32 TStar=0;//记录时间
ulong32 TEnd=0;
ulong32 sys1ms=0;//1ms累加,可以一直累加到49.7天

void main()
{        
        //1ms@12.000MHz
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        //4800bps@12.000MHz
        PCON |= 0x80;                //使能波特率倍速位SMOD
        SCON = 0x50;                //8位数据,可变波特率
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xF3;                //设定定时初值
        TH1 = 0xF3;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1

        EA=1;//开启总中断
        ES=1;//开串口中断
        ET0=1;//开定时器0中断
        while(1)
        {
                ulong32 temp;
                TStar=sys1ms;//扫描周期记录初始值

                //todo_something1();
                //todo_something2 ();

                temp=sys1ms-TStar;
                if(TEnd<=temp)TEnd=temp;//扫描周期计时
               
                if(TEnd!=256 && TEnd!=-255)led0=0;
                if(TEnd==256)led1=0;
                if(TEnd==-255)led2=0;
        }
}

void timer0_Interrupt() interrupt 1//定时器0 1ms 中断程序
{        
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        sys1ms++;                //1ms累加,可以一直累加到49.7天
}

void Comm_Interrupt() interrupt 4//串行中断程序
{
        if(TI)
        {
                TI = 0;
        }
        if(RI)
        {        
                 char value;
         value=SBUF;
         RI=0;
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
sjt11235
1楼-- · 2019-07-15 20:48
 精彩回答 2  元偷偷看……
xiehuipeng
2楼-- · 2019-07-15 22:15
sjt11235 发表于 2014-8-10 17:18
ulong32 temp;
                TStar=sys1ms;//扫描周期记录初始值
                tem ...

呵呵 我也希望它恒等于0 但是事实就是他不会恒等于0 有时会等于 256,或者-255
你要有开发板 下载程序试试 确实如此。。
阿信509
3楼-- · 2019-07-15 22:18
ulong32 temp;这句话放到最前面,main的上面去试试
阿信509
4楼-- · 2019-07-15 23:45
把你的所有ulong32 的数据改成uchar8试试看
xiehuipeng
5楼-- · 2019-07-16 04:36
阿信509 发表于 2014-8-10 19:16
ulong32 temp;这句话放到最前面,main的上面去试试

呵呵 还是不行的 依旧会先等于256 过会再等于-255
我之前还做过这样处理:
当出现等于256 或者-255时,串口读取那两个要相减的值,他们相差确实只有0或者1。怎么就会出现256和-255,很郁闷。
换了好几块开发板和芯片stc89 stc12 at89c52 都是同样的问题
xiehuipeng
6楼-- · 2019-07-16 06:07
 精彩回答 2  元偷偷看……

一周热门 更多>