杜洋工作室 DoYoung Studio
- MCS-51系列单片机C语言编程ADC模/数转换器程序模板
- 适用于STC系列内嵌ADC功能的单片机产品
- 单片机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
//单片机头文件 #include
//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读出值送入串口显示 } }/**********************************************************************************************/ /************************************************************* * 杜洋工作室 www.DoYoung.net /*************************************************************/
- 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
//单片机头文件 #include
//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 } }/**********************************************************************************************/ /************************************************************* * 杜洋工作室 www.DoYoung.net /*************************************************************/
- 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 可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。
- 使用说明
下载 Download
-
电路原理图 Schematic
链接 Links
-
STC系列单片机数据手册
更多 More
-
杜洋工作室首页
-
论坛服务
-
联系方式