`
ylilike
  • 浏览: 146194 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

51系列单片机C语言编程ADC模/数转换器程序模板

阅读更多



/*********************************************************************************************
函数名:8位A/D转换初始化函数
调  用:Read (?);
参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结  果:开启ADC功能并设置ADC的输入端口
备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
/**********************************************************************************************/
void Read_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即可)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:8位A/D转换函数
调  用:? = Read ();
参  数:无
返回值:8位的ADC数据
结  果:读出指定ADC接口的A/D转换值,并返回数值
备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
/**********************************************************************************************/
unsigned char 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_DATA);          //返回A/D转换结果(8位)
}
/**********************************************************************************************/

以上- 8位ADC程序模块(适用于STC12C2052AD系列)
/*********************************************************************************************
程序名:    8位ADC转换实验程序
编写人:    杜洋 
编写时间:  2010年3月24日
硬件支持:  STC12C2052AD 使用ADC功能 外部晶体12MHz
接口说明:    
修改日志:  
  1-								
/*********************************************************************************************
说明:
PC串口端设置 [ 4800,8,无,1,无 ]
将ADC读出的数值通过串口以十六进制方式显示。

/*********************************************************************************************/

#include <STC12C2052AD.H> //单片机头文件
#include <intrins.h>	//51基本运算(包括_nop_空函数)

/*********************************************************************************************
函数名:毫秒级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++);
	}
}
/*********************************************************************************************/

/*********************************************************************************************
函数名:UART串口初始化函数
调  用:UART_init();
参  数:无
返回值:无
结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){
	//EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
	//ES = 1; //允许UART串口的中断

	TMOD = 0x20;	//定时器T/C1工作方式2
	SCON = 0x50;	//串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
	TH1 = 0xF3;	//定时器初值高8位设置
	TL1 = 0xF3;	//定时器初值低8位设置
	PCON = 0x80;	//波特率倍频(屏蔽本句波特率为2400)
	TR1 = 1;	//定时器启动    
}
/**********************************************************************************************/

/*********************************************************************************************
函数名:UART串口发送函数
调  用:UART_T (?);
参  数:需要UART串口发送的数据(8位/1字节)
返回值:无 
结  果:将参数中的数据发送给UART串口,确认发送完成后退出
备  注:
/**********************************************************************************************/
void UART_T (unsigned char UART_data){ //定义串口发送数据变量
	SBUF = UART_data;	//将接收的数据发送回去
	while(TI == 0);		//检查发送中断标志位
	TI = 0;			//令发送中断标志位为0(软件清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:8位A/D转换初始化函数
调  用:Read (?);
参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结  果:开启ADC功能并设置ADC的输入端口
备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
/**********************************************************************************************/
void Read_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即可)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:8位A/D转换函数
调  用:? = Read ();
参  数:无
返回值:8位的ADC数据
结  果:读出指定ADC接口的A/D转换值,并返回数值
备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
/**********************************************************************************************/
unsigned char 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_DATA);          //返回A/D转换结果(8位)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:主函数
调  用:无
参  数:无
返回值:无
结  果:程序开始处,无限循环
备  注:
/**********************************************************************************************/
void main (void){
	unsigned char R;
	UART_init();//串口初始程序
	Read_init(0);//ADC初始化
	P1M0 = 0x01; //P1.7~.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。
	P1M1 = 0x00; //P1.7~.0:0000 0000(强推)
	while(1){
	    R = Read ();
	    UART_T (R); //串口小秘书,将ADC读出值送入串口显示
	}
}

以上- 8位ADC应用实例(适用于STC12C2052AD系列)
/*********************************************************************************************
函数名:10位A/D转换初始化函数
调  用:Read_init (?);
参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结  果:开启ADC功能并设置ADC的输入端口
备  注:使用ADC功能时需要将对应的IO接口设置为高阻输入方式(例如:P1M1 = 0x01;)
/**********************************************************************************************/
void Read_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中)
}

以上- 10位ADC程序模块(适用于STC12C5A60S2系列)
/*********************************************************************************************
程序名:    10位ADC转换实验程序
编写人:    杜洋 
编写时间:  2010年3月24日
硬件支持:  STC12C5A60S2 使用10位ADC功能 外部晶体12MHz
接口说明:  P1.0接口接电位器  
修改日志:  
  1-								
/*********************************************************************************************
说明:
PC串口端设置 [ 4800,8,无,1,无 ]
将ADC读出的数值通过串口以十六进制方式显示(第一个数据是ADC高8位,第二个数据是ADC低2位)。
/*********************************************************************************************/

#include <STC12C5A60S2.H> //单片机头文件
#include <intrins.h>	//51基本运算(包括_nop_空函数)

/*********************************************************************************************
函数名:毫秒级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++);
	}
}
/*********************************************************************************************/

/*********************************************************************************************
函数名:UART串口初始化函数
调  用:UART_init();
参  数:无
返回值:无
结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){
	//EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
	//ES = 1; //允许UART串口的中断

	TMOD = 0x20;	//定时器T/C1工作方式2
	SCON = 0x50;	//串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
	TH1 = 0xF3;	//定时器初值高8位设置
	TL1 = 0xF3;	//定时器初值低8位设置
	PCON = 0x80;	//波特率倍频(屏蔽本句波特率为2400)
	TR1 = 1;	//定时器启动    
}
/**********************************************************************************************/

/*********************************************************************************************
函数名:UART串口发送函数
调  用:UART_T (?);
参  数:需要UART串口发送的数据(8位/1字节)
返回值:无 
结  果:将参数中的数据发送给UART串口,确认发送完成后退出
备  注:
/**********************************************************************************************/
void UART_T (unsigned char UART_data){ //定义串口发送数据变量
	SBUF = UART_data;	//将接收的数据发送回去
	while(TI == 0);		//检查发送中断标志位
	TI = 0;			//令发送中断标志位为0(软件清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:10位A/D转换初始化函数
调  用:Read_init (?);
参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结  果:开启ADC功能并设置ADC的输入端口
备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
/**********************************************************************************************/
void Read_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数据高8位存放在ADC_RES中,低2位存放在ADC_RESL中)
结  果:读出指定ADC接口的A/D转换值,并返回数值
备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
/**********************************************************************************************/
void 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转换, 
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:主函数
调  用:无
参  数:无
返回值:无
结  果:程序开始处,无限循环
备  注:
/**********************************************************************************************/
void main (void){
	UART_init();//串口初始程序
	Read_init(0);//ADC初始化
	P1M1 = 0x01; //P1.7~P1.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。
	P1M0 = 0x00; //P1.7~P1.0:0000 0000(强推)
	while(1){
	    ADC_Read ();//调用ADC转换程序
	    UART_T (ADC_RES); //串口小秘书,将ADC读出值高8位送入串口  0000 0000
	    UART_T (ADC_RESL); //串口小秘书,将ADC读出值低2位送入串口  XXXX XX00
	}
}

以上- 10位ADC应用实例(适用于STC12C5A60S2系列)

引用


注意事项:
1. STC12C5A60S2系列内置10位ADC,STC12C2052AD系列内置8位ADC。
2. 在使用ADC功能时,应将其输入端的I/O接口设置为高阻输入工作方式。
3. 更改ADC通道时须同时将对应的IO接口修改为高阻输入。
4. STC12C5A60S2系列的10位ADC数据中,高8位存放在ADC_RES中,低2位存放在ADC_RESL中。

STC12C5A60S2.h头文件中对ADC部分的定义如下:

sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000

sfr ADC_RES  = 0xBD;  //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000

sfr ADC_RESL = 0xBE;  //A/D 转换结果低2位                                           ADCV.1 ADCV.0 0000,0000

可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。


  • 大小: 283.5 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    PIC单片机模/数转换器ADC模块的程序设计

    通过C语言发布:PIC单片机模/数转换器ADC模块的程序设计

    单片机C语言程序设计 160128液晶曲线显示ADC0832两路模数转换结果(有源码)

    单片机C语言程序设计 160128液晶曲线显示ADC0832两路模数转换结果(有源码)单片机C语言程序设计 160128液晶曲线显示ADC0832两路模数转换结果(有源码)单片机C语言程序设计 160128液晶曲线显示ADC0832两路模数转换...

    MSP430系列单片机实用C语言程序设计

    MSP430系列单片机实用C语言程序设计 里面有调试程序 |——5-1 框架程序 |——6-1 异步串行通信程序(点对点通信) |——6-2 异步串行通信程序(地址位模式多机通信) |——6-3 异步串行通信程序(空闲模式多...

    proteus仿真,使用AT89C51单片机,ADC0809芯片转换电位器模拟量数据为数字量,在4位数码管显示,含C程序源码

    proteus仿真,使用AT89C51单片机,ADC0809芯片转换电位器模拟量数据为数字量,在4位数码管显示,含C程序源码,适用于学生或者电子爱好者学习、实验。

    基于51单片机的ADC0832数字电压表(仿真+程序)

    3. 程序设计思路:本设计使用了C语言编写程序,使用51单片机作为核心控件,实现了ADC0832数字电压表的模拟电压信号转换为数字信号的功能。 4. 程序代码解析:程序代码主要包括了头文件的包含、端口定义、全局变量...

    MSP430系列单片机实用C语言程序设计 随书光碟

    MSP430系列单片机实用C语言程序设计 随书光碟。工程软件为IAR 内容: 光盘根目录 | |——3-1 调试程序 |——5-1 框架程序 |——6-1 异步串行通信程序(点对点通信) |——6-2 异步串行通信程序(地址位...

    单片机C语言程序设计实训100例基于8051+Proteus仿真.zip

    单片机C语言程序设计实训100例基于8051+Proteus仿真.zip 第 01 篇 基础部分 01 闪烁的LED 02 从左到右的流水灯 03 左右来回的流水灯 04 花样流水灯 05 LED模拟交通灯 06 单只数码管循环显示0-9 07 8只数码管滚动显示...

    单片机C语言程序设计实训100例基于8051+Proteus仿真源码.zip

    单片机C语言程序设计实训100例基于8051+Proteus仿真源码: 第 01 篇 基础部分 01 闪烁的LED 02 从左到右的流水灯 03 左右来回的流水灯 04 花样流水灯 05 LED模拟交通灯 06 单只数码管循环显示0-9 07 8只数码管滚动...

    基于51单片机的TLC0838/TLV0838驱动程序

    基于51单片机C语言开发的TLV0838/TLC0838驱动程序。使用串口对采集到的值进行显示。

    单片机的ad转换程序(c语言)

    很有用的ad转换程序,对了解单片机的AD转换很有帮助

    51单片机基础应用设计C语言实例源码仿真300个合集.zip

    51单片机基础应用设计C语言实例源码仿真300个合集: 100000秒以内的计时程序 10秒的秒表 12864LCD图形滚动演示 128X64LED 160128LCD图文演示 1602字符液晶滚动演示程序 1602液晶显示的DS1302实时时钟 16×16点阵...

    wifi模块51单片机C语言程序

    "_WIFI模块51单片机C语言程序" 本资源摘要信息将详细介绍基于STC12C560S2单片机的无线WIFI模块控制内容,通过MCU上位机对ESP8266 WIFI模块的控制和设置,实现手机端控制LED灯的亮灭。下面是相关知识点: WiFi模块...

    wifi串口 51单片机 C语言

    * 单片机:STC12C560S2,普通 89C51 单片机的高速版本,具有 RAM1280 字节、ROM 60K、PCA 计数器、PWM 发生模块、ADC 转换模块等特征。 * led 灯:连接到单片机的 P0 口,用于实现 wifi 远程控制。 二、软件部分 *...

    基于单片机AT89c51的简易数字电压表设计

    本文旨在设计一个基于单片机AT89c51的简易数字电压表,通过对AT89c51单片机和ADC0808模拟数字转换器的应用,实现数字电压表的设计和实现。 一、引言 数字电压表是一种常用的测量设备,广泛应用于工业自动化、科学...

    基于51/52单片机温度烟雾报警c语言代码+protus仿真

    本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机 • 2.LCD1602液晶显示、DS18B20温度传感器、MQ-2烟雾传感器或MQ-5可燃气体传感器及ADC0809模数转换芯片 • 3.实时显示当前的烟雾值和温度值...

    用单片机制作多路输入电压表

    在工业控制和智能化仪表中,常 由单片机进行实时控制及实时数据处 理。单片机所加工的信息都是数字量, 而被控制或测量对象的有关参量往往 是连绥变化的模拟萤,如温度、速度、 ...转换的设备称为A/D转换器或ADC。

    单片机应用与实践指导

    《单片机应用与实践指导》重点介绍了MCS-51、MSP430和AVR系列单片机的器件应用选型指南、硬件资源、工作原理和实践指导,并从应用角度出发详细介绍了三种单片机的应用特点、C语言编程规则、中断系统、串口技术、接口...

    例说51单片机C语言第三版练习程序

    11-5 内含adc的51系列 305 11-6 认识温度传感器 307 11-7 实例演练 309 11-7-1 电压测量一 309 11-7-2 电压测量二 312 11-7-3 电压测量三 314 11-7-4 温度测量 317 11-7-5 adc的温控实验 319 11-7-6...

    51单片机与adc0809

    51单片机与ADC0809应用程序 51单片机是基于8051微处理器的单片机系统,广泛应用于工业控制、机器人、自动化控制等领域。ADC0809是常用的模拟数字转换器(Analog-to-Digital Converter),可以将模拟信号转换为数字...

Global site tag (gtag.js) - Google Analytics