ADC0804在单片机中的简单应用举例
如下图所示,本例ADC0804中的VCC=5V, VREF/2引脚悬空(悬空则相当于与VCC共接5V电源),因此ADC转换的参考电压为VCC的值,即5V。VIN-接地,而VIN+连接滑动变阻器RV1的输出,因此VIN+的电压输入范围为0V~5V,正好处于参考电压范围内。
引脚接地, 和分别连接单片机的P3^6和P3^7引脚,而DB0~DB7连接单片机的P1口.
P0口接数码管的段选线,P2口低四位接数码管的位选线。
程序主要实现以下功能:
(1)控制ADC0804芯片对VIN(+)引脚输入的电压值进行正确采样,读取采样结果。
(2)对采样值进行模数变换,将转换后数字量后显示在4段数码管上。
C程序如下:
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit wr=P3^6;
sbit rd=P3^7;
uchar code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳显示代码
void delay(uint x) //延时函数 delay(1)延时0.992ms,大约为1ms
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}
void display(uchar db) //数码管显示函数,用于显示模数转换后得到的数字量
{
uchar bw,sw,gw; //bw,sw,gw分别等于db百位,十位,个位上的数
bw=db/100;
sw=db%100/10;
gw=db%10;
P2=0x01; //点亮第一只数码管
P0=dis[bw]&0x7f; //最高位置0,点亮第一只数码管的小数点,
delay(5);
P2=0x02; //点亮第二只数码管
P0=dis[sw];
delay(5);
P2=0x04; //点亮第三只数码管
P0=dis[gw];
delay(5);
P2=0x08; //点亮第四只数码管
P0=dis[0]; //第四只数码管一直显示0
delay(5);
}
void main()
{
uchar i;
while(1)
{
wr=0; //在片选信号CS为低电平情况下(由于CS接地,所以始终为低电平),
_nop_(); //WR由低电平到高电平时,即上升沿时,AD开始采样转换
wr=1;
delay(1); //延时1ms,等待采样转换结束
P1=0xff; //这条语句不能少,我也还不知道为什么
rd=0; //将RD脚置低电平后,再延时大于135ns左右(这里延时1us),
_nop_(); //即可从DB脚读出有效的采样结果,传送到P1口
for(i=0;i<10;i++) //刷新显示一段时间
display(P1); //显示从DB得到的数字量
}
}
Proteus仿真运行结果如下: