打印

c51奇怪问题请教,高手请进,谢谢!

[复制链接]
3209|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
renrongwen|  楼主 | 2007-10-18 10:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一段很简单的代码,没有任何错误和警告,烧写下去跑的很正常,但是编译器编译后单步执行到?处却飞啦 为什么呢?请指点,谢谢!

#include<reg51.h>
#include<intrins.h>

#define uint  unsigned int
#define uchar unsigned char

sfr AUXR   = 0x8e;

uchar STATE;
uint counter;



void INI();
void receive();
void send_onebyte(uchar n);
void Delay(uint n);


void main()
{
    
    counter=0;

    STATE=0;

    INI();
//    TR0=1;
    while(1)
    {
        if(STATE==0x10)
        {
            send_onebyte(0x22);
            TR0=1;    
            STATE=0;
         }

    Delay(2);
    }

}
/*******************************************************************************************/
void Delay(uint n)
{
    uint i;
    while(n--)
    {
        for(i=0;i<80;i++)
        {
        
        };    
    }
}
/*******************************************************************************************/
//*******************************************************************************//

/*void INI_INTERRUPT()
{
    ES=0;//                 ;禁止串口中断
    TMOD=0x21;//          ;设置T1为波特率发生器,定时器模式二运行,自动重装初值
    SCON=0x50;//          ;8位数据位,无奇偶校验
    TH1=0xFD;TL1=0xFD;//           //11.0592MHZ 晶振,波特率9600
    TH0=0xee;TL0=0x00;     //2^16-1ms/(12/11.0592us);
    AUXR &=0xbf;//       ;定时器工作在12T模式下,与普通8051相同
    RI=0;
    EA=1;
    ET0=1;
    ET1=1;
    TR1=1;
    ES=1;
}*/

void INI()
{
    ES=0;
    TMOD=0x21;
    SCON=0x50;
    TH1=0xFD;TL1=0xFD;
    TH0=0xee;TL0=0x00;
    AUXR&=0xbf;
    RI=0;
    EA=1;
    ET0=1;
    ET1=1;
    TR1=1;
    ES=1;//?????????????????????????????????????
}

//*******************************************************************************//

//*******************************************************************************//
void send_onebyte(uchar n)
{
    ES=0;
    TI=0;
    SBUF=n;
    while(TI==0);
    TI=0;
    ES=1;
}

//*******************************************************************************//
void timer0(void)interrupt 1 using 1 
{
        counter++;
        TH0=0Xee;TL0=0X00;//about 5ms       
        //TH0=0X80;TL0=0X00;about 22ms    
        
        send_onebyte(counter);
        if(counter==100)
          {
           send_onebyte(counter);
           counter=0;    
          }
}
//*******************************************************************************//

void receive()interrupt 4 using 3 
{
      uchar temp;
    if(RI)
    {
        RI=0;
        temp=SBUF;
        STATE=SBUF;
        temp++;
        send_onebyte(temp);
    }
    else
    {TI=0;}
}

相关帖子

沙发
computer00| | 2007-10-18 10:26 | 只看该作者

跑飞?什么意思?也许是进入中断服务了。

使用特权

评论回复
板凳
mxh0506| | 2007-10-18 12:49 | 只看该作者

同意楼上,检查一下飞到哪里了?

使用特权

评论回复
地板
ayb_ice| | 2007-10-18 13:33 | 只看该作者

你的意思是实际运行可以,软件仿真不行。。。

没有见过这种情况,相反情况见过。。。

使用特权

评论回复
5
renrongwen|  楼主 | 2007-10-18 14:25 | 只看该作者

对实际运行可以,软件仿真就飞啦

使用特权

评论回复
6
gjg191| | 2007-10-18 14:27 | 只看该作者

dd

估计是中断问题.你仿镇 环境设置对吗?

使用特权

评论回复
7
happy_mcu| | 2007-10-18 14:49 | 只看该作者

你的程序进入中断了,是正常情况

使用特权

评论回复
8
renrongwen|  楼主 | 2007-10-18 15:07 | 只看该作者

这下更加糊涂啦?

这下更加糊涂啦?进中断就可以飞吗?请继续指点,多谢!

使用特权

评论回复
9
computer00| | 2007-10-18 15:18 | 只看该作者

没有飞,而是进入了中断,你继续单步往下执行,

处理完中断之后会再回去的。

使用特权

评论回复
10
HWM| | 2007-10-18 15:27 | 只看该作者

中断,飞出去还会飞回来的,请放宽心啦。

使用特权

评论回复
11
renrongwen|  楼主 | 2007-10-18 17:19 | 只看该作者

更加奇怪??

