51单片机学习笔记:利用ADC0804模数转换器采集电压
扫描二维码
随时随地手机看文章
电位器调节待检测电压值,在数码管上显示出来,
代码大多从书上搬过来的,书上例5.3.1要求前3个数码管显示AD转换后的8位数字量(即0~255)
我这里让前4个数码管显示具体电压值,比如1.352
C代码
#include
#include"MY51.H"
voidinitSMG()//数码管初始化信息
{
//上电时,都为高电平
P0=0xff;
wela=open;
P0=0xff;
wela=lock;
P0=0;
dula=open;
P0=0;
dula=lock;
}
voidADC0804_csToLow()//cs置低电平
{
wela=open;//打开锁存器
P0=0x7f;//锁存器最高位送0,也就是CSAD置0
wela=lock;
}
voidADC0804_startConvert()//P3.6口是wr,由高到底,再拉高后,ad开始转换
{
adwr=high;//虽然原本就是高的,但我们要养成好习惯,该是什么就是什么
_nop_();
adwr=low;//wr置低后,过小会后AD内部开始执行转换,转换完成后INTR自动置低触发中断
_nop_();
adwr=high;
//由于我们用的不是150pF电容,而是104pF,所以转换比较慢,在调用本函数后最好延时10毫秒以上
}
uint8ADC0804_readResult()//读转换结果
{
uint8result=0;
//延时一会儿,转换就完成了,由于我们将INTR和CS都拉低了,直接操作RD后就可以读了
P1=0xff;//防止由于转换未完成原因引起的误读
adrd=high;
_nop_();
adrd=low;//rd置低电平后数据总线P1口得到数据,并由led显示现象
_nop_();
result=P1;
adrd=high;
//读完以后,如果ad芯片不用了,就把cs拉高,注销片选
returnresult;
}
voidshow(uint8value)//基准电压是2.5V为了计算方便扩大到2500
{
uint16temp=value*(2500/255.0);//扩大到4位整数,小数点另外附加显示
uint8oneWela,twoWela,threeWela,fourWela;//oneWela是最左边的数码管
oneWela=temp/1000;
twoWela=temp%1000/100;
threeWela=temp%100/10;
fourWela=temp%10;
displaySMG(oneWela,twoWela,threeWela,fourWela,dark,dark,dotTable[1]);//最左边的数码管显示小数点
}
voidmain()
{
uchari=0;
ucharadTemp=0;
initSMG();//数码管数据初始化
ADC0804_csToLow();//cs置低
while(1)
{
ADC0804_startConvert();//开始将电压数据转换成数字信号
for(i=5;i>0;i--)//主要是延时一段时间,让ad完成转换
{
delayms(1);
show(adTemp);//延时的时候,数码管继续动态显示
}
adTemp=ADC0804_readResult();//读取数据
show(adTemp);
}
}
C代码
#ifndef_MY51_H_
#define_MY51_H_
#include
#include
typedefintint16;
typedefintINT16;
typedefunsignedintuint16;
typedefunsignedintUINT16;
typedefunsignedshortuint;
typedefunsignedshortUINT;
typedefunsignedshortword;
typedefunsignedshortWORD;
typedefunsignedlonguint32;
typedefunsignedlongUINT32;
typedefunsignedlongDWORD;
typedefunsignedlongdword;
typedefsignedlongint32;
typedefsignedlongINT32;
typedeffloatfloat32;
typedefdoubledouble64;
typedefsignedcharint8;
typedefsignedcharINT8;
typedefunsignedcharbyte;
typedefunsignedcharBYTE;//WINDOWS的windef.h里面是这么定义的
typedefunsignedcharuchar;
typedefunsignedcharUCHAR;
typedefunsignedcharUINT8;
typedefunsignedcharuint8;
typedefunsignedcharBOOL;//windows中定义BOOL为int
typedefunsignedcharbool;//bool是c++的内置类型
#defineTRUE1
#definetrue1
#defineFALSE0
#definefalse0
#defineopen1//open和close用于标志打开和关闭状态
#defineOPEN1
#defineclose0
#defineCLOSE0
#definelock0
#definestart1
#defineSTART1
#definestop0
#defineSTOP0
#definekeyDown0
#definekeyUp1
#definegnd0//接地
#defineGND0//接地
#definehigh1//高电平
#definelow0//低电平
#defineyes1
#defineYES1
#defineno0
#defineNO0
sbitdula=P2^6;//段选锁存器控制控制笔段
sbitwela=P2^7;//位选锁存器控制控制位置
#defineledP1//灯总线控制
sbitled0=P1^0;//8个led灯,阴极送低电平点亮
sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
sbitled4=P1^4;
sbitled5=P1^5;
sbitled6=P1^6;
sbit led7=P1^7;