4053|3

34

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

这算是个BUG吗?关于STC89C52串口调用和EA [复制链接]

用STC89C52调试程序的时候,发现程序刚复位不久,通过串口打印了几个字符就看门狗叫唤复位了。各种查看逻辑时序都没有发现问题,最后偶然改动了一下串口程序就Ok了。现做了测试程序如下:
#include "stc89c52.h"
#include

void UART_init(void) //串口初始化
{
    SCON=0x50;      
    TMOD=0x20;      
    TH1=0xFD;       // 9600  11.0592MHz
        TL1=0XFD;
    TR1=1;         
    TI=0;                   //清串行通信相关的中断标志
        RI=0;     
        ES=1;                                                                                                                                        //使能串行通信中断
}
void UART_byte(unsigned char byte)
{
        SBUF=byte;
        while(!TI);
        TI=0;
//        delay(5);
}
void main()
{
        UART_init();
        EA=1;
        UART_byte(0x01);
        UART_byte(0x02);
        while(1);       
}

烧写这样的程序,复位单片机,我这打印出来的字符是0x01,0x01,而我在之前的程序中是直接卡在第一次调用UART_byte()的while(!TI)的。
而如果我在EA=1;后面加一句空跳_nop_();如下:
#include "stc89c52.h"
#include

void UART_init(void) //串口初始化
{
    SCON=0x50;      
    TMOD=0x20;      
    TH1=0xFD;       // 9600  11.0592MHz
        TL1=0XFD;
    TR1=1;         
    TI=0;                   //清串行通信相关的中断标志
        RI=0;     
        ES=1;                                                                                                                                        //使能串行通信中断
}
void UART_byte(unsigned char byte)
{
        SBUF=byte;
        while(!TI);
        TI=0;
//        delay(5);
}
void main()
{
        UART_init();
        EA=1;
        _nop_();        //仅添加此句
        UART_byte(0x01);
        UART_byte(0x02);
        while(1);       
}

打印出来的字符就是0x01,0x02正常了。不过我那个程序时常异常复位,而我将UART_byte()函数内容改为如下:
oid UART_byte(unsigned char byte)
{
        SBUF=byte;

        delay(5);
        TI=0;
}

就不会再有此类问题了。不知道有没有人碰到过串口的TI标志位,和与EA紧接操作时,发生类似的问题的。
对于这款单片机,看来是不能直接使用while()进行判断的,必须添加超时退出机制。
此帖出自51单片机论坛

最新回复

有可能是发送程序所用时间超过了喂狗时间间隔。     SBUF=byte;         while(!TI);         TI=0; 当执行第一句后,串口即开始向外发送数据,然后应该进入原地等待阶段,等待发送完成。“TI”是发送完成后由硬件置位,当程序检测到“TI ”置位后,结束循环,程序即可自动进行下面的步骤。 如果你的延时足够,也可以取代循环等待,但不一定能真正解决问题。。   详情 回复 发表于 2014-2-7 14:42
点赞 关注
 

回复
举报

1万

帖子

142

TA的资源

版主

沙发
 
这个是你的程序问题,不会是MCU的bug。STC的51内置看门狗有两种模式,一是上电自动运行,二是由软件指令控制启动,由烧写时的选项决定。如果采用的是前者,且看门狗复位周期比较短,那么当楼主的程序初始化完成后已经过了一段时间,如果之后执行的程序费时过长而未清看门狗,那么看门狗就会产生复位。即使是程序控制启动看门狗,也必须计算所有情况下的软件运行周期的极大值,必须在看门狗溢出前做清看门狗的操作。
此帖出自51单片机论坛
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
中断应该没有被正确初始化
此帖出自51单片机论坛
 
 
 

回复

173

帖子

0

TA的资源

纯净的硅(初级)

4
 
有可能是发送程序所用时间超过了喂狗时间间隔。
    SBUF=byte;
        while(!TI);
        TI=0;

当执行第一句后,串口即开始向外发送数据,然后应该进入原地等待阶段,等待发送完成。“TI”是发送完成后由硬件置位,当程序检测到“TI ”置位后,结束循环,程序即可自动进行下面的步骤。

如果你的延时足够,也可以取代循环等待,但不一定能真正解决问题。。
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表