一、P1ASF //设置P1口做普通IO口还是ADC输入口,0--普通IO口,1--ADC入口
二、P1M0、P1M1、这两个寄存器的相同位状态决定P1口的输入状态,00 01 10 11,其中11 为ADC转换常采用的状态
三、ADC_CONTR 不能位寻址,最好赋值 D7位是开关ADC电源开关,0关,1开; D6D5为转换速度,00最慢,11最快,D4转换标志位,当转换完成后自动为1,未完成就为0 D3为转换开始位,1开始,0等待, D2D1D0为输入选择,由于是8路可转换,选择那一路有着三位确定。000---111分别P10---P17。
四、CLK_DIV,这个寄存器主要是分频用,但是它的D5位用来设置转换结果的存储方式,0时CLK_DIV的D5位为0,转换结果高8位存ADC_RES,低2位存ADC_RESL的低两位,1时转换结果低8位存ADC_RESL,高2位存ADC_RES的低两位;1时转换结果低8位存ADC_RESL,高2位存ADC_RES的低两位;
//----(adc.c)以下是代码直接复制运行-----------------------------
#include"stc15.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
uint ADC_DATA;
void delay(uchar ms)
{
uchar i; while(ms--)
for(i=0;i<220;i++);
}
/*----------------------------
初始化ADC
----------------------------*/
void ADC_init(void)
{
ADC_CONTR |=0x80; //首先要开AD 转换电源 1000 0000
P1ASF=0x80; //P1ASF:1000 0000 对应的相应位为1开启ADC通道。
delay(10);
}
//排序
void sortData(int dat[],int len)
{
int ii,jj,temp_1=0 ;
for(ii=0;ii
for(jj=ii+1;jj
if(dat[ii]>dat[jj])
{
temp_1=dat[jj];
dat[jj]=dat[ii];
dat[ii]=temp_1;
}
}
}
}
unsigned int ADC()
{
unsigned int ADC_DATA ;
unsigned char DATA_H,DATA_L;
ADC_DATA=0; // 清除转换结果
ADC_CONTR |=0xE7; //ADC_CONTR寄存器:第7位:电源开启,第6,5保持转换速度,第4位转换结束位标志,第3位设置开始。最后三位选择为转换位(P1.7)。 所以: 1110 0111
Delay_N1ms(3) ; //延时3MS
ADC_CONTR |=0xEF ; //转换开关 ,转换位置1开始转换: 1110 1111
Delay_N1ms(2) ; //延时3MS
while(ADC_CONTR & 0x10==0); //查询转换是否结束,结束后读取结果
ADC_CONTR &=0xE7;//清除转换结果标志位,关闭转换
DATA_H=ADC_RES; //?默认高字节高8位。
DATA_L=ADC_RESL;// 默认低字节低2位。
DATA_L=DATA_L&0x03; // 屏蔽无关位
ADC_DATA=DATA_H;
ADC_DATA=ADC_DATA<<2;
ADC_DATA |=DATA_L;
ADC_DATA |=DATA_L;
ADC_CONTR=0x00;
return(ADC_DATA);// 返回转化结果
}
void main(void)
{
ADC_init();
while(1)
{
ADC();
}
/*
ADC_init();
tempADC=ADC();
tempADC= (VCC/1023)*tempADC*1000;
WDT_CONTR=0x37;
while(tempADC/10||tempADC/1){
write_number(tempADC%10,RED);
tempADC=tempADC/10;
}
write_number(black,RED);
LE=1;
LE=0;
for(i=0;i<300;i++){
WDT_CONTR=0x37;
delay1ms();
}
*/
}
//----------完-------------------------