📄 adc0.c
字号:
#define T2reload 2000
#define ADJRATESE 732L //单端电平系数
#define N 40; //模拟采样计数
sfr16 ADC0VAL=0xbe; //将ADC0H-ADC0L通过sfr16实现
bit isnewdata; //新数据产生位标志
long realvol=0; //转换后的电压值,为实际值的1000000倍
long value_buf[N]={0}; //模拟数据存储单元
//**********************模拟控制初始化程序**************************
void adc0_init(void)
{
//相关控制寄存器
SFRPAGE=0x00;
ADC0CF=0x0f;//ADC0时钟为系统时钟2分频,PGA增益为0.5
ADC0CN=0x8c;//AD0TM=0,ADC0为连续跟踪模式,由T2溢出率启动ADC0
//AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高4位
REF0CN&=0x0A;//AD0VRS=0,ADC0电压基准取自VREF0引脚
REF0CN|=0x02;//BIASE=1,偏移产生器工作
//输入方式及通道选择
SFRPAGE=0x00;
AMX0CF=0x00; //AIN0.0-AIN0.3均为单端模式
AMX0SL=0x00; //AIN0.0为ADC0转化通道
EIE2|=0x02; //开ADC0中断
//设置T2触发源
SFRPAGE=0x00;
TMR2CF=0x10; // T2为外部时钟的8分频,计数方向为增值计数
TMR2CN=0x04; // T2为16bit定时器模式,并启动定时器运行,自动重装
SFRPAGE = 0x00;
RCAP2=65536-T2reload;//自动重装预置数值
TMR2=RCAP2;
SFRPAGE=0x00;
TR2=1; //启动定时器T2
}
//中位值平均滤波
long filter(void)
{
uchar i,j;
long sum=0;
static int count; //模拟数据计数
while(count<N) //存储N个模拟数据
{
if(isnewdata) //存储新的模拟数据
{
value_buf[count++]=realvol;
isnewdata=0; //新数据产生位标志清零
}
}
for(j=0;j<N-1;j++)
{
for(i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp=value_buf[i];
value_buf[i]=value_buf[i+1];
value_buf[i+1]=temp;
}
}
}
for(count=1;count<N-1;count++)
sum+=value_buf[count];
count=0; //模拟计数清零
return (long)(sum/(N-2));
}
void ADC0_ISR() interrupt 15
{
int value;
SFRPAGE=0x00;
AD0INT=0;
value=ADC0VAL; //取出模拟值
realvol=(long)value*ADJRATESE; //电压转换ADC0转化值乘以单端电平系数,
//其结果为电平真实值乘以1000000
//例如ADC0VAL=4096时,realvol=4096*732=2998272,
//即表示真实电压为2.998272v
isnewdata=1;
}
//延迟1ms
void delay1ms(uint time)
{
uint i;
uint j;
for (i=0;i<time;i++)
{
for(j=0;j<300;j++);
}
}
//系统初始化
void sys_init(void)
{
uchar i=0;
//看门狗禁止
EA=0; //禁止所有中断
WDTCN = 0x07; //禁止看门狗定时器
WDTCN = 0xDE;
WDTCN = 0xAD;
EA=1; //打开总中断
//端口引脚配置
SFRPAGE=0x0F;
XBR2=0x40; //交叉开关使能
XBR3=0x80; //CAN TX引脚为推挽输出
P7MDOUT=0x03; //P7.0和P7.1推挽方式输出
P3MDIN=0xFF; //P3引脚配置为数字量输入
//系统时钟初始化
SFRPAGE=0x0F;
CLKSEL=0x01; //外部振荡器
OSCXCN=0x67; //外部晶振16MHz,
for(;i<255;i++); //等待至少1ms
while(!(OSCXCN&0x80));//查询XTLVLD是否为1,等待外部晶振稳定振荡
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -