搜索
bottom↓
回复: 8

关于51单片机程序跑飞的问题

[复制链接]

出0入0汤圆

发表于 2014-5-11 10:58:21 | 显示全部楼层 |阅读模式
本帖最后由 优享家 于 2014-5-11 11:03 编辑

我现在的情况是代码之前有朋友用在stc11芯片上已经OK,现在我移植(没改多少)至89就出现了串口通信时会死在哪里的情况
我选用的是89C52,内部ram为512
1、我在keil中设置memory model 为compact,code optimization level为8时
编译出来的程序结果是:
Program Size: data=172.2 xdata=67 code=3343
疑问:
(1)按理说89C52有128的data区和128的idata区以及有256的xdata区,但这里data区只用了172.2而不是256就将其他存储存至xdata区,要知道xdata区的处理速度要小于(i)data区
(2)Program Size: data=172.2的data与idata是怎样分配的
2、我在keil中设置memory model为small,code optimization level为8时
编译出来的结果是
Program Size: data=239.2 xdata=0 code=2980
疑问:
(1)按照如下的情况我的代码应该是没有超过89c52的ram((i)data=256),所以应该不会有程序跑飞的情况吗,但情况是有问题。

如上问题,请各位帮忙分析下,谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-5-11 11:24:50 | 显示全部楼层
89c52是12分频,11F是单指令周期,可能是你的时序问题引起的。

出0入0汤圆

 楼主| 发表于 2014-5-11 12:48:04 | 显示全部楼层
问题得到初步解决,在通过串口发送时先关ES串口中断。在发送完成后再开ES串口中断

出0入0汤圆

 楼主| 发表于 2014-5-11 12:51:10 | 显示全部楼层
davy_000 发表于 2014-5-11 11:24
89c52是12分频,11F是单指令周期,可能是你的时序问题引起的。

正解,11的速度要快于89,在中断那里出现了问题,我先关ES待发送完后开ES,结果就好了,但是为何会有这种情况,我在串口中断中判断是否为接收中断,不是的话就跳出,这样程序就执行不了了吗

出0入0汤圆

 楼主| 发表于 2014-5-11 12:52:21 | 显示全部楼层
jswd0810 发表于 2014-5-11 12:13
89C52内部ram为256,不是512,在一个如楼上所言,时钟周期不一样,波特率同样的设置就要出问题 ...

波特率设置应该没有问题,内部ram256还没有超,现在的情况应该是串口中断出了问题

出0入4汤圆

发表于 2014-5-11 14:30:12 | 显示全部楼层
1、因为89C52有256字节的内部扩展RAM,就是XDATA,你在用compact模式编译时,默认将变量分配到PDATA中,就是XDATA的低256字节,在这里等于XDATA;
2、设置成small模式编译,变量就存在data区了嘛,所以就没用到XDATA嘛,编译后XDATA=0嘛。很好理解的嘛。
3、STC11是1T单片机呢,你移植到89C52,得保证他之前用STC11是当做12T来用呀,还有晶振大小呀什么的都会影响程序运行的,不保证一致,你得改下程序的细节,包括延时呀中断呀定时呀什么的。
GOD BLESS YOU.

出0入0汤圆

发表于 2014-5-11 19:34:16 来自手机 | 显示全部楼层
1T的移植到12T上,楼主这么改下就说解决了,恐怕只有糊弄自己了。根本性的东西都没动!

出0入0汤圆

 楼主| 发表于 2014-5-12 00:33:01 | 显示全部楼层
xpxp 发表于 2014-5-11 19:34
1T的移植到12T上,楼主这么改下就说解决了,恐怕只有糊弄自己了。根本性的东西都没动! ...

没完全明白,为什么我增加就好了——按理说我的串口中断判断完是否为接受中断,不是的话就跳出,但是程序就死在那里。
如下更改后,发送OK
void SendChar(uchar n)
{
        SBUF = n;
        ES = 0;     //增加
        while (TI==0);//发送数据
        ES = 1;    // 增加
        TI=0;
       
}

但是新的问题是我的接受不行了,SBUF可能接收到乱码,在串口中断中没有接收到东西,我想应该是速度的问题,89太慢了
void SerialHandler(void) interrupt 4 using 3
{

    uchar nCh = 0;
        uchar nTmp = 0;
        SendChar('%');
        Delay(10);
                        EA = 0;
        if(!RI)      //不是接收中断
        {
                TI = 0;
                return;         //退出
        }


    RI = 0;                 //清中断
   
    if(nCmdBusy == DEV_BUSY)         //若忙
    {
        return;                                         //反回
    }
   
        nCh = SBUF;         //读内容         ————————程序这里没有读到数据。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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