rqbh 发表于 2011-6-2 21:34:25

STC12C5A60S2的AD系统问题,各位朋友给检查一下看问题出在哪里了啊

#include <STC-NEW-8051.h>
#indlude <intrins.h>

#define ADC_POWER        0x80;        //ADC 电源控制位
#define ADC_FLAG        0x10;        //ADC 转换完成标识
#define ADC_START        0x08;        //ADC 开始转换 控制
#define ADC_SPEEDLL        0x00;        //540 clocks
#define ADC_SPEEDL        0x20;        //360 clocks
#define ADC_SPEEDH        0x40;        //180 clocks
#define ADC_SPEEDHH        0x60;        //90 clocks

unsigned char Vin={0x80,0x81};
unsigned char TEMP,TEMPL;
unsigned int TEMP_value;

unsigned charGetADCResult(unsigned charchannel)
{
    unsigned char AD_finished=0;         
    ADC_RES = 0;                  
        channel &= 0x07;               
    ADC_CONTR = ADC_SPEEDL;
    _nop_();
        _nop_();
        _nop_();
        _nop_();
    ADC_CONTR |= channel;         
    _nop_();
        _nop_();
        _nop_();
        _nop_();
    ADC_CONTR |= 0x80;            
    _nop_();
        _nop_();
        _nop_();
        _nop_();
        ADC_CONTR |= 0x08;            
    AD_finished = 0;
    while (AD_finished ==0 )      
    {
      AD_finished = (ADC_CONTR & 0x10);
    }
    ADC_CONTR &= 0xE7;            
    return (ADC_RES);               
}

/*初始化 ADC 特殊功能寄存器 */
void InitADC(unsigned char n)
{
        unsigned char TEMP;
        TEMP=0;
        P1ASF=n;                        //打开几个通道ADC功能
        ADC_RES=0;       
        ADC_RESL=0;                //清除以前的转换结果
        TEMP|=ADC_POWER;
        TEMP|=ADC_SPEEDLL;
        ADC_CONTR = TEMP;
        ADC_Delay(2);                        //ADC上电延时
}


/* 延时 */
void ADC_Delay(unsigned int n)
{
        unsigned int x;
       
        while(n--)
        {
                x=5000;
                while(x--);
        }
}

void main()
{       

       
        EA=1;                 //开总中断
        ET1=1;                //开定时器中断1
       
        P1M0=0xff;
        P1M1=0xff;                //设置开漏模式
       
        InitADC(0xff);                //初始化AD1
        LCD_init();                        //初始化LCD
               
        delay_ms(10);
//        LCD_clear(colors);
        AUXR1&= ~0x41;

        while(1)
        {        unsigned char i;
                for(i=0;i<10;i++)
                {
                        TEMP=GetADCResult(1);
                        TEMP_value=TEMP*19.53+TEMP_value;

                        delay_ms(50);
                }       
                        Vin=TEMP_value/10;
                        LCD_ShowChar(10,56,colors,colors,(Vin/100+48));
        //                delay_ms(10);
                        LCD_ShowChar(18,56,colors,colors,(Vin%100/10+48));
        //                delay_ms(10);
                        LCD_ShowChar(26,56,colors,colors,(Vin%10+48));
                        delay_ms(50);

               
        }
       
}

P11口连接的是GP2D12红外测距,问题是不管怎么阻挡,显示屏上的数字就自个儿的在那里从小到大的跳(大概从0到256的样子),各位朋友给检查下看问题出在哪里了啊,我是自学的单片机,新手,望各位见谅啊,谢谢

rqbh 发表于 2011-6-3 08:15:27

各位朋友不给看看吗?
页: [1]
查看完整版本: STC12C5A60S2的AD系统问题,各位朋友给检查一下看问题出在哪里了啊