专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于51单片机之ADC(可衔接各种传感器来控制)

作者:CaKen   来源:CaKen工作室   点击数:  更新时间:2014年09月02日   【字体:

 ******************************  Copyright(C) CaKe  ************************************

========================================================================================
==============**版权信息   : CaKen工作室                                  ==============
==============**文件名     : main.c                                       ==============
==============**作者       : CaKen                                        ==============
==============**版本号     : V1.0                                         ==============
==============**时间       : 2014.08.30                                   ==============
==============**功能描述   : ADC实验测试                                  ==============
========================================================================================
==============**新浪微博   :CaKen            ==============
****************************************************************************************
 
#include"STC12C5A60S2.H"
#include"intrins.h"      
 
sbit SMG1 = P2^4;  //数码管1
sbit SMG2 = P2^5;  //数码管2
sbit SMG3 = P2^6;  //数码管3
sbit SMG4 = P2^7;  //数码管4
 
unsigned char code Tab[]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e}; //阳
 
****************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
****************************************************************************************/
 
void DELAY_MS (unsigned int a)
{
 unsigned int i;
 while( --a != 0){
  for(i = 0; i < 600; i++);
 }
}
 
***************************************************************************************
函数名:延时程序
调  用:delay();
参  数:
返回值:
结  果:
备  注: 0.1ms延时程序(12MHz 10倍于51单片机速度时)
****************************************************************************************/
 
void delay (unsigned int a)
{
 unsigned char i;
   while( --a != 0)
   {
  for(i = 0; i < 12; i++);
   }        
}
 
****************************************************************************************
** 函数名: Display_smg(?);
** 说明  : 数码管显示程序
** 输入值:
** 输出值: 无
** 返回值: 无
*****************************************************************************************/
 
void Display_smg(unsigned int x)
{
      P0 = Tab[x/1000];
      SMG1 = 0;
      delay(2);
      SMG1 = 1;
 
      P0 = Tab[x00/100];
      SMG2 = 0;
      delay(2);
      SMG2 = 1;
 
   P0 = Tab[x0/10];  
      SMG3 = 0;   
      delay(2);
   SMG3 = 1;
 
      P0 = Tab[x];
      SMG4 = 0;
      delay(2);  
        SMG4 = 1;
}
 
*********************************************************************************************
函数名:10位A/D转换初始化函数
调  用:ADC_Init (?);
参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结  果:开启ADC功能并设置ADC的输入端口
备  注:使用ADC功能时需要将对应的IO接口设置为高阻输入方式(例如:P1M1 = 0x01;)
**********************************************************************************************/
 
void ADC_Init (unsigned char CHA)
{
 unsigned char AD_FIN=0; //存储A/D转换标志
    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
    ADC_CONTR  = 0x40;  //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
    _nop_();
    ADC_CONTR |= CHA;       //选择A/D当前通道
    _nop_();
    ADC_CONTR |= 0x80;      //启动A/D电源
    DELAY_MS(1);            //使输入电压达到稳定(1ms即可)
}
*********************************************************************************************
函数名:10位A/D转换函数
调  用:? = ADC_Read();
参  数:无
返回值:10位ADC数据高(从0到1023(十进制))
结  果:读出指定ADC接口的A/D转换值,并返回数值
备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.H头文件)
**********************************************************************************************/
 
unsigned int ADC_Read (void)
{
 unsigned char AD_FIN=0;           //存储A/D转换标志
    ADC_CONTR |= 0x08;                //启动A/D转换(0000 1000 令ADCS = 1)
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    while (AD_FIN ==0)     //等待A/D转换结束
 {   
        AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
    }
    ADC_CONTR &= 0xE7;               //1111 0111 清ADC_FLAG位, 关闭A/D转换,
    return (ADC_RES*4+ADC_RESL);     //返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
}
 
********************************************************************************************
函数名:主函数
调  用:无
参  数:无
返回值:无
结  果:程序开始处,无限循环
备  注:
********************************************************************************************/
 
void main(void)
    unsigned int m;
 ADC_Init (0);    //初始化P1^0
 
 P1M1 = 0X01; //设置为高阻输入P1^0
 P1M0 = 0X00;
                       
 while(1)
  {
    m = ADC_Read();    //把数模转换的数值给m
    Display_smg(m);    //数码管显示值的大小
  }
 
}
 
 
 
 
关闭窗口