lyg407 发表于 2012-3-30 10:38:14

STC12C5A60S2 自带AD程序 自写的 C H 文件,和大家分享下。

STC12C5A60S2 自带AD 程序。 自己根据官方改编的。写了一个自己喜欢的风格。 当然你也可以更改, 这个程序已经试验通过的哦。

C 文件





/*-------------------------------------------------------------------------
C文件函数调用说明:

在main 加入头文件       #include"STC12C5A60S2.h"//加载AD 头文件
在main 主函数应初始化   Init_ADC();//初始化STC12C5A60S2 内部AD

使用示例:
uint ad_result;   //定义一个 读取ad转换结果
ad_result=ADC_N(5,50);        // P1^5 采集50次AD结果

需要注意问题:
       
实际电压值 :AD_Result=AD_Result*5/256;          // 计算实际电压值

--------------------------------------------------------------------------*/


#include"STC12C5A60S2.h"//加载AD 头文件

/*----------------------------
Software Delay_ADC function
----------------------------*/
void Delay_ADC(uint n)
{
    uint x;

    while (n--)
    {
      x = 5000;
      while (x--);
    }
}


/*----------------------------
Get ADC result
----------------------------*/
uchar GetADCResult(uchar ch)           //有参数输入通道几0-7   P1^0----P1^7
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
        //打开电源   设定转换速度   0-7 路任意一路        启动AD转换
          
    _nop_();                        //Must wait before inquiry   //延时4个时钟重要!
    _nop_();
    _nop_();
    _nop_();

    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag   //等待AD转换结束标志位置1
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC           //清除 AD 转换结束标志位

    return ADC_RES;               //Return ADC result   //返回 ADC 数据
}


/*----------------------------
Initial ADC sfr
//P1^0口为AD 输入
----------------------------*/
void Init_ADC()
{                        //0000 0000
    P1ASF = 0x60;    //Open 8 channels ADC function//P1^0 置为 模拟功能        8路都可以作为AD输入
    ADC_RES = 0;         //Clear previous result       // 清除AD转换结果寄存器之前的转换数据
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay_ADC(2);            //ADC power-on and Delay_ADC   //初次打开ADC电源 要等待
}

/*------------函数说明--------------------------------
函数功能:读取 计算平均值后的AD 结果
函数参数:        chn:0-7AD 通道   N :采集多少次AD 计算平均值
返回值: ad值0-255   AD_Result=AD_Result*5/256;          // 计算实际电压值

程序示例:
uint ad_result;   //定义一个 读取ad转换结果
ad_result=ADC_N(5,50);        // P1^5 采集50次AD结果
------------------------------------------------------*/

uchar ADC_N(uchar chn,uchar N)           //采集N次然后取平均值   通道几 采集次数
{
   unsigned char i;
   unsigned int adc_tem=0;

        for(i=N;i>0;i--)
        {
          adc_tem+=GetADCResult(chn);
        }
        adc_tem/=N;       //adc_tem=adc_tem/N赋值符合运算

    returnadc_tem;   //返回         
}




H 文件



/******************************************************************
ADC头文件:

//
函数调用说明:
在main 加入头文件       #include"STC12C5A60S2.h"//加载AD 头文件
在main 主函数应初始化   Init_ADC();                //Init ADC sfr

********************************************************************/

#ifndef __STC12C5A60S2_H__
#define __STC12C5A60S2_H__ //防重复包含语句

#include <reg51.h>
#include <intrins.h>


#define uchar unsigned char
#define uint unsigned int

/*Declare SFR associated with the ADC */
sfr ADC_CONTR   =   0xBC;         //ADC control register       声明ADC 控制寄存器
sfr ADC_RES   =   0xBD;         //ADC high 8-bit result registerADC 转换结果寄存器 高位
sfr ADC_LOW2    =   0xBE;         //ADC low 2-bit result register          ADC 转换结果寄存器 低位
sfr P1ASF       =   0x9D;         //P1 secondary function control registerP1模拟功能控制寄存器

sfrAUXR    = 0x8e;


/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER   0x80            //ADC power control bit
#define ADC_FLAG    0x10            //ADC complete flag
#define ADC_START   0x08            //ADC start control bit
#define ADC_SPEEDLL 0x00            //420 clocks
#define ADC_SPEEDL0x20            //280 clocks
#define ADC_SPEEDH0x40            //140 clocks
#define ADC_SPEEDHH 0x60            //70 clocks

