中国自动化学会专家咨询工作委员会指定宣传媒体
免费注册 登录 广告服务 | 客服中心
您现在所在的是:

单片机论坛

抖音 德嘉 泓格论坛 FLIR红外热像论坛
工控论坛首页 单片机论坛 → 浏览主题: C51 数组元素存取,无缘无故,导致运行程序混乱,求老师傅帮忙解析
发表新帖 回复该主题
回帖:5个,阅读:681 [上一页] [1] [下一页]
* 帖子主题:

C51 数组元素存取,无缘无故,导致运行程序混乱,求老师傅帮忙解析

分享到
905
hernde
文章数:20
年度积分:50
历史总积分:905
注册时间:2009/8/8
发站内信
发表于:2012/2/24 21:56:09
#0楼
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code led_code[]={0x88,0xbe,0xc4,0x94,0xb2,0x91,0x81,0xbc,0x80,0x90,0xa0,0x83,0xc7,0x86,0xc1,0xe1};//LED七段码
uchar code *pc;
uchar data zancun[4]={0x00,0x00,0x00,0x00}; //反复调试已经找到,就是这里的数组zancun 问题 但就是看不出程对其内部元素zuncun【1】的存取操作有什么问题。
key_panduan(uchar data x,uchar data y);
sm_key();
main()
{
uchar data i;
SP=0xcf;
P0=0xf0;
TMOD=0x22;
TL0=(256-250)%256;
TH0=(256-250)%256;
IE=0x82;
TR0=1;
pc=led_code;
for(i=0;i<=4;i++)
zancun[i]=3;
while(1)
{
P2=*pc;
sm_key();
;

}


}
void enter0() interrupt 1  
{
TH0=(256-250)%256;
TL0=(256-250)%256;
if(P0==0xff)P0=0x00;
else P0++;
pc=led_code;
pc=pc+zancun[1];//这个位置的数组元素zancun【1】
if(pc>=&led_code[16])pc=led_code;

}
key_panduan(uchar data x,uchar data y)
{
uchar data z=0;
switch(y)
{
case 0xe0: z=0x00+x;break;
case 0xd0: z=0x10+x;break;
case 0xb0: z=0x20+x;break;
case 0x70: z=0x30+x;break;
default: break;
}
return z;
}  
sm_key()
{
uchar data mm,nn;
mm=P0;
nn=mm&0xf0;
if(nn!=0xf0&&zancun[0]!=mm)
{
zancun[0]=mm;
mm=mm&0x0f;
zancun[1]=key_panduan(mm,nn);//这个位置的数组元素zancun【1】
}  
;

}
//以上代码编译没有任何错误与警告,编译很成功。它是一个数码显示程序,但一旦在试验板上调试,所有数码管出现全亮闪烁,不能稳定输出
//反复测试程序,发现一旦把以上两个引用到的数组元素zancun【1】其中一个改为zancun【2】或其他,程序就能正常输出,数码管显示3;
//但这样就不能实现数组元素变量的传递。
//以上程序就是看不出数组元素引用,问题出来 在哪里。?求各位老师傅帮忙解析。
36602
cvlsam 版主
文章数:12326
年度积分:954
历史总积分:36602
注册时间:2001/12/22
发站内信
2018论坛贡献奖
2017论坛贡献奖
2016论坛贡献奖
2015论坛贡献奖
2013论坛贡献奖
2012论坛贡献奖
2011论坛贡献奖
2011国庆活动
2010论坛杰出贡献奖
发表于:2012/2/25 8:25:47
#1楼
以下是引用hernde在2012/2/24 21:56:09的发言:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char 
uchar code led_code[]={0x88,0xbe,0xc4,0x94,0xb2,0x91,0x81,0xbc,0x80,0x90,0xa0,0x83,0xc7,0x86,0xc1,0xe1};//LED七段码
uchar code *pc;
uchar data zancun[4]={0x00,0x00,0x00,0x00}; //反复调试已经找到,就是这里的数组zancun 问题 但就是看不出程对其内部元素zuncun【1】的存取操作有什么问题。
key_panduan(uchar data x,uchar data y);
sm_key();
main()
{
  uchar data i;
  SP=0xcf;
  P0=0xf0;
  TMOD=0x22;
  TL0=(256-250)%256;
  TH0=(256-250)%256;
  IE=0x82;
  TR0=1;
  pc=led_code;
  for(i=0;i<=4;i++)
  zancun[i]=3;
  while(1)
  { 
   P2=*pc; 
  sm_key();
;

  }
  

}
void enter0() interrupt 1  
{   
 TH0=(256-250)%256;
 TL0=(256-250)%256; 
 if(P0==0xff)P0=0x00;
 else P0++;
 pc=led_code;
 pc=pc+zancun[1];//这个位置的数组元素zancun【1】
 if(pc>=&led_code[16])pc=led_code;
     

key_panduan(uchar data x,uchar data y)
{
 uchar data z=0;
 switch(y)
 {
  case 0xe0: z=0x00+x;break;
  case 0xd0: z=0x10+x;break;
  case 0xb0: z=0x20+x;break;
  case 0x70: z=0x30+x;break;
  default: break;
 }
 return z; 
}  
sm_key()
{
 uchar data mm,nn;
 mm=P0; 
 nn=mm&0xf0;
 if(nn!=0xf0&&zancun[0]!=mm)
 {
  zancun[0]=mm;
  mm=mm&0x0f;
  zancun[1]=key_panduan(mm,nn);//这个位置的数组元素zancun【1】
  }  
 ;


//以上代码编译没有任何错误与警告,编译很成功。它是一个数码显示程序,但一旦在试验板上调试,所有数码管出现全亮闪烁,不能稳定输出
//反复测试程序,发现一旦把以上两个引用到的数组元素zancun【1】其中一个改为zancun【2】或其他,程序就能正常输出,数码管显示3;
//但这样就不能实现数组元素变量的传递。
//以上程序就是看不出数组元素引用,问题出来 在哪里。?求各位老师傅帮忙解析。

data zancun[4]声明的数组有4个元素,下标分别为0,1,2,3

但是:for(i=0;i<=4;i++)
zancun[i]=3;
却对0,1,2,3,4元素赋值。

如果您略微懂汇编代码的话,那么您对元素下标为4的地址赋值,实际上是对循环变量i的赋值。
附件

您应该将循环变量中止的条件设定为3,这样才对您的数组进行了初始化。

GCC的编译器是不会发现此错误的,仍然可以运行,实际上,微软的编译器会发现这个运行错误,诸如众多的厂商,包括PLC厂商的编译器均不会发现此错误。

实际上,在早先的针对于驱动的编程,并不视这个为错误,发而,利用这个技巧,进行中断的数据保留,提升响应速度。

以上仅表示个人看法。

Regards
附件
4024
sankyo_feng
文章数:730
年度积分:50
历史总积分:4024
注册时间:2006/11/8
发站内信
发表于:2012/2/25 8:56:05
#2楼
uchar data zancun[4]={0x00,0x00,0x00,0x00};
for(i=0;i<=4;i++)
zancun[i]=3;
数组也界,呵呵!很可怕吧?cvlsam真厉害这都被你看出来了!C对数组出界是不做处理的!
905
hernde
文章数:20
年度积分:50
历史总积分:905
注册时间:2009/8/8
发站内信
发表于:2012/2/25 9:53:40
#3楼
谢谢cvlsam您的回复
for(i=0;i<=4;i++)
zancun[i]=3;
这个语句确实是个病句,
之后我对此处更改后,
for(i=0;i<=3;i++)
zancun[i]=3;
运行程序,还是同样的问题
代码编译没有任何错误与警告,编译很成功。它是一个数码显示程序,但一旦在试验板上调试,所有数码管出现全亮闪烁,不能稳定输出



1058
zhgkwfxs
文章数:160
年度积分:50
历史总积分:1058
注册时间:2010/7/13
发站内信
发表于:2012/2/26 18:40:28
#4楼
TL0=(256-250)%256;
TH0=(256-250)%256;
检查扫描循环时间
905
hernde
文章数:20
年度积分:50
历史总积分:905
注册时间:2009/8/8
发站内信
发表于:2012/2/27 13:19:45
#5楼
这个问题,我解决了,我自己程序中断里,对P0口赋初值是出现问题.
TH0=(256-250)%256;
TL0=(256-250)%256;
if(P0==0xff)P0=0x00;
改为
TH0=(256-250)%256;
TL0=(256-250)%256;
if(P0==0xff)P0=0xf0;
就可以了,是这里程序跑飞了...
谢谢,关心,帮助我的师傅们...
工控学堂推荐视频:

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

78.0005