在一个同事的机器上跑,ok,在我的笔记本和台式机上跑均飞啦???

使用特权

评论回复
12
ayb_ice| | 2007-10-18 17:25 | 只看该作者

是有点奇怪啊。。。

使用特权

评论回复
13
userchen| | 2007-10-18 20:08 | 只看该作者

用keil么?

设置正常的吧。。。。hoho

使用特权

评论回复
14
renrongwen|  楼主 | 2007-10-19 09:52 | 只看该作者

最近情况

对,是kei,昨晚回去在自己笔记本上把keil卸载后重新安装下,ok,程序不飞,后来写一个类似测试程序的时候又飞了,代码如下,基本功能很简单就是开两个定时器(其中t0为普通定时器工作在方式一下,t1为波特率发生器工作在方式二下)和串口中断,当只开t1和串口中断的时候,很正常,当加上t0普通定时器的时候程序软件模拟飞,烧下去也不行,而且所有程序均是0错误0警告的,请各位继续分析,谢谢!


//#include <REGF51RC.H>
#include<reg51.h>
#include<intrins.h>

#define uint  unsigned int
#define uchar unsigned char




sfr AUXR = 0x8e;

uchar counter;

void INI_INTERRUPT();
void receive();
void send_onebyte(uchar n);
void Delay(uint n);
void timer0_5ms();

void main()
{
    counter=0;
    INI_INTERRUPT();
    while(1)
    {
        Delay(10);
    }

}
//*******************************************************************************//
void INI_INTERRUPT()
{
    ES=0;//                 ;禁止串口中断
    TMOD=0x21;//          ;设置T1为波特率发生器,定时器模式二运行,自动重装初值
    SCON=0x50;//          ;8位数据位,无奇偶校验
    TH1=0xFD;//           ;11.0592MHZ 晶振,波特率9600
    TL1=0xFD;//
    AUXR &=0xbf;//       ;定时器工作在12T模式下,与普通8051相同
    RI=0;
    EA=1;
    ET0=1;
    ET1=1;
    TR1=1;
    TR0=1;
    ES=1;
}
//*******************************************************************************//
//function Delay 100us(); delay 100us
//*******************************************************************************//
void Delay(uint n)
{
    uint i;
    while(n--)
    for(i=0;i<80;i++);
}
//*******************************************************************************//

//*******************************************************************************//
void receive()interrupt 4 using 3 
{
  uchar temp;
    if(RI)
    {
        RI=0;
        temp=SBUF;
        temp++;
        send_onebyte(temp);

    }    
    else
    {TI=0;}
}
//*******************************************************************************//
void send_onebyte(uchar n)
{
    ES=0;
    TI=0;
    SBUF=n;
    while(TI==0);
    TI=0;
    ES=1;
}

//*******************************************************************************//
void timer0_5ms(void)interrupt 1 using 1 
{


    counter=counter+1;
    TH0=0xee;TL0=0x00; 
    send_onebyte(counter);

}
//*******************************************************************************//

使用特权

评论回复
15
ayb_ice| | 2007-10-19 10:09 | 只看该作者

试试KEIL自带的例子就知道了。。。

使用特权

评论回复
16
renrongwen|  楼主 | 2007-10-19 10:41 | 只看该作者

谢谢ayb_ice

谢谢ayb_ice的建议,找了些例子,但是好像没有同时开这三个中断的例子,那位大侠有写好的开这三个中断的例子,贴出来(在不影响你公司或者个人技术保密的范围内)我对照一下差异也行。谢谢!

使用特权

评论回复
17
zgl7903| | 2007-10-19 21:10 | 只看该作者

个人见解

注意函数send_onebyte(uchar n) (默认寄存器组0)
timer0(void)interrupt 1 using 1 
receive()interrupt 4 using 3 
在不同的寄存器组中是无法正确传送参数的

另外不提倡使用这种资源互锁的操作,还需要考虑中断优先级的问题

使用特权

评论回复
18
zgl7903| | 2007-10-19 21:24 | 只看该作者

补充 ET1=1 但是无中断服务程序

使用特权

评论回复
19
ayb_ice| | 2007-10-20 10:52 | 只看该作者

回zgl7903

“在不同的寄存器组中是无法正确传送参数的”。。。
只要不使用绝对寄存器访问是可以正确使用的,而且也是经常使用的。。。

使用特权

评论回复
20
renrongwen|  楼主 | 2007-10-22 10:15 | 只看该作者

最新进展

首先谢谢各位网友的热心回复,至于同一个程序在不同机器上运行有的飞有的不飞,原因是code mode的选择不同导致的。关于第二个程序的问题处在初始化上。谢谢大家的关注和指点,谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

88

帖子

1

粉丝