打印

51c定时器中断子程序和AD转换子程序整合失败,求教...

[复制链接]
3739|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xianxian314|  楼主 | 2011-9-21 19:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
详细:我写的某个子程序其中开头调用 定时器并用键盘控制PWM占空比输出,后面再调用ad转换子程序时,后者不工作,下面附上该子程序及其调用子程序
void init_sys(void)             启动定时器
{
   
  TMOD=V_TMOD;
  TH0=V_TH0;
  TL0=V_TL0;
  TR0=1;
  ET0=1;
  EA=1;
}




void timer0(void) interrupt 1 using 2   定时器工作方式设定
{
static uchar cs=0;                  
TH0=V_TH0;                                   
TL0=V_TL0;
cs++;
if (cs>=100) cs=0;

if (cs<=bfb)      
  PWM=0;
else
  PWM=1;


}

void I-love-仓井 (void)  主子程序
{                 
bfb=55;
init_sys();    启动定时器     
  while(1)    无限循环
  {   
                                         
                 angle_FP();  此子程序包含LED显示子程序再嵌套AD转换子程序                     
        }
运行时ad直接不工作,没信号输出,为什么会这样?即使中断打断了AD转化,那在中断程序结束时,也应该返回到AD转换部分继续执行的啊。

相关帖子

沙发
xianxian314|  楼主 | 2011-9-21 22:14 | 只看该作者
:Q没人回答啊,今晚用keil软件调试跑了好久发现问题好像出现在子程序嵌套的if语句中,
如:
y++
if(y>60)
  {z++;y=0}
if (y>70)
    { AD();   }
为了找出问题,之前用for语句改用if来写,上面语句程序可以跑到 if (y>70)但 AD();子程序模块没有执行过。
然后我改为
y++
if(y>60)
{ AD();   }
这时AD();就能执行了,  但是AD();子程序里也有几个if判断语句(新手不会太复杂语句,见谅)
格式如
if() ←
else if()
else if ()
...
但是AD()子程序模块只执行了第一个判断语句(箭头所指)。后面的if均未有执行过,就直接跳到了子程序尾端。
为了做对比,我直接在主程序调用AD();子程序发现里面所有if判断语句都有执行。
所以我觉得可能的问题1.子程序对if语句有使用次数有限用
                    2.其中某个if判断条件的变量溢出
                    3.想不到....求教各位前辈...

使用特权

评论回复
板凳
xianxian314|  楼主 | 2011-9-21 22:16 | 只看该作者
写错了...第2个if判断y是z即if(z>70)

使用特权

评论回复
地板
xianxian314|  楼主 | 2011-9-22 11:35 | 只看该作者
请教各位前辈,下面是程序的全部源代码,比较长看提问的部分程序就OK。
情况一:主程序调用angle_FP(void);时angle_FP(void);里嵌套的moshu_ku();里的所有if均可以执行。
情况二:主程序调用kongjiao();再调用angle_FP(void);时 moshu_ku();的if就只有第一个被执行了。
疑问:
猜想原因是
1,子程序对if语句有限用次数?
2,第二种情况时moshu_ku()子程序里的参数b,s,s1,s2,x有一个或几个无法赋值直接导致最终的x无赋值并默认为0所以只执行第一个if。
3...其他原因求教各位前辈。
原因如果是1,那么有什么解决的办**
原因如果是2,那是什么因数导致某个或某几个参数无法赋值?有什么解决方法?
3诚心求教各位前辈。

#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define V_TH0  0XFF                  
#define V_TL0  0XF6                  
#define V_TMOD 0X01   



void CSH(void);
void L1602_FP();
void angle_FP(void);
void init_sys(void);           
void Delay5Ms(void);
void ADCCSH_init();
void kongshu (void) ;
void kongjiao (void);
void jiaodu (void);





unsigned char bfb;
unsigned char table[16]={0x14,0x88,0x84,0x82,0x48,0x44,0x42,0x28,0x24,
0x22,0x18,0x12,0x11,0x21,0x41,0x81};
unsigned char a[]={"0123456789"} ;
sbit chuansong=P3^0;
sbit begin=P3^1;
sbit SG=P3^2;
sbit duqu=P3^3;
sbit PWM=P3^4;
sbit E=P3^5;
sbit RW=P3^6;  
sbit RS=P3^7;

uchar a2,b,c1,c2,cc,f,gt,h1,h2,h3,h4,i,j,Key_Value,MAX,MIN,s,t,temp,uu,v,yy, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
uint adc_DA,c,x,y ;
idata float q[26];
float s1,s2;


void Delay_1ms(uint i)//1ms延时
{
for(j=0;j<i;j++)
for(v=0;v<=148;v++);
}




void enable(uchar del)
{
P2 = del;
RS = 0;
RW = 0;
E = 0;
Delay_1ms(1);
E = 1;
Delay_1ms(1);
}

void write(uchar del)
{
P2 = del;
RS = 1;
RW = 0;
E = 0;
    Delay_1ms(1);
E = 1;
Delay_1ms(1);
}




void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}

