📄 f330ad1.txt
字号:
请C8051的版主帮个忙,好吗????
我现在用C8051F320做AD转换,但是一直都有问题.
我是用的内部参考源VREF(2.44V),不是VDD.用定时器2溢出来触发AD中断,在中断处理里做相应处理.
但是现在出现这样的问题,我在中断里设置一个断点,在第一次程序到断点,以前不管AD采集多少次,数据是错误的.
我再采集,第二次程序到断点,这里AD采集正确.
(我用的是外部晶体,12MHZ.单端输入,P2.0)
程序如下:请帮助
#include "C8051.h"
sfr16 ADC0 = 0xbd; // ADC Data
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
uint8 adc_array[16];
void Port_IO_Init(void)
{
P0MDIN = 0xF3;
P0SKIP = 0x0C;
P2MDIN = 0x00; //P2.0~2.7为模拟输入
P2SKIP = 0x0F; //P2.0~P2.7跳过
XBR1 = 0x40; //打开交叉开关,禁止弱上拉
PCA0CN = 0x00; //禁止看门狗定时器
PCA0MD = 0x80; //待机时PCA停止,系统时钟的12分频
}
void Oscillator_Init(void)
{
uint16 i;
OSCXCN = 0x67; //晶体振荡方式,12MHz
for(i = 0; i < 3000; i++);//延时1ms
while (!(OSCXCN & 0x80)); //等待晶体振荡稳定
CLKSEL = 0x01; //系统时钟切换至外部振荡器
OSCICN = 0x00; //关闭内部振荡器
}
void Timer2_Init (void)
{
CKCON = 0x10; //T2工作在16位自动重装载试
TMR2 = 0x2710; //10ms
TMR2RL = 0x2710;
IE = 0x80; //禁止T2中断
TR2 = 1; //启动T2
}
void ADC_Init(void)
{
AMX0P = 0x08; //选择正端输入为P2.0/VDD
AMX0N = 0x1F; //选择负端输入为GND
ADC0CF = 0x18; //选择为SAR为3M转换,右对齐
ADC0CN = 0xC2; //T2定时采样,低功耗跟踪方式
REF0CN = 0x03; //启动内部电压基准
EIE1 |= 0x08; // 启用 ADC 中断
}
void Init_Device(void)
{
Port_IO_Init();
Oscillator_Init();
Timer2_Init();
ADC_Init();
}
void main(void)
{
uint16 i,j;
Init_Device();
while(1)
{
;
}
}
void ADC0_ISR (void) interrupt 10 using 0
{
static uint8 i=0;
AD0INT = 0; //清ADC中断标志位
adc_array = ADC0;
i++;
if(i == 16)
i = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -