chenweigang 发表于 2012-3-7 09:55:55

C8051F020 用向AD0BUSY写1方式 AD0问题

请大侠看看我的程序问题在哪里 十分感谢不用考虑7289先 就转换 在线仿真 ADC0H 和ADC0L 没结果
#include <C8051F020.h>
#include "ad_initial.h"
#include "ZLG7289.h"

#defineVREF0 2.43    //内部基准电压为2.43V


void DelayMs(unsigned int n)//延时(n)MS
{
        unsigned int i;
        for(;n>0;n--)
        {
                for(i=2211;i>0;i--);
        }
}

void SysClkInit(void)//配置系统时钟
{
   int i;                              

   OSCXCN = 0x67;                      // 使用外部24M晶振
                                    

   for (i=0; i < 256; i++) ;         // 延时大于1ms

   while (!(OSCXCN & 0x80)) ;          // 查询是否稳定起振

   OSCICN = 0x88;                      // 切换到外部晶振
                                       
}

void SystemInit(void)//系统配置
{
        PCA0MD&=~0x40;//禁止看门狗定时器
        //EA=1;
}

void PortInit(void)//端口配置
{
   P0MDOUT = 0XFF;
   P1MDOUT = 0XFF;
   P2MDOUT = 0XFF;
   P3MDOUT = 0XFF;
   P74OUT = 0XFF;
}

void main(void)
{
       
        //uint sum;
        //uchar table;
        float dat;
        float output;
        SystemInit();//系统配置
        SysClkInit();//配置系统时钟
        PortInit();//端口配置
/*        DelayMs(300); //延时300ms,等待ZLG7289 复位完毕
        //ZLG7289_Init(40); //调用ZLG7289 的初始化函数
        DelayMs(1000);
        ZLG7289_Test();
        DelayMs(2000);
        ZLG7289_Reset();
        DelayMs(1000);*/

        ADC0_Init();
        AD0EN=1;
        while(1)
        {
                                                       
                        AD0INT=0;            //清除转换结果
                        AD0BUSY=1;                           //启动转换
                        DelayMs(10);
                        while(!AD0INT);      //等待AD0INT=1;
                                                                       
                        dat=ADC0H*256+ADC0L;                       
                        output=2.43/4096*dat;                       
                        DelayMs(100);
       
               
        /*        sum = output*100;
                table=sum/100;
                table=sum%100/10;
                table=sum%100%10;

                ZLG7289_Download(0,0,1,table);
                   ZLG7289_Download(0,1,0,table);
                ZLG7289_Download(0,2,0,table);*/


        }
}
void ADC0_Init (void)
{
        REF0CN=0x03;        //使用VREF0电压基准
        AMX0CF=0x00;        //选择单端输入
        AMX0SL=0x00;        //选择AIN0输入
        ADC0CF=0x80;        //ADC转换时钟2.5M 增益为1
        ADC0CN = 0x41;   // 关闭ADC0; 低能追踪模式
                           // ADC0使用向AD0BUSY写1做转换源
                         //使用左对齐输出模式
}

whhityang 发表于 2012-3-7 10:15:24

程序木看,建议仿真设断点看ADC相关寄存器的值

chenweigang 发表于 2012-3-7 12:27:54

回复【1楼】whhityang 小样一
-----------------------------------------------------------------------

设了ADC0H和ADC0L寄存器值木有

lovelywwei 发表于 2012-3-7 13:24:46

AD输入的引脚要配置为模拟输入。

wanderhope 发表于 2012-3-7 13:32:48

PCA0MD&=~0x40;//禁止看门狗定时器 ------ 这句跟看门狗可没关系。

void Reset_Sources_Init()
{
    WDTCN   = 0xDE;
    WDTCN   = 0xAD;
}
这是禁止看门狗的。

ADC0CF=0x80;        //ADC转换时钟2.5M 增益为1 ------这样配置出来,ADC的转换时钟没有2.5M

c8051fxxx系列的有专用的初始化配置软件,建议使用。

chenweigang 发表于 2012-3-8 11:53:15

回复【3楼】lovelywwei
-----------------------------------------------------------------------

020的模拟输入有固定的IO口的

chenweigang 发表于 2012-3-8 11:55:10

回复【4楼】wanderhope
-----------------------------------------------------------------------

看门用不用对AD没关系的吧问题不在这里吧   0x80    (24M/2.5M)-1即使没有2.5M 也应该不会没转换值吧

chenweigang 发表于 2012-3-9 15:54:18

已找到错误。。。。唉。。。这脑子
页: [1]
查看完整版本: C8051F020 用向AD0BUSY写1方式 AD0问题