请教各位前辈,下面是程序的全部源代码,比较长看提问的部分程序就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();}
}
}
}
} |