本帖最后由 jiaisr123 于 2020-3-25 20:16 编辑
P10引脚设置错误了可能
/**
* ************************************************************************************
* 上海芯圣电子股份有限公司
* 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--);
}
复制,粘贴
|