用STC15W408AS的ADC模块实现测量电压发给串口助手显示结果,测量的结果总是显示的是固定值,

1、要实现的功能
用P1口的P1.1引脚,测量3.3V电压值,结果送串口助手显示。
2、遇到的问题
测量的结果总是一个固定值768,不知道问题在哪里,求指教!!

img

3、程序如下:

#include "STC15.h"
#include "intrins.h"
#include "debug.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

BYTE temp = 0;

#define ADC_POWER 0x80 // ADC电源控制位
#define ADC_FLAG 0x10  // ADC完成标志
#define ADC_START 0x08 // ADC起始控制位

#define ADC_SPEEDLL 0x00 // 540个时钟
#define ADC_SPEEDL 0x20  // 360个时钟
#define ADC_SPEEDH 0x40  // 180个时钟
#define ADC_SPEEDHH 0x60 // 90个时钟

void Delay(WORD n);
void InitADC();

BYTE ch = 1;   // ADC通道号
BYTE flag = 0; // ADC通道号

void main()
{

    InitADC(); //初始化ADC
    // Delay(10); // ADC上电并延时

    //开始AD转换
    while (1)
    {
        printf("WORK     \r\n");
        printf("\r\n");
        if (flag)
        {
            flag = 0;
            printf("\r\n");
            printf("ADC=%d", temp); //显示通道号
            printf("\r\n");
            ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
        }
    }
}

/*----------------------------
ADC中断服务程序
----------------------------*/
void adc_isr() interrupt 5
{
    ADC_CONTR &= !ADC_FLAG; //清除ADC中断标志
    temp = ADC_RESL;
    //temp = (temp * (3.3 / 256));
    flag = 1;
}

/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
    P1M0 = 0x01;     // set 1# chanel to AD
    P1M1 = 0x01;     // set 1# chanel to AD
    P1ASF = 0x01;    //设置P1口为AD口
    CLK_DIV &= 0xd0; //结果右对齐
    ADC_RES = 0;     //清除结果寄存器
    ADC_RESL = 0;
    ADC_CONTR &= !ADC_FLAG;
    IE = 0xa0; //使能ADC中断
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
    Delay(10); // ADC上电并延时
}

/*----------------------------
软件延时
----------------------------*/
void Delay(WORD n)
{
    WORD x;

    while (n--)
    {
        x = 5000;
        while (x--)
            ;
    }
}
#include "STC15.h"
#include "intrins.h"
#include "debug.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

BYTE temp = 0;

#define ADC_POWER 0x80 // ADC电源控制位
#define ADC_FLAG 0x10  // ADC完成标志
#define ADC_START 0x08 // ADC起始控制位

#define ADC_SPEEDLL 0x00 // 540个时钟
#define ADC_SPEEDL 0x20  // 360个时钟
#define ADC_SPEEDH 0x40  // 180个时钟
#define ADC_SPEEDHH 0x60 // 90个时钟

void Delay(WORD n);
void InitADC();

BYTE ch = 1;   // ADC通道号
BYTE flag = 0; // ADC通道号

void main()
{

    InitADC(); //初始化ADC
    // Delay(10); // ADC上电并延时

    //开始AD转换
    while (1)
    {
        printf("WORK     \r\n");
        printf("\r\n");
        if (flag)
        {
            flag = 0;
            printf("\r\n");
            printf("ADC=%d", temp); //显示通道号
            printf("\r\n");
            ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
        }
    }
}

/*----------------------------
ADC中断服务程序
----------------------------*/
void adc_isr() interrupt 5
{
    ADC_CONTR &= !ADC_FLAG; //清除ADC中断标志
    temp = ADC_RESL;
    //temp = (temp * (3.3 / 256));
    flag = 1;
}

/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
    P1M0 = 0x01;     // set 1# chanel to AD
    P1M1 = 0x01;     // set 1# chanel to AD
    P1ASF = 0x01;    //设置P1口为AD口
    CLK_DIV &= 0xd0; //结果右对齐
    ADC_RES = 0;     //清除结果寄存器
    ADC_RESL = 0;
    ADC_CONTR &= !ADC_FLAG;
    IE = 0xa0; //使能ADC中断
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
    Delay(10); // ADC上电并延时
}

/*----------------------------
软件延时
----------------------------*/
void Delay(WORD n)
{
    WORD x;

    while (n--)
    {
        x = 5000;
        while (x--)
            ;
    }
}


你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。