STC15的ADC转换 (测试成功)

一、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<len;ii++)
  {
 
   for(jj=ii+1;jj<len;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(); 
  }


   */
}

//----------完-------------------------

  • 9
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值