void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign);
}

void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
  if(*p == '\0') break;
  write(*p);
  p++;
}
}

void L1602_FP()
{
        L1602_string(1,1,"Mode:   Level:  ");
         L1602_string(2,1,"Set:   Now:   . ");
}


uchar Keyscan(void)
{

for(j=0; j<4; j++)
{
  P1 = Buffer[j];
  _nop_();
  _nop_();
  _nop_();
  temp = 0x01;                                                                                                                                                                    
  for(i=0; i<4; i++)
  {
   if(!(P1 & temp))
   { uu=i+4*j;
   switch(uu)
          {case 0 : t =12 ; break;
        case 1 : t =13 ; break;
        case 2 : t =14 ; break;
        case 3 : t =15 ;break;
        case 4 : t =11 ; break;
        case 5 : t =9 ; break;
     case 6 : t =6 ;break;
     case 7 : t =3 ; break;
     case 8 : t =0 ; break;
     case 9 :    t =8 ; break;
     case 10: t =5 ; break;
     case 11: t =2 ;break;
     case 12:    t =10 ;break;
     case 13: t =7 ; break;
     case 14: t =4 ;break;
     case 15:    t =1;break;
   
          }
   return(t); }
   temp <<= 1;
       }
}
}
   void adc0809_init()
{
  begin=0;
  Delay_1ms(1);
  begin=1;
  Delay_1ms(1);
  begin=0;
}
uint moshu_ku(void)
{  MAX=0;MIN=0xff;s2=0;
for(s=0;s<26;s++)  
    {adc0809_init();
Delay_1ms(1);  
duqu=1;
       b=P0;
s1=b/510.0;
q[s]=s1;
duqu=0;
}
for(s=0;s<26;s++)
{
if(MAX<q[s])
MAX = q[s];
if(MIN>q[s])
MIN = q[s];
}
for(s=0;s<26;s++)
  {s2=s2+q[s];}
s2=(s2-MAX-MIN)/24 ;
     x=(s2*1000.0);
   
   
    if (x<50) y=                                         19.75*x + 1791.5;
  else if(x<55) y=                                      10*x + 2279;
   else if(x<60) y=                                    9*x + 2334;   
    else if(x<66) y=                                   6.3333*x + 2494;
     else if(x<76) y=                                  6.8*x + 2463.2;
      else if(x<85) y=                                 4.1111*x + 2667.6;  
       else if(x<94) y=                               3.6667*x + 2705.3;
        else if(x<104) y=                              6*x + 2486;  
      else if(x<115) y=                             3.6364*x + 2731.8;   
       else if(x<125) y=                            2.5*x + 2862.5;   
        else if(x<135) y=                           4*x + 2675;   
         else if(x<145) y=                          3.5*x + 2742.5;     
       else if(x<154) y=                         1.6667*x + 3008.3;     
        else if(x<166) y=                        2.6667*x + 2854.3;  
         else if(x<176) y=                       3.8*x + 2666.2;   
          else if(x<186) y=                      2*x + 2983;            
                 else if(x<194) y=                     3.125*x + 2773.8;   
                  else if(x<206) y=                    2.9167*x + 2814.2;
                   else if(x<216) y=                   3.5*x + 2694 ;
                    else if(x<226) y=                  1.9*x + 3039.6;
                     else if(x<235) y=                 2.3333*x + 2941.7;  
                      else if(x<244) y=                3.3333*x + 2706.7;   
                       else if(x<254) y=               3*x + 2788;   
                     else if(x<264) y=              2.7*x + 2864.2;   
                      else if(x<270) y=             3.6667*x + 2609;
                 else if(x<278) y=            4.375*x - 1181.3;     
                  else if(x<286) y=           2.375*x - 625.25;     
                else if(x<295) y=          2.5556*x - 676.89;     
              else if(x<303) y=         2.5*x - 660.5;
         else if(x<313) y=           2.4*x - 630.2 ;     
                      else if(x<319) y=         4*x - 1131  ;     
                    else if(x<323) y=          2.5*x - 652.5;     
                  else if(x<331) y=        3.125*x - 854.38 ;
       else if(x<337) y=          2.3333*x - 592.33  ;     
                          else if(x<345) y=           3.25*x - 901.25 ;     
                        else if(x<354) y=          2.2222*x - 546.67;     
                      else if(x<360) y=         3.3333*x - 940;
           else if(x<373) y=         2.0769*x - 487.69   ;     
                              else if(x<385) y=          2.75*x - 738.75 ;     
                            else if(x<389) y=         3.5*x - 1027.5 ;     
                          else if(x<403) y=        4*x - 1222;
               else if(x<415) y=          3.9167*x - 1188.4  ;     
                                  else if(x<436) y=           2.8571*x - 748.71;     
                                else if(x<446) y=         7.3*x - 2685.8 ;     
                              else if(x<453) y=         4.2857*x - 1341.4;
                   else if(x<463) y=          6.6667*x - 2420    ;     
                                      else if(x<473) y=         7.2727*x - 2700  ;     
                                    else if(x<477) y=         8.5*x - 3280.5 ;     
                                  else if(x<479) y=        25.5*x - 11390 ;     
                                      else           y=        75*x - 35100;

  return y;
}  
/******************************************************
**/

