‘壹’ 求STC12C5204单片机AD功能如何使用,例如,用其中一个I/O做为AD采样一个2V左右的电压,并通过数码管显示
//本程序主要演示了
//1、12864液晶的编程与使用,包括显示定位、4位整数、显示浮点数等
//2、STC12C5A32S2单片机的ADC 采样功能(以第0、1通道为例)
//
//注:本示例仅仅演示如何进行ADC 和显示,每ADC 一次就显示一次,实际应用时,
//应多次ADC 并进行相应处理,比如取平均值后,才能得到比较稳定的AD 值
//广西民族大学物电学院李映超2010.5.26
/* 板子的硬件连接
1、1602液晶显示模块的连接:RS:P2.4、EN:P2.5、数据口: P0
2、蜂鸣器:P2.3 低电平有效(发出声音)
3、继电器:P2.2 低电平有效(继电器吸合、两输出脚短路)
4、18B20数据输出脚(DQ):P2.1
5、红外遥控输出脚:P2.0
6、直流电压精密可调电阻输出:P1.0 可通过跳线帽断开
7、光敏电阻:P1.1 可通过跳线帽断开
8、按键:均通过二极管连接到P3.2(外部中断0口),低电平有效,下降沿触发
K0:P3.3、K1:P3.4、K2:P3.5、K3:
P3.6、K4:P3.7
9、24C02连接:
SDA:P2.7 (上拉有发光二极管,低电平亮)
SCL:P2.6 (上拉有发光二极管,低电平亮)
*/
#include <reg52.h>
#include<intrins.h>
#include<lcd12864s.h>
#define uint unsigned int
#define uchar unsigned char
sbit light=P2^7;//定义工作指示灯与单片机的连接脚
//---------与STC12C5A32S2单片机ADC 相关的寄存器声明------------------
sfr P1ASF =0x9d; //P1口模数转换功能控制寄存器
sfr ADC_CONTR =0xbc; //AD 转换控制寄存器
sfr ADC_RES =0xbd; //AD 转换结果寄存器高
sfr ADC_RESL =0xbe; //AD 转换结果寄存器低
sfr AURX1 =0xa2; //AD 转换结果存储方式控制位
//------------------------------------------------------------------
//P1ASF 寄存器:8位,对应P1口8根口线,用于指定哪根口线用作ADC 功能
//哪个口用作ADC 就应置相应的位为“1”,注意:不能位寻址
//------------------------------------------------------------------
#define ADC_POWER 0x80 //ADC 电源开
#define ADC_SPEED 0x60 //设为90个时钟周期ADC 一次
#define ADC_START 0x08 //ADC 启动控制位设为开
#define ADC_FLAG 0x10 //ADC 结束标志位
/*
ADC_CTRL 寄存器:
ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_STAR CHS2 CHS1 CHS0
1 2 3 4 5 6 7 8
第1 位: =1 打开ADC 电源;=0 关闭ADC 电源; ADC 前要一定要打开
第2-3位: =1 1 90个时钟周期ADC 一次; =1 0 180个时钟周期ADC 一次;
=0 1 360个时钟周期ADC 一次; =0 0 540个时钟周期ADC 一次;
第4位: ADC 结束标志位,每次ADC 结束时自动=1,需要用软件清零才可以进行下一次ADC
第5位: ADC 启动控制位,置“1”则ADC 转换开始,转换结束后为0
第6-7-8位:ADC 通道选择000-->P1.0 ........111-->P1.7
*/
//-------------------------------------------------------------
void ADC_int(uchar n) //第n 通道ADC 初始化函数
{
n&=0x07; //确保n=0----7通道
AURX1|=0x04; //转换结果存储格式:数据的高2位放ADC_RES,低8位放ADC_RESL
P1ASF=1<<n; //将P1.n 设为ADC 采样功能
}
//---------------------------------------------------------------
uint ADC_GET(unsigned char n) //第n 通道ADC 采样函数
{
unsigned int adc_data;
n&=0x07; //确保n=0----7通道
ADC_RES=0; //清零
ADC_RESL=0; //清零
ADC_CONTR=0; //清零,以便重构
ADC_CONTR|=(ADC_POWER|ADC_SPEED|n|ADC_START); //打开AD 转换电源,设定转换速度、设定通道号、AD 转换开始
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //延时4个时钟周期左右
while(!(ADC_CONTR&ADC_FLAG)); //等待转换结束=0x10 ADC_FLAG 位=1
adc_data=(ADC_RES&0x03)*256+ADC_RESL; //转换结果计算,取高位结果存储器的低2位+ 低位结果存储器
ADC_CONTR&=~ADC_FLAG;//清零转换结束标志位(ADC_FLAG 位=0)
return adc_data; //返回ADC 的值(0----1023)
}
void lcd_4_char(unsigned int data_4_char) //在1602LCD 上显示一个4位的整数
{
unsigned char lcd_table[4];
lcd_table[0]=data_4_char/1000; //获得千位的数字
lcd_table[1]=data_4_char%1000/100; //获得百位的数字
lcd_table[2]=data_4_char%100/10; //获得十位的数字
lcd_table[3]=data_4_char%10; //获得个位的数字
Lcd_WriteData(lcd_table[0]+0x30); //显示千位
Lcd_WriteData(lcd_table[1]+0x30); //显示百位
Lcd_WriteData(lcd_table[2]+0x30); //显示十位
Lcd_WriteData(lcd_table[3]+0x30); //显示个位
}
void main()
{ unsigned int ad_0,ad_1;
ad_0=0;
ad_1=0;
Lcd_Init(); //12864液晶模块初始化
light=0;delayms(1000);light=1; //灯闪一下,表示上电准备工作
ADC_int(0); //ADC 通道0初始化
ADC_int(1); //ADC 通道1初始化
while(1)
{
ad_0=ADC_GET(0);//第0通道进行ADC 采样
ad_1=ADC_GET(1);
hanzi_disp(0,1,"单片机转换");
hanzi_disp(1,0,"通道0:");
lcd_4_char(ad_0);
//while(1){;};
//delay_ms(30000);
hanzi_disp(2,0,"通道1:");
lcd_4_char(ad_1);
hanzi_disp(3,1,"--------");
//delayms(1000); //适当延时后再进行下一循环
}
}
‘贰’ STC12LE5204AD(3.3V单片机)——AD的参考电压是多少,是3.3V吗
STC12C5204AD 与 STC12LE5204AD 只是电源电源 不同,基本功能是一样的
用 AD 功能 其测量基准都为电源电压,测量最大值也是 电源电压。
如果 同时检测 3 V 电压 得到的数值 5V单片机 为 135.6 ,3V单片机 为 256
如果 电源 3.3V 则为 232.7,其结果应该是 (256/VCC)*被检测电压
256 是 8位AD, 如果10位AD 为1024, 12位AD 为4096