void Delay_ADC(uint n);                           //延时
void Init_ADC();                                   //初始化
uchar GetADCResult(uchar ch);          //有参数输入通道几0-7   P1^0----P1^7
uchar ADC_N(uchar chn,uchar N);          //采集N次然后取平均值   通道几 采集次数


#endif   //防重复包含语句 结束

ym7205 发表于 2012-5-29 14:16:46

学习了,,定

lhcyy 发表于 2012-5-29 14:37:59

跟官方给的12c5a60s2里面的adc查询方式测试程序基本一样

莫名右走 发表于 2012-5-29 15:49:41

mark一下

book11 发表于 2012-9-22 14:33:20

你这个程序是几位的呀,8位还是10位?

ddcchh 发表于 2012-10-2 14:55:24

STC12C5A60S2 自带AD程序--------------好的参考资料!

LvFaBin 发表于 2012-11-7 15:35:49

这程序是8位的...哪位大哥有十位的不

Altium12A 发表于 2012-12-17 16:31:07

很OK哦,{:smile:}

wjzhongshi 发表于 2013-1-1 11:21:04

进来学习一下

jetli 发表于 2013-1-1 12:13:08

{:sweat:} 无 Vref 的mcu,用起来总是感觉受影响。

别提用一个adc接TL431这方法。这样毕竟少了一路另外增加了软件开销

bbssilverkey 发表于 2013-1-1 17:01:03

给个10位的吧,今天才看到这个

xzh7770 发表于 2013-4-27 20:13:41

正在学习使用中。

renwocai 发表于 2013-4-27 21:58:33

10位的
加上sfr ADC_LOW2    =   0xBE;      

这个作为AD结果的后两位,再用一定的算法就可以了,如:ADC_RES<<8+ADC_LOW2.

a20084666 发表于 2013-8-19 13:36:41

不错的支持了 嘿嘿

快6乐小生 发表于 2013-8-22 11:20:16

不错,谢谢楼主!!!

小小单片机 发表于 2013-8-22 15:28:07

十位的是楼上的所说的那样吗??

龙的世界aiq 发表于 2013-8-30 23:51:01

谢谢分享                  

sxl1990 发表于 2013-9-5 11:31:20

楼主,如果要改成10位的怎么改啊,程序加到什么地方啊

sxl1990 发表于 2013-9-5 11:39:20

renwocai 发表于 2013-4-27 21:58 static/image/common/back.gif
10位的
加上sfr ADC_LOW2    =   0xBE;      



大神你好,这个改成10位的,具体要修改什么地方啊

zndz410 发表于 2013-9-5 17:29:31

正在学习使用中。

ruan18278816371 发表于 2013-9-23 23:00:50

正打算学习这款单片机,不错!

eva015401 发表于 2013-9-24 08:30:02

mark stc10bitadc

颜靖峰 发表于 2013-10-8 13:25:30

可以用来测电池电压吗??????

mahengyu 发表于 2013-10-8 14:13:04

这个单片机很好用,官方给了很多程序,直接拿来用就行

znxsjay 发表于 2013-10-18 17:39:01

正好用到这个,拿来试试看管不管用。。

dzahz666 发表于 2013-10-18 17:42:37

这个单片机很好用,官方给了很多程序,直接拿来用就行

TrulyZhu 发表于 2013-10-18 17:46:22

谢谢分享

aressos 发表于 2013-10-26 23:34:30

明天下载来试试

TrulyZhu 发表于 2013-11-9 01:39:55

注释详细,谢谢分享

TrulyZhu 发表于 2013-11-9 01:40:55

注释详细,谢谢分享

yayagepei 发表于 2014-2-18 11:06:53

标记了,学习学习

hnzlf 发表于 2014-3-11 14:55:17

标记,学习一下。

Smartist 发表于 2014-3-11 18:43:58

感谢分享,收下啦,嘿嘿

hamipeter 发表于 2014-3-11 20:40:09

顶一下!!
页: [1]
查看完整版本: STC12C5A60S2 自带AD程序 自写的 C H 文件,和大家分享下。