本帖最后由 芯圣电子官方QQ 于 2023-7-24 15:43 编辑
官方只有读取ADC寄存器的代码,利用中断实现ADC检测是我自己写的。。以下代码测试通过。。
#define ALLOCATE_EXTERN
#include "HC89S003F4.h"
#include "EEPROM.h"
u16 ADC_VAL=0;
void RCC_init()
{
while((CLKCON&0x20)!=0x20); //等待内部高频RC起振
CLKSWR = 0x50; //选择内部高频时钟为主时钟,内部高频RC0分频,Fosc=32MHz
while((CLKSWR&0xC0)!=0x40); //等待内部高频切换完成
CLKDIV = 0x00; //Fosc1分频得到Fcpu,Fcpu=16MHz
}
void ADC_init()
{
/************************************ADC初始化*****************************************/
P0M0 = P0M0&0xF0|0x03; //P00设置为模拟输入
ADCC0 = 0x80; //打开ADC转换电源
ADCC1 = 0x00; //选择外部通道0
ADCC2 = 0x4D; //转换结果12位数据,数据右对齐,ADC时钟16分频
IE1 |= 0x20; //允许ADC中断
}
void main()
{
RCC_init();
ADC_init();
ADCC0 |= 0x40; //启动ADC转换
FREQ_CLK = 0x10; //指明当前系统时钟
while(1)
{
// ADCC0 |= 0x40; //启动ADC转换
// while(!(ADCC0&0x20)); //等待ADC转换结束
// ADCC0 &=~ 0x20; //清除标志位
// temp = ADCR; //获取ADC的值
// ADC_VAL = (temp>>3) - (temp >> 8) + (temp >> 12);
}
}
void ADC0(void) interrupt ADC_VECTOR
{
uint temp;
ADCC0 &=~ 0x20; //清除标志位
temp = ADCR; //获取ADC的值
ADC_VAL = (temp>>3) - (temp >> 8) + (temp >> 12);
ADCC0 |= 0x40; //启动ADC转换
}
|