📄 adc1_func.c
字号:
#include <C8051F020.h>
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
void init_adc1(void);
void init_vref(void);
uint start_adc1(uchar channel);
void delay1ms(uint time);
uint adc1_result,cnt;
bit isnewdata;
float temp;
xdata float t[20];//存放电压检测数据,为20个数据
void init_adc1(void) //系统时钟=12M
{
ADC1CF=0x81; //ADC1配置寄存器,设置转换时钟(SAR<=6M)和内部放大器增益,SAR转换时钟
//=系统时钟/(b7-b3)=2M,内部放大器增益=1(b1-b0);此时为系统时钟17分频,增益为1
AMX1SL=0x00; //模拟输入通道选择寄存器(b3-0)
ADC1CN=0x80; //ADC1控制寄存器,允许ADC(b7),向AD1BUSY写1启动ADC(b3-b1)
EIE2=0x08; //允许ADC0中断,EADC1=1,EIE2.3=1
}
void init_vref(void)
{
REF0CN=0x03; //允许参考电压发生器(b1)及其缓冲器x2(b0),参考电压从VREF引脚输出
//ADC1参考电压取自AV+(b3=1);取自VREF(b3=0)
//内部温度传感器使能(TEMPE=0,b2)
}
uint start_adc1(uchar channel)
{
AMX1SL=channel;
ADC1CN|=0x10; //ADC1BUSY=0;
}
void config(void)
{
WDTCN = 0x07; //看门狗禁止
WDTCN = 0xDE;
WDTCN = 0xAD;
XBR0 = 0x00; //交叉开关使能,但没有进行外围设备配置
XBR1 = 0x00;
XBR2 = 0x40;
OSCXCN = 0x00;
OSCICN = 0x84; //b7=1,使能时钟丢失检测器(时钟丢失时间大于100ms将触发复位),
//CLKSL(b3)=0,选择内部晶振,IOSCEN(B2)=1,内部振荡器使能
//IFCN1-0(B1-0)=00,内部振荡器典型频率为2MHz
P1=0xFF; //逻辑高电平输出
P1MDOUT = 0x00; //P1口为开漏输出,引脚被配置为模拟输入
P1MDIN = 0x00;
}
void delay1ms(uint time){//延迟1ms
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void main()
{
char i;
config();
init_vref();
init_adc1();//ADC0初始化
start_adc1(0);//ADC0启动
EA=1;
i=0;
while(1)
{
if(isnewdata)//由该位查询ADC1转化值是否更新
{
temp=(float)adc1_result/256.0;
temp*=3.3;
isnewdata=0;
t[i]=temp;//将电压检测值存入长度为20的数组中
i++;
if(i>19)
i=0;//在此设断点,观察程序运行结果
delay1ms(10);
start_adc1(0);
}
}
}
void ADC1_ISR() interrupt 17
{//ADC1中断
cnt++;
ADC1CN&=0xEF; //ADC1BUSY=0;
adc1_result=ADC1;
isnewdata=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -