#include <REG51.H>
#include <intrins.h>
#include <absacc.h>
//#define uint unsigned int
#define uint long int
#define uchar unsigned char
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sfr P1ASF = 0x9D;
sfr ADC_CONTR = 0xBC;
sfr ADC_RES = 0xBD;
sfr ADC_RESL = 0xBE;
sfr AUXR1 = 0xA2;
sfr P1M1 = 0x91 ;
sfr P1M0 = 0x92 ;
sfr P3M0 = 0xB2 ;
sfr P3M1 = 0xB1 ;
sfr smdis = 0x80;
uint mmm0,mmm1;
//以下选择 ADC 转换速率,只能选择其中一种
//SPEED1 SPEED0 A/D转换所需时间
//#define AD_SPEED 0x60 // 0110,0000 1 1 70 个时钟周期转换一次,
// CPU工作频率21MHz时 A/D转换速度约 300KHz
//#define AD_SPEED 0x40 //0100,0000 1 0 140 个时钟周期转换一次
//#define AD_SPEED 0x20 //0010,0000 0 1 280 个时钟周期转换一次
#define AD_SPEED 0x00 //0000,0000 0 0 420 个时钟周期转换一次
unsigned char dp=0x10;
unsigned char vccreal,adx; //设定实际的电压值
uint temp,AD_RLX,aaa,bbb,ccc;
void delayt(unsigned char t) // 延时函数
{
unsigned int n;
while(t--)
{
n = 6000;
while(--n);
}
}
//---------------------------------------------------------------------
unsigned int get_AD_result(unsigned char channel)
{
unsigned int AD_RESULT=0; //存储 A/D 转换结果
// float temp1;
//float temp2;
//uint temp3;
ADC_RES = 0;
ADC_RESL = 0;
channel &= 0x07; //0000,0111 清0高5位
ADC_CONTR = AD_SPEED;
_nop_(); _nop_();
ADC_CONTR |= channel; //选择 A/D 当前通道
_nop_(); _nop_();
ADC_CONTR |= 0x80; //启动 A/D 电源
delayt(23);
//使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
while (!(ADC_CONTR & 0x10) ) ; //等待A/D转换结束 //0001,0000 测试A/D转换结束否
ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
aaa=ADC_RES;
bbb=ADC_RESL;
//AD_RESULT = (ADC_RES * 4+ ADC_RESL)*5.3 ; // &0x03
AD_RESULT = ADC_RES * 4+ ADC_RESL ; // &0x03
return (AD_RESULT);
}
void main()
{
EA=1;
vccreal = 5; //设定实际的电压值
P1M1 = 0xff ; //P1口设置为高阻
P1M0 = 0x00 ;
P1ASF = 0x80; //0000,0010, 将 P1.7 置成模拟口
AUXR1 &= ~0x04; //0000,0100, 令 ADRJ=0
// 0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
// 1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器
ADC_CONTR |= 0x80; //1000,0000 打开 A/D 转换电源
AD_RLX=2;
adx=0;
mmm0=0;
mmm1=0;
while(1)
{
mmm0 = get_AD_result(0)*0.488;//P1.7 为 A/D 当前通道, 测量并发送结果
mmm1 = get_AD_result(1);//P1.7 为 A/D 当前通道, 测量并发送结果
}
}
200字以内,仅用于支线交流,主线讨论请采用回复功能。