论坛风格切换切换到宽版
  • 4524阅读
  • 13回复

c菜鸟之带返回值函数 [复制链接]

上一主题 下一主题
离线XLDZZ
 
发帖
443
只看楼主 倒序阅读 0楼 发表于: 2010-03-16
程序如下

在没有使用unit_val();函数时,编译可通过。
把unit_val改成void型后也可以通过。
百思不得其解,所以来这求救来了。



#include<pic.h>
__config(0x3b32);
#define uchar unsigned char
#define uint unsigned int
#define nop() asm("nop")
unit ad_val();
void init();
void delay(uint x);
const uchar table[]={0xd7,0x11,0xcd,0x5d,0x1b,0x5e,0xde,0x15,0xdf,0x5f};
void dsp(uchar num1,uchar num2,uchar num3);




void main()
{
init();

while(1)
  {  
    uint lednum;
    uchar a1,a2,a3;
    lednum=ad_val();
    a1=lednum/1000;
    a2=lednum%1000/100;
    a3=lednum%100/10;
  }            

}  

void init()
{
trisa=0x01;
trisb=0;
trise=0;
trisd=0;
trisc=0xff;
cmcon=0x07;//关比较器
adcon0=0x81;//1/64,ch0,power on
adcon1=0xce;//数据右对齐an0为模拟输入。
}



unit ad_val()
{
unit val;
adgo=1;
while(1);
val=adresh;
val=val<<8|adresl;
return(val);
}
离线BG2BHC
发帖
5337
只看该作者 1楼 发表于: 2010-03-16
return(val);改成return val;试试?
离线anybody-hf
发帖
1083
只看该作者 2楼 发表于: 2010-03-16
你把void去掉编译可能都能通过 ,但是返回的参数可能就不是无符号 整数了。前面的unint我觉得是对数据格式的约定
离线XLDZZ
发帖
443
只看该作者 3楼 发表于: 2010-03-16
粘贴复制简单但是也是容易造成低级错误的

前面采用#define uint unsigned int定义为uint

后来我用的是unit和前面不一样所以错了,改回来就过了。
离线BG4RFF
发帖
1581
只看该作者 4楼 发表于: 2010-03-17
c 语言区分大小写的,而且呵呵,自己也发现了,不是c菜鸟,是粗心鬼
离线bellstudio
发帖
2820
只看该作者 5楼 发表于: 2010-03-17
可不是大小写的问题,是 uint和unit的区别
楼上也是个粗心的家伙:p
离线BG4RFF
发帖
1581
只看该作者 6楼 发表于: 2010-03-17
'
可不是大小写的问题,是 uint和unit的区别
楼上也是个粗心的家伙:p
'
“而且呵呵”侬没看明白???
离线BA5RW
发帖
48255
只看该作者 7楼 发表于: 2010-03-18
'
“而且呵呵”侬没看明白???
'
真正的粗心 :d :d
离线bellstudio
发帖
2820
只看该作者 8楼 发表于: 2010-03-18
囧rz...
离线XLDZZ
发帖
443
只看该作者 9楼 发表于: 2010-03-18
粗心也好,细心也罢。多不是关键。

程序修改ok,我用这个做了个量程为0-3.3的数字电压表。程序如下:

接下来我想用这个来做servo,想用pid来做,但是机床上用的是频率作为输入信号。

现在看来只能做fid了。

不知道有谁搞过pid算法,可以交流交流。

#include<pic.h>
__config(0x3b32);
#define uchar unsigned char
#define uint unsigned int
#define nop() asm("nop")
uint ad_val();
void init();
void delay(uint x);
const uchar table[]={0xd7,0x12,0xcb,0x5b,0x1e,0x5d,0xdd,0x13,0xdf,0x5f};
void dsp(uchar num1,uchar num2,uchar num3);
void sc();



void main()
{
init();
while(1)
  {  
   
   
    uint lednum;
    uchar bai,shi,ge;
 
    lednum=ad_val();
    bai=lednum/1000;
    shi=lednum%1000/100;
    ge=lednum%100/10;
    dsp(bai,shi,ge);


 
 
  }            

}  

void init()
{
trisa=0x01;
trisb=0;
trise=0;
trisd=0;
trisc=0xff;
porte=0;
portd=0;
portb=0;
porta=0;
porte=0x06;
delay(2);
porte=0;
cmcon=0x07;//关比较器
adcon0=0x81;//1/64,ch0,power on
adcon1=0xce;//数据右对齐an0为模拟输入。
}

