⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f330ad1.txt

📁 330AD采样程序
💻 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 + -