/*********************************************************************************************************************************************************
*程序说明:本程序使用STC12C5A60S2 ADC转换功能,ADC采样使用查询方式
*芯片供电:5V
*时间:2013/3/27
*采样通道:P1^0
*********************************************************************************************************************************************************/
#include "STC12C5A60S2.h"
#include "stdio.h"
#include "intrins.h"
#include "math.h"
#define uint unsigned int
#define uchar unsigned char
/*******************************************************************************************************************************************************************
*函数功能:获取ADC采样值
*时间:2013、3、27
*相关寄存器讲解: 7 6 5 4 3 2 1 0 Reset Vale
*:ADC_CONTR://A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
* ADC_RES //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000
*ADC_RESL //A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000
*寄存器位控制讲解:
ADC_POWER:ADC电源
ADC_START:ADC转换启动控制位 设置为1时开始转换 转换结束后为0
ADC_FLAG:ADC转换结束标志位 转换完成后 ADC_FLAG=1 要由软件一定要清0
SPEED1|SPEED0:模数转换器速度控制位 CHS2/CHS1CHS0:模拟输入通道选择
------------------------------------------------ -------------------------------------------------
|SPEED1 | SPEED0 | 转换时间 | | CHS2 | CHS1 | CHS0 | 模拟输入通道|
| 1 | 1 | 90个时钟周期 | | 0 | 0 | 0 | | P1^0 |
| 1 | 0 | 180个时钟周期 | | 0 | 0 | 1 | | P1^1 |
| 0 | 1 | 360个时钟周期 | | 0 | 1 | 0 | | P1^2 |
| 0 | 0 | 540个时钟周期 | | 0 | 1 | 1 | | P1^3 |
------------------------------------------------- | 1 | 0 | 0 | | P1^4 |
| 1 | 0 | 1 | | P1^5 |
| 1 | 1 | 0 | | P1^6 |
| 1 | 1 | 1 | | P1^7 |
----------------------------------------------
************************************************************************************************************************************************************************/
uint ADC_Get(uchar Channel)
{
ADC_CONTR=0x88|Channel;
_nop_(); _nop_(); _nop_(); _nop_();
while(!(ADC_CONTR&0x10)); //等待转换完成
ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0
return(ADC_RES*4+ADC_RESL); //返回AD转换完成的10位数据(16进制)
}
/******************************************************************
*函数功能:将ADC采样值转换为10进制数据
*时间:2013、3、27
******************************************************************/
float ADC_Value(uchar Channel)
{
float AD_Value;
uint i;
for(i=0;i<10;i++) //采样10次取平均值
AD_Value+=ADC_Get(Channel); //转换100次求平均值(提高精度)
AD_Value/=10;
AD_Value=(AD_Value*5)/1024;//ADRJ=0,取10位转换结果ADC_RES+ADC_RESL=1024*Vin/Vcc
return AD_Value;
}
/***************************************************************
*Funtion Name:delay
*Time:2013/3/27
Author:zhuhao
***************************************************************/
void delay(unsigned int a) //延时约1ms
{
unsigned int i;
while (--a!=0)
for(i=600;i>0;i--); //1T单片机i=600,若是12T单片机i=125
}
/***************************************************************
*Funtion Name:USART_Init
*Time:2013/3/27
Author:zhuhao
***************************************************************/
void USART_Init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd; //设置9600波特率
SCON=0x50; //串口方式1,允许接收
TR1=1;
}
/**********************************************************************
*函数功能:ADC初始化配置
*时间:2013、3、27
*寄存器讲解: 7 6 5 4 3 2 1 0 Reset Value
P1ASF:选择模拟功能A/D端口 P1ASF P1ASF P1ASF P1ASF P1ASF P1ASF P1ASF P1ASF 0000,0000
P1ASF相应位置1则P1口的相应位作为模拟功能A/D使用
7 6 5 4 3 2 1 0 Reset Value
AUXR1: PCA_P4 SPI_P4 S2_P4 GF2 ADRJ DPS 0000,0000
其中ADRJ位控制A/D转换结果寄存器(ADC_RES,ADC_RESL)的数据格式调整
ADRJ=0:10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中
ADRJ=1:10位A/D转换结果的高8位存放在ADC_RESL中,低2位存放在ADC_RES的低2位中
***********************************************************************/
void ADC_Init()
{
P1ASF=0x01;//ADC I/O选择 P1^0;
AUXR1=0x00;//ADRJ=0
ADC_RES=0;//10位ADC采样结果的高8位存放在ADC_RES中,低二位存放在ADC_RES_L的低二位中
ADC_RESL=0;
ADC_CONTR=0x80;//开启ADC电源
delay(2);//必要的延时
}
void main()
{
USART_Init();
ADC_Init();
while(1)
{
TI=1;
printf("转化:%.2f Vn",ADC_Value(0));//将ADC采样的实际电压值发送给串口助手
TI=0;
}
}
/*******************************************************************************************************************************************************************
* STC12C5A60S2.h 文件
******************************************************************************************************************************************************************/
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机内核特殊功能寄存器 C51 Core SFRs
//
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』