uint ad_val()
{
uint val;
float valf;
adgo=1;
while(adgo);
val=adresh;
val=val<<8|adresl;
valf=val/1023.0*3.3;
val=valf*1000;

return (val);
}

void dsp(uchar num1,uchar num2,uchar num3)
{

    portb=table[num1];//显示第一个数码管
    portd=0x04;                                                                                      
    sc();    
    delay(2);  
 
    portb=table[num2];//显示第二个数码管
    portd=0x02;
    sc();
    delay(2);
   
    portb=table[num3];//显示第三个数码管
    portd=0x01;
    sc();
    delay(2);
   
}

void sc()
{
  porte=0;
  delay(2);
  porte=0x06;
  delay(2);
  porte=0;
  delay(2);        
}

void delay(uint x)
{
     uint a,b;
     for(a=x;a>0;a--)
           for(b=110;b>0;b--);
}
离线BG4RFF
发帖
1581
只看该作者 10楼 发表于: 2010-03-18
我只知道pid参数的整定非常难,其他的控制算法可以试试
离线xiongjunfeng
发帖
1220
只看该作者 11楼 发表于: 2010-03-19
我在用c时一般不用uint,而用unsigned int;这样在c编辑窗口中有颜色提示。不会错
离线XLDZZ
发帖
443
只看该作者 12楼 发表于: 2010-03-20
今天我去买16f877a,结果?????
奸商说,他哪的是美国产的要36一片?????

难道以前用的13一片的多不是正品????

郁闷中!
离线XLDZZ
发帖
443
只看该作者 13楼 发表于: 2010-03-21
以下程序本意是将ad采得的20次数据相加后再除以20,得一平均值。
使数据更加可靠,但是最终的结果是:数据比正常值小了20倍(好像只取得了
一次数据就结束循环了)
求平均数是在for中实现的如下
for(adcunt=19;adcunt>0;adcunt--)
      {  
        adval=ad_val();      
        adtemp2=adtemp+adval;
      }
不知道是那里出了问题???
请各位指点指点本菜鸟。

#include<pic.h>
__config(0x3b32);
#define uchar unsigned char
#define uint unsigned int
uint ad_val();
void init();
void delay(uint x);
const uchar table[]={0xd7,0x12,0xcb,0x5b,0x1e,0x5d,0xdd,0x13,0xdf,0x5f};
void dsp(uchar num1,uchar num2,uchar num3);
void sc();
uint lednum;
uint adval;
uint adtemp;
uint adtemp2;
uchar adcunt;
uchar bai,shi,ge;
float ledf;

void main()
{
init();
adtemp=0;
adtemp2=0;
while(1)
  {  
 
    for(adcunt=19;adcunt>0;adcunt--)
      {  
        adval=ad_val();      
        adtemp2=adtemp+adval;
      }
                 
    ledf=adtemp2/20.0/1023.0*3.3;
    lednum=ledf*1000;
       
    bai=lednum/1000;
    shi=lednum%1000/100;
    ge=lednum%100/10;
    dsp(bai,shi,ge);
   
    }  
  }            



void init()
{
trisa=0x01;
trisb=0;
trise=0;
trisd=0;
trisc=0xff;
porte=0;
portd=0;
portb=0;
porta=0;
porte=0x06;
delay(2);
porte=0;
cmcon=0x07;//关比较器
adcon0=0x81;//1/64,ch0,power on
adcon1=0xce;//数据右对齐an0为模拟输入。
}

uint ad_val()
{
uint val;
adgo=1;
while(adgo);
val=adresh;
val=val<<8|adresl;    
return (val);
}

void dsp(uchar num1,uchar num2,uchar num3)
{

    portb=table[num1];//显示第一个数码管
    portd=0x04;                                                                                      
    sc();    
    delay(2);  
 
    portb=table[num2];//显示第二个数码管
    portd=0x02;
    sc();
    delay(2);
   
    portb=table[num3];//显示第三个数码管
    portd=0x01;
    sc();
    delay(2);
   
}

void sc()
{
  porte=0;
  delay(2);
  porte=0x06;
  delay(2);
  porte=0;
  delay(2);        
}

void delay(uint x)
{
     uint a,b;
     for(a=x;a>0;a--)
           for(b=110;b>0;b--);
}