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
    评论
STC15是一款基于8051架构的单片机,它内部集成了一个10位的ADC模块,可以对外部模拟信号进行数字化转换。 以下是STC15ADC转换相关寄存器的使用方法: 1. ADC_CONTR寄存器:ADC控制寄存器,用于配置ADC的工作模式和启动ADC转换。 - bit7: ADC_POWER,ADC电源控制位,1为打开,0为关闭; - bit6: ADC_FLAG,ADC转换完成标志位,1表示转换完成,0表示转换未完成; - bit5: ADC_START,ADC启动控制位,1表示启动ADC转换,0表示停止转换; - bit4~bit0: ADC_SPEED,ADC转换速度控制位,用于设置ADC转换时钟,可选范围为0~31。 2. ADC_RES寄存器:ADC转换结果寄存器,用于存储ADC转换后的数字化结果。 3. ADC_RESH寄存器:ADC转换结果高字节寄存器,与ADC_RES一起用于存储10位ADC转换结果。 4. ADC_RESL寄存器:ADC转换结果低字节寄存器,与ADC_RES一起用于存储10位ADC转换结果。 以下是一个简单的STC15 ADC转换的示例代码: ``` #include <STC15F2K60S2.h> // 定义ADC转换相关的寄存器地址 #define ADC_CONTR 0xBC #define ADC_RES 0xBD #define ADC_RESH 0xBE #define ADC_RESL 0xBF // ADC转换速度设置 #define ADC_SPEED_1T 0x00 // 1个时钟周期 #define ADC_SPEED_2T 0x20 // 2个时钟周期 #define ADC_SPEED_3T 0x40 // 3个时钟周期 #define ADC_SPEED_4T 0x60 // 4个时钟周期 #define ADC_SPEED_5T 0x80 // 5个时钟周期 #define ADC_SPEED_6T 0xA0 // 6个时钟周期 #define ADC_SPEED_7T 0xC0 // 7个时钟周期 #define ADC_SPEED_8T 0xE0 // 8个时钟周期 // ADC转换启动函数 void adc_start() { ADC_CONTR |= 0x08; // 设置ADC启动标志位 } // ADC转换完成检测函数 unsigned char adc_check() { return ADC_CONTR & 0x10; // 返回ADC转换完成标志位 } // 获取ADC转换结果函数 unsigned int adc_get_result() { unsigned int result = 0; result |= ADC_RESH << 8; // 获取高字节结果 result |= ADC_RESL; // 获取低字节结果 return result; } // 主函数 void main() { // 设置ADC转换速度为4个时钟周期 ADC_CONTR = ADC_SPEED_4T; // 打开ADC电源 ADC_CONTR |= 0x80; while (1) { // 启动ADC转换 adc_start(); // 等待ADC转换完成 while (!adc_check()); // 获取ADC转换结果 unsigned int result = adc_get_result(); // 停止ADC转换 ADC_CONTR &= ~0x08; } } ``` 注意:在使用STC15ADC模块时,需要根据具体的硬件电路进行相应的配置和接口连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值