51单片机测量5V电压

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机测量5V电压

数字电压表

1. 实验任务

利用单片机STC89C52与ADC0809设计一个数字电压表,能够测量0-5V 之间的直流电压值,四位数码显示。

2. 现有元件

模数转换器ADC0804,STC89C52单片机,两个共阳极数码管。

3. 硬件设计

3.1 模数转换器ADC0809与单片机STC89C52的连接

(1) ADC0809规格及引脚分配图如下图3-1所示:

图3-1 ADC0809引脚图

(2) STC89C52各个引脚分布如下图3-2所示:

图3-2 STC89C52引脚图

(3) 硬件连线

(a) 把“单片机系统”区域中的P3.0与”模数转换模块ADC0809“区域中的ST 端子用导线

相连接。

(b) 把“单片机系统”区域中的P3.1与”模数转换模块ADC0809“区域中的ALE 端子用导线相连接。

(c) 把“单片机系统”区域中的P3.2与”模数转换模块ADC0809“区域中的OE 端子用导线相连接。

(d) 把“单片机系统”区域中的P3.6与”模数转换模块ADC0809“区域中的EOC 端子用导线相连接。

(e) 把“单片机系统”区域中的P3.7与”模数转换模块ADC0809“区域中的CLK 端子用导线相连接。

(f) 把“模数转换模块ADC0809”区域中的ADDA 、ADDB 、ADDC 端子用导线连接到单片机的VCC 端子上。把“模数转换模块ADC0809”区域中IN7与外接输入电压相连。

(g) 把“单片机系统”区域中的P2.0-P2.7连接到“模数转换模块ADC0809”区域中

D0D1D2D3D4D5D6D7端子上。

(h) 把“单片机系统”区域中的P1.0-P1.7连接到“数码管”区域中ABCDEFG 端子上。把“单片机系统”区域中的P0.0-P0.1连接到“数码管”区域中12端口。

4. 电路原理图

图4 电路原理图

5. 程序设计内容

由于ADC0809在进行A/D转换时需要CLK 信号,而此时ADC0809的CLK 是接在单片

机的P3.7口,也就是要求从P3.7输出CLK 信号供ADC0809使用。因此产生CLK 信号的

方法就要用软件来产生。

6. C语言源程序

#include

sbit ALE = P3^1;

sbit ST = P3^0;

sbit EOC = P3^2;

sbit OE = P3^6;

sbit CLK = P3^7;

sbit wexuan1=P0^0;

sbit wexuan2=P0^1;

//sbit IN1 = P0^5;

//sbit IN2 = P0^6;

//sbit IN3 = P0^7;

unsigned int code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90}; //段码表

unsigned int n=0,flag1=1;flag=1,ad_data,num1=0,num2=0; void delay(xms)

{

unsigned int x,y;

for(x=xms;x>0;x--)

for(y=110;y>0;y--);

}

void display()//2位数码管显示

{

float a;

a=(float)ad_data/256*5*1000;

num1=(int)a/1000;

num2=(int)a/100-num1*10;

P1=table[num1];

wexuan1=1;

delay(1);

wexuan1=0;

P1=0xff;

P1=0x7f; //小数点

wexuan1=1;

delay(1);

wexuan1=0;

P1=0xff;

P1=table[num2];

wexuan2=1;

delay(1);

wexuan2=0;

P1=0xff;

}

void init()

{

ST = 0;

ALE = 0;

OE = 0;

CLK = 0;

// _EOC= 1;

TMOD=0x12;IP=0x09;

TH0=(65536-22)/256;

TL0=(65536-22)%256;

TH1=(65536-45872)/256;

TL1=(65536-45872)%256;

EA=1;

ET0=1;ET1=1;

TR0=1;TR1=1;

EX0=1;//打开外部中断

IT0=1;//从高到低的负跳变有效

P0=0x00;

}

void start() //int a,int b,int c) //选择通道 {

// IN1 = a;IN2 = b;IN3 = c; ALE = 0;ALE = 1;

ST = 0;ST = 1;

ALE = 0;ST = 0;

display();

delay(10);

}

int read()

{

unsigned int dat;

P2 = 0xff;

OE = 1;

display();

dat = P2;

OE = 0;

return (dat);

}

void main()

{

init();

while(1)

{ ST = 0;

ST = 1;

ST = 0;

if(n==20)

相关文档
最新文档