void angle_FP(void)
{
   adc_DA=moshu_ku();
         h1=adc_DA/1000;                  

      h2=adc_DA%1000/100;               

      h3=adc_DA%100/10;      
   h4=adc_DA%10;
  L1602_char(2,12,a[h1]);                                
     L1602_char(2,13,a[h2]);
     L1602_char(2,14,a[h3]);
     L1602_char(2,16,a[h4]);
    L1602_char(2,17,' ');
   Delay_1ms(1) ;

}
void init_sys(void)            
{
   
  TMOD=V_TMOD;
  TH0=V_TH0;
  TL0=V_TL0;
  TR0=1;
  ET0=1;
  EA=1;
}




void timer0(void) interrupt 1 using 2
{
static uchar cs=0;                  
TH0=V_TH0;                                   
TL0=V_TL0;
cs++;
if (cs>=100) cs=0;

if (cs<=bfb)      
  PWM=0;
else
  PWM=1;
}
void CSH(void)
{
  IE = 0x00;
  P0 = 0x00;
  P1 = 0x00;
  P2 = 0x00;
  P3 = 0x00;
}  

void kongshu (void)
{
CSH();
bfb=55;
init_sys();         
  while(1)
  {     
      
     angle_FP();        
   
   
  cc= 100-bfb;
     c1=cc/10;
   c2=cc%10;
   Delay_1ms(5) ;
          L1602_char(1,15,a[c1]);
   Delay_1ms(5) ;
      L1602_char(1,16,a[c2]);
   Delay_1ms(5) ;      
      P1 = 0xf0;
  if(P1 != 0xf0)
    {
   Delay_1ms(5);
   if(P1 != 0xf0)
   {   Key_Value = Keyscan();


                if(Key_Value==10)    //退回主程序//
               {  PWM=0;
                   L1602_FP();
                goto fanhui1;
                }
        if (Key_Value==2) //如果按了+键,增加占空比
      {

         bfb=bfb-8;
      
              }
           if (Key_Value==1) //如果按了+键,增加占空比
      {

         bfb=bfb-1;
      
              }
            if (Key_Value==3) //如果按了+键,增加占空比
      {

         bfb=bfb-15;
      
              }
            if (Key_Value==7) //如果按了+键,增加占空比
      {

         bfb=bfb+1;
      
              }
            if (Key_Value==9) //如果按了+键,增加占空比
      {

         bfb=bfb+15;
      
              }

       if (Key_Value==8) //如果按了-键,减少占空比
      {

        bfb=bfb+8;
      
        
      } }}
   if (bfb>95) bfb=98;
      if (bfb<4) bfb=2;

  }

fanhui1:   
PWM=0;
}
void main(void)
{ f=0;yy=0;  
   PWM=0;
L1602_init();
L1602_FP();
while(1)
{  
    angle_FP();      
             P1 = 0xf0;
      if(P1 != 0xf0)      
      {
   Delay_1ms(15);
       if(P1 != 0xf0)
        {      
    Key_Value = Keyscan();  
        if(Key_Value==16)
                   {kongshu();}

                  }
        }
     }

  }

