OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6070|回复: 9

STC12C5A60S2 AD采集 有个函数一定要我定义一个形参 然而这个形参用不到 不然结果就bu'chu'la

[复制链接]

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-8-19
在线时间
24 小时
发表于 2017-7-13 16:28:17 | 显示全部楼层 |阅读模式
//****************************************STC12C5A60S2 AD转换***********************************************//

#include"stc12c5a.h" //头文件在STC公司主页上下载
#include"stdio.h"
#include"intrins.h"

//------------------------------------------------------------------------------

void AD_init();
void serial_init();
void delay(unsigned int a);
float AD_work();
unsigned int AD_get();

//------------------------------------------------------------------------------

void main()
{
        AD_init();    //A/D转换初始化
        serial_init();   //串口初始化
        while(1)
        {
         
                 printf("voltage is %0.3f\n",AD_work());
                 delay(1000); //延时约1s
          
        }
}
//------------------------------------------------------------------------------
unsigned int AD_get()
{
        ADC_CONTR=0x88;    //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
        _nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
        while(!(ADC_CONTR&0x10));    //等待转换完成
        ADC_CONTR&=0xe7;      //关闭AD转换,ADC_FLAG位由软件清0

        return(ADC_RES*4+ADC_RESL);   //返回AD转换完成的10位数据(16进制)
}
//------------------------------------------------------------------------------




        //为什么一定要定义这个没用到的形参       
float AD_work( unsigned char c)                //  unsigned char c
{
       
       
       
       
       
//----------------------------------------------------------------       
       
       
       
       
        float AD_val;     //定义处理后的数值AD_val为浮点数
        char i;

        for(i=0;i<10;i++)
        AD_val  += AD_get(); //转换100次求平均值(提高精度)
        AD_val/=10;

        AD_val=(AD_val*5)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值
        return AD_val;
}


//------------------------------------------------------------------------------
void delay(unsigned int a) //延时约1ms
{
        unsigned int i;
        while (--a!=0)
        for(i=600;i>0;i--);   //1T单片机i=600,若是12T单片机i=125
}
//------------------------------------------------------------------------------
void serial_init()
{
        TMOD=0x20;
        SCON=0x50; //串口方式1,允许接收
        TH1=0xfd;
        TL1=0xfd; //设置9600波特率
        TR1=1;
        TI=1;    //使用printf函数前须先将发送标志位TI置1
}
//------------------------------------------------------------------------------
void AD_init()
{
        P1ASF=0x01; //P1.0口全部作为模拟功能AD使用
        ADC_RES=0;   //清零转换结果寄存器高8位
        ADC_RESL=0; //清零转换结果寄存器低2位
        ADC_CONTR=0x80;//开启AD电源
        delay(2);   //等待1ms,让AD电源稳定
       
}


QQ图片20170713161706.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-8-19
在线时间
24 小时
 楼主| 发表于 2017-7-13 16:29:17 | 显示全部楼层
希望各位大神 帮个忙   
回复 支持 反对

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
发表于 2017-7-13 16:42:53 | 显示全部楼层
应该可以把。。你要改的话要把所有的都改掉。。。
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-8-19
在线时间
24 小时
 楼主| 发表于 2017-7-13 16:45:58 | 显示全部楼层
已经试了很久了  , 从来没见过这个情况  ,能改的都改了 , 只要那个形参不是uchar  或者 char 、 float  ,括号里定义什么都是出错,void也错
回复 支持 反对

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2013-6-5
在线时间
142 小时
发表于 2017-7-13 22:17:27 | 显示全部楼层
因为函数括号里不写,是默认有参数的,没参数要写成(void)你前面声明的时候写成(),表明你函数是有参数的。
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-8-19
在线时间
24 小时
 楼主| 发表于 2017-7-14 08:10:23 | 显示全部楼层
还是不行,我把声明和函数实体都写一样的也会出现这种情况,参数必须是uchar  char  float    ,才没有问题,
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-8-19
在线时间
24 小时
 楼主| 发表于 2017-7-14 08:29:01 | 显示全部楼层
解决了  :
  AD_work()里的
        float AD_val = 0.0 ;     //定义处理后的数值AD_val为浮点数
这个变量一定要初始化   一定要初始化   一定要初始化   
以前遇到过一次是函数里的数组没初始化,出现莫名奇妙的问题
回复 支持 反对

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2013-6-5
在线时间
142 小时
发表于 2017-7-19 17:19:40 | 显示全部楼层
AD_val  += AD_get();
当然要初始话了,否则你这个谁知道加之前是什么?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-5-13
在线时间
7 小时
发表于 2019-5-13 14:07:34 来自手机 | 显示全部楼层
程序不对啊,都是乱码
回复 支持 反对

使用道具 举报

0

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2019-5-4
在线时间
42 小时
发表于 2019-5-17 14:54:12 | 显示全部楼层
关于变量定义后一定要初始化, 这个问题一再说明,很多同学就是不重视
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-1 07:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表