/** * ************************************************************************************ * 上海芯圣电子股份有限公司 * www.holychip.cn * ************************************************************************************ * @Examle Version V1.0.4.0 * [url=home.php?mod=space&uid=1102]@demo[/url] Version V1.0.4.0 * [url=home.php?mod=space&uid=212281]@date[/url] 2019.07.22 * ************************************************************************************ * 模块性能介绍 * 1、MCU提供10/12位ADC检测,拥有11路外部输入通道以及2路内部输入通道 * 2、参考电压可选择内部Vref(VDD、2V、3V、4V)以及外部Vref,转换后的数据可选择数据位 * 数和对齐方向 * ************************************************************************************ * 应用注意事项 * 1、在掉电模式下,ADCEN强制为0,ADC失能。 * 2、为保证ADC转换精度,建议ADC转换时钟频率在2MHz及2MHz以下。 * 3、内部参考电压选择2V时,VDD工作电压须高于2.7V。内部参考电压选择3V/4V时,VDD工作电 * 压须高于内部参考电压0.5V以上。 * 4、启动ADC转换时,需要关闭ADC省电唤醒功能。使能ADC模块或者切换通道后,为保证精度建 * 议延时20us再启动转换。 * 5、启动转换时,ADCIF需要先软件清0,ADCIF位为1时,置ADCST不能启动新的转换。在转换过 * 程中,若ADCST位软件清0将终止转换。 * 6、在进行内部通道选择时,外部通道选择XCHS[3:0]应配置为1111,否则可能会造成内部通道 * 和外部通道同时打开的情况。 * 7、芯片进入掉电模式时将ADCC0中的INREF_S寄存器设置为非VDD电压,可以进一步降低电流。 * ************************************************************************************ * 客户服务 * 感谢您使用我们的单片机,若发现错误或对函数的使用存在疑问。请添加上海芯圣电子官方QQ群 * ****************************技术支持群:201030494*********************************** * ************************************************************************************ **/ #define ALLOCATE_EXTERN #include "HC89S003F4.h" void Delay_2us(unsigned int fui_i); //延时函数 unsigned int gui_AdcValue_a[2] = {0x00}; //用于存放ADC的值 unsigned char guc_AdcChannel_a[2] = {0x01,0x02}; //ADC通道号 unsigned char guc_Count = 0; //切换通达计数 /*************************************************************************************** * @实现效果 对AN1以及AN2进行ADC转换 ***************************************************************************************/ void main() { /************************************系统初始化****************************************/ WDTCCR = 0x00; //关闭看门狗 //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程 CLKSWR = 0x51; //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz CLKDIV = 0x01; //Fosc 1分频得到Fcpu,Fcpu=16MHz /**********************************相关配置初始化**************************************/ P0M0 = P0M0&0xF0|0x08; //P00设置为推挽输出 P1M0 = P1M0&0xF0|0x08; //P10设置为推挽输出 /************************************ADC初始化*****************************************/ P0M0 = P0M0&0x0F|0x30; //P01设置为模拟输入 P0M1 = P0M1&0xF0|0x03; //P02设置为模拟输入 ADCC0 = 0x80; //打开ADC转换电源 Delay_2us(10); //延时20us,确保ADC系统稳定 ADCC1 = 0x00; //选择外部通道0 ADCC2 = 0x4D; //转换结果12位数据,数据右对齐,ADC时钟16分频 IE1 |= 0x20; //打开ADC中断 EA = 1; //打开总中断 ADCC0 &=~ 0x20; //清除ADC中断标志位 ADCC0 |= 0x40; //启动ADC转换 while(1) { if(gui_AdcValue_a[0] <= 0x10) { P0_0 = 1; } else { P0_0 = 0; } if(gui_AdcValue_a[1] <= 0x10) { P1_0 = 1; } else { P1_0 = 0; } } } /*************************************************************************************** * @说明 ADC中断服务函数 * @参数 无 * @返回值 无 * @注 无 ***************************************************************************************/ void ADC_Rpt() interrupt ADC_VECTOR { ADCC0 &=~ 0x20; //清除ADC中断标志位 gui_AdcValue_a[guc_Count++] = ADCR; //获取数据 if(guc_Count==2)guc_Count=0; ADCC1 = (ADCC1&(~0x07))|(guc_AdcChannel_a[guc_Count]); //选择外部通道 Delay_2us(10); //切换通道后建议延时20us ADCC0 |= 0x40; //启动下一次转换 } /** * @说明 延时函数 * @参数 fui_i : 延时时间 * @返回值 无 * @注 Fcpu = 16MHz,fui_i = 1时,延时时间约为2us */ void Delay_2us(unsigned int fui_i) { while(fui_i--); }复制,粘贴
收藏0 举报
sbalwalw 发表于 2020-4-8 17:19 有个问题想请教一下,这个AD采样出来的值,如果我不读取不处理的话,它是一直固定的数值,有没有办法我不处 ...
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
7
33
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号