[求助] 菜鸟遇到问题了!请大家帮忙

1386734   2011-3-25 22:16 楼主
近日从网上下了个超声测距程序(由于是c语言,小弟看不懂),编译之后出现下图中的错误,好像是“空地址溢出”。不知是何故,求教具体修复方法,附程序

谢谢诸位了!已上传相关图片,劳烦大家了!谢谢!谢谢!

[ 本帖最后由 1386734 于 2011-3-26 20:58 编辑 ]

回复评论 (9)

回复 楼主 1386734 的帖子

请将错误图片上传,大家帮你分析一下
处处留心皆学问!
点赞  2011-3-26 10:36

没图没法看啊

http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2011-3-26 11:06

回复 沙发 daicheng 的帖子

最近挺忙的,都没每天回回贴了。
感觉好像,,daicheng,ddllxx,还有一些人,一时没看到,想不起来。
感觉这几位一直都在帮我看着帖子,心想,是不是琳子姐打得招呼呢?
还是,呵呵,几位主动跑来帮忙,感激不尽,感激不尽。
强者为尊,弱者,死无葬身之地
点赞  2011-3-26 12:02

回复 楼主 1386734 的帖子

下载了你的附件,其中只有一份源程序。
请重新上传你的图,让大家好帮你解决问题。
或者说,直接把那个错误信息 复制上来。

另外,想说,为了让大家更方便地帮你看看问题出在哪里,最好是把你用的整个KEIL的项目文件传上来——如果你是用的KEIL的话,现在51,它是大主流。
强者为尊,弱者,死无葬身之地
点赞  2011-3-26 12:05

楼主的管脚定义错了

#include
sbit csbout=P3^5;               
sbit csbint=P3^7;                
#define csbc=0.034
sbit bg=P3^4;
unsigned char csbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs,ki;//显示标识
unsigned char convert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段码
unsigned int s,t,i,sj1,sj2,sj3,mqs,sx1,sjtz,sja,sjb;
bit cl;       
                                       
void csbcj();
void delay(i);               
void scanLED();                       
void showOnce();                               
void timeToBuffer();                       
void offmsd();


void main()                                        //主函数
{
        EA=1;                                           //开中断
          TMOD=0x11;                                 //设定时器0为计数,设定时器1定时
        ET0=1;                                         //定时器0中断允许
        ET1=1;                                         //定时器1中断允许
        TH0=0x00;
        TL0=0x00;
        TH1=0x9E;
        TL1=0x57;
        csbds=0;
        csbint=1;
        csbout=1;
        cl=0;
        opto=0xff;
        jpjs=0;
        sj1=25;
        sj2=100;
        sj3=450;
        ki=0;
        TR1=1;                                 //设定时值1为20ms
        while(1)
          {
                csbcj();                //调用超声波测距程序
                if(s>sj3)                //大于时显示"CCC"
                {
                buffer[2]=0x39;       
                buffer[1]=0x39;       
                buffer[0]=0x39;       
                }
                else if(s                 {
                buffer[2]=0x40;       
                buffer[1]=0x40;       
                buffer[0]=0x40;
                }
                else timeToBuffer();        //调用转换段码功能模块       
                offmsd();                                //调用判断百位数为零模块,百位为零时不显示
                  scanLED();                                //调用显示函数
        }
}


void scanLED()                             //显示功能模块
{
    digit=0x04;
    for( i=0; i<3; i++)          //3位数显示
    {
        P3=~digit&opto;          //依次显示各位数
        P1=~buffer;          //显示数据送P1口
        delay(20);                 //延时处理
        P1=0xff;                //P1口置高电平(关闭)
        if((P3&0x10)==0)         //判断3位是否显示完
                key=0;
        digit>>=1;                //循环右移1位
    }
}

void timeToBuffer()                    //转换段码功能模块
{
        xm0=s/100;       
        xm1=(s-100*xm0)/10;
        xm2=s-100*xm0-10*xm1;
        buffer[0]=convert[xm2];       
        buffer[1]=convert[xm1];
        buffer[2]=convert[xm0];
}

void delay(i)                                //延时子程序                                       
{
    while(--i);
}

void timer1int (void)  interrupt 3  using 2         //终断处理程序,1秒测量一次
{
        TH1=0x9E;
        TL1=0x57;
        csbds++;
        if(csbds>=40)
        {
                csbds=0;
                cl=1;
        }               
}

void csbcj()                                //超声波测距子程序
{
        if(cl==1)
        {
                   TR1=0;
                TH0=0x00;
                TL0=0x00;
                i=20;                                        //超声波脉冲个数10个
                while(i--)
                {
                        csbout=!csbout;
                }
                TR0=1;                       
                   i=450;                                       
                while(i--)
                {
                }
                i=0;
                while(csbint)                        //判断接收回路是否收到超声波的回波
                {
                        i++;
                        if(i>=2450)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
                        csbint=0;
                }
                TR0=0;
                TH1=0x9E;
                TL1=0x57;
                t=TH0;                                       
                t=t*256+TL0;
                s=t*csbc/2;                                //计算测量结果
                TR1=1;
                cl=0;
        }
}


void offmsd()                                                            //百位为数0判断模块
{
    if (buffer[2] == 0x3f)                                    //如果值为零时百位不显示
    buffer[2] = 0x00;

keil.JPG

[ 本帖最后由 ddllxxrr 于 2011-3-26 12:27 编辑 ]
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2011-3-26 12:25

回复 6楼 ddllxxrr 的帖子

非常感谢!编译通过了!但直接复制过去不行,有几个括号括错了,我对照原程序改了下行了(虽然不知道为什么 )。
但hex文件有3k多写不进去,打开看20H--7F0H之间没数据啊!800H--C80H之间有数据,程序应该就是这个吧?

能不能吧程序拉到空白的那部分啊?那样的话就好写入了
点赞  2011-3-26 21:40

回复 7楼 1386734 的帖子

你没选对芯片吧,按理说3K对任何51都没问题地
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2011-3-27 08:15
第一次回帖
点赞  2011-3-27 15:45

回复 8楼 ddllxxrr 的帖子

我用at89c2051啊。2k内存,原理图上就是这个的,而且我花了两个星期的午休时间刚做完电路板!朋友买的成品电路板上就是这个芯片,我怀疑是程序哪个部分出错了,或多余了。要不是的话看来只有换89c52,再改电路板了。

[ 本帖最后由 1386734 于 2011-3-27 19:55 编辑 ]
点赞  2011-3-27 19:54
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复