使用特权

评论回复
5
afei9527| | 2011-9-22 12:12 | 只看该作者
:Q  谁用空看这些了

使用特权

评论回复
6
xianxian314|  楼主 | 2011-9-22 17:53 | 只看该作者
:L,我也不想啊,我很努力的在找原因了,忙了半天现在再把问题的范围缩小,现在再来请教了。长话短说
我直接问了  各位前辈直接看问题就可以了,源程序那...闲得蛋疼的可以看看:lol
情况一:主程序调用angle_FP(void);时angle_FP(void);里嵌套的moshu_ku();可以读取P0口数值。
情况二:主程序调用kongjiao();再调用angle_FP(void);时 moshu_ku();不能读取P0口数值。
问什么多了一层调用就读取P0数值呢?

使用特权

评论回复
7
xianxian314|  楼主 | 2011-9-22 18:06 | 只看该作者
再看表达有点模糊,修正下
第2种情况
void main
{
kongjiao();此子程序内调用angle_FP(void);angle_FP(void);再调用moshu_ku();
}

使用特权

评论回复
8
tuzihog| | 2011-9-22 22:17 | 只看该作者
估计楼主还没找到问题
顶一下楼主,**,**,再**一下就好了

使用特权

评论回复
9
xianxian314|  楼主 | 2011-9-22 23:47 | 只看该作者
:L刚刚找到问题所在
原因是kongjiao();里有一个所有I/O以及IE的初始化,把所有I/O及IE都赋了0x00值,导致后来调用的angle_FP(void);里再调用的moshu_ku();读取的P0口也是0x00,猜想可能是硬件反应时间比软件滞后了
.屏蔽掉这个初始化后就能读取正常P0口.

其实上面贴出来的源程序是9月初大学生电子竞赛的f题,那块简单得蛋疼的帆板,可惜我还是做不出来。整合完上面那些程序时间就差不多了,(同组的2个队员一个师弟神马也不会,干坐4天3夜 ——!!另一个同届还好,会焊电路,兼写了一篇让人觉得他极其菊痒的设计报告,其他都交给我做了...)最后还卡在了那个坑爹的初始化里...
最终还是败在编程这块..
路漫漫其修远兮,吾将上下而求索。

使用特权

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

本版积分规则

0

主题

14

帖子

1

粉丝