stm8s adc 的一个例程源码 ?OO !M
)"P.n-aF
/******************** (C) COPYRIGHT 风驰iCreate嵌入式开发工作室 *************************** 1Ogtzf
* 文件名 :adc.c m^0*k|9+G
* 描述 :AD配置函数库 -jTK3&5
* 实验平台:iCreate STM8开发板 -xH3}K%
* 寄存器版本 :V2.0.0 3e;K5qSeo/
* 作者 :ling_guansheng QQ:779814207 8BS$6Pa
* 博客 : r 3T #Nv
* 修改时间 :2012-6-16 MS|1Q@S9
E9 #o0Di
* iCreate STM8开发板硬件连接 _cfAJ)8=
STM8的PF0口(也就是ADC2的AIN10)接的是光敏或热敏电阻 2qj0iRH#N<
0B`rTLwB
****************************************************************************************/ sh<JB`^$(?
HwMe^e;
=o"sBVj
#include "adc.h" y(K:,CI
#include "uart.h" \gZjq]3
5=MM^$QG
2)^T[zHe
/************************************************************************** h7]>b'H
* 函数名:ADC_conf Tkf4`Gxd
* 描述 :ADC模块初始化 q*J-ii
* 输入 :无 79lG~BGE
* <l9qhqHv&
* 输出 :无 b{e|~v6&
* 返回 :无 vs.}Bou]
* 调用 :外部调用
{K=[Fu=
*************************************************************************/ s.}:!fBk
void ADC_conf() +qF,XJ2
{ E[_-s
ADC_CR1 = (0<<4)|(1<<1)|(0<<0); //ADC时钟输入频率为16MHz 这里设置分频系数为2 连续转换模式 先禁止ADC转换 I1Gk^wO
ADC_CR2 = (1<<3)|(0<<1); //设置数据右对齐 禁止扫描模式 lFM'F [-?-
b(g?X
(&
ADC_CSR = (0<<5)|(0xa<<0); //不用外部触发 禁止转换结束中断 设置转换通道为AIN10 j\@|oW0
ADC_TDRH = 4; //禁止AIN10施密特触发器功能 p@xK`=Urb
ADC_CR1 |= 1; //第一次写1是从低功耗模式唤醒 Tq.%_/@M<
ADC_CR1 |= 1; //在这一位是1的情况下再次写1启动ADC转换 x(88Y7o.t
} I03
45Hc
laFF/g;sRC
/************************************************************************** QW%BKF!
* 函数名:Send_ADC_Value 3PZwz^oRh9
* 描述 :ADC转换结果显示函数 m`ab5<%Gn
* 输入 :AD_Value--ADC转换结果值 .l&<-l;UQ
* Ne,u\q3f
* 输出 :无 p>]2o\["
* 返回 :无 W>7 o
ec
* 调用 :内部调用 ~dqEUu!C
*************************************************************************/ %8GY`T:^
static void Send_ADC_Value(u16 AD_Value) 6JL:p{RLi
{ 3UX} )mW
UART1_SendByte(AD_Value/1000+0x30); e_pyjaY!s
UART1_SendByte(AD_Value%1000/100+0x30); GwVSRI:[N
UART1_SendByte(AD_Value%1000%100/10+0x30); SA$1rqU=
UART1_SendByte(AD_Value%1000%100%10+0x30); 'xp&)gL
} |[lM2
e6?h4}[+*
/************************************************************************** !=c&U.B
* 函数名:ADC_GetConversionValue gobqS+c
* 描述 :获取ADC转换结果 M%2F7 FY
* 输入 :无 3F0:v,+;
* ^E8eW
* 输出 :无 A,qWg0A]nt
* 返回 :无 FLekyJmw~
* 调用 :内部调用
MoP0qNk
*************************************************************************/ rx#\Dc}
uint16_t ADC_GetConversionValue(void) /\9X0a2h|E
{ VXAgp6
uint16_t value,temph; /TgG^|
uint8_t templ; // 定义templ存储低8位数据 temph存储高8位数据 !>+Na~eN
9m
fYB
while(!(ADC_CSR & 0x80)); //等待转换完成 WNPdy m
templ = ADC_DRL; ou@ P#:<B
temph = ADC_DRH; //读取ADC转换 在左对齐和右对齐模式下 读取数据的顺序不同 参考STM8寄存器.PDFP371 M-df Gk
UI 7JMeV
value = (unsigned int)(templ | (temph << 8)); //注意是10位的转换精度 value、temph应为unsigned int 变量 DjjG?(1
return value; GZ];U]_
}