1、要实现的功能
用P1口的P1.1引脚,测量3.3V电压值,结果送串口助手显示。
2、遇到的问题
测量的结果总是一个固定值768,不知道问题在哪里,求指教!!
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天,您在需要使用的时候【私信】联系我,我会为您补发。