立即注册 登录
返回首页

uid:167525的个人空间

日志

ADC0804工作原理及其在单片机中的应用 基于Proteus仿真

已有 1962 次阅读2017-8-6 15:02

ADC0804在单片机中的简单应用举例

如下图所示,本例ADC0804中的VCC=5VVREF/2引脚悬空(悬空则相当于与VCC共接5V电源),因此ADC转换的参考电压为VCC的值,即5VVIN-接地,而VIN+连接滑动变阻器RV1的输出,因此VIN+的电压输入范围为0V5V,正好处于参考电压范围内。

引脚接地, 和分别连接单片机的P3^6P3^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仿真运行结果如下:


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部