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 //防重复包含语句 结束 学习了,,定 跟官方给的12c5a60s2里面的adc查询方式测试程序基本一样 mark一下 你这个程序是几位的呀,8位还是10位? STC12C5A60S2 自带AD程序--------------好的参考资料! 这程序是8位的...哪位大哥有十位的不 很OK哦,{:smile:}
进来学习一下 {:sweat:} 无 Vref 的mcu,用起来总是感觉受影响。
别提用一个adc接TL431这方法。这样毕竟少了一路另外增加了软件开销 给个10位的吧,今天才看到这个 正在学习使用中。 10位的
加上sfr ADC_LOW2 = 0xBE;
这个作为AD结果的后两位,再用一定的算法就可以了,如:ADC_RES<<8+ADC_LOW2. 不错的支持了 嘿嘿 不错,谢谢楼主!!! 十位的是楼上的所说的那样吗?? 谢谢分享 楼主,如果要改成10位的怎么改啊,程序加到什么地方啊
renwocai 发表于 2013-4-27 21:58 static/image/common/back.gif
10位的
加上sfr ADC_LOW2 = 0xBE;
大神你好,这个改成10位的,具体要修改什么地方啊
正在学习使用中。 正打算学习这款单片机,不错!
mark stc10bitadc 可以用来测电池电压吗?????? 这个单片机很好用,官方给了很多程序,直接拿来用就行 正好用到这个,拿来试试看管不管用。。 这个单片机很好用,官方给了很多程序,直接拿来用就行 谢谢分享 明天下载来试试 注释详细,谢谢分享 注释详细,谢谢分享 标记了,学习学习 标记,学习一下。 感谢分享,收下啦,嘿嘿 顶一下!!
页:
[1]