- 10
- 0
- 约4.29千字
- 约 6页
- 2018-04-29 发布于河南
- 举报
路数字电压表的设计
实验报告
一、实验题目: 8路数字电压表的设计
二、实验内容:
利用单片机AT89C52与ADC0809设计一个8路数字电压表,能够测量0-5V之间的8路输入电压值,并能在四位数码管上显示。
三、要求:
基本要求:1、有一路正常工作
2、制作PCB板
发挥部分: 1、显示各路电压数及其电压值
2、可通过按键进行通道选择
3、当超过某一设定值时报警
四、设计方案
通过一个A/D(ADC0809模拟数字转换)芯片采集后将外测电压信号转换为数字信号,再由单片机(AT89C52)处理信号,输出信号,由数码管显示各路电压。更改程序使能用按键进行复位、通道选择、单路循环选择;并在超过设定报警电压(4.7V)时以LED灯发光报警。
五、芯片、电路图
1、使用芯片有ADC0809、AT89C52。
2、电路图:
六、焊接
根据原理图将原件焊接到PCB板上。
七、编程序、调试
1、程序设计内容 1由于ADC0809在进行A/D转换时需要有CLK信号,而此时的ADC0809的CLK是接在AT89S51单片机的P3.3端口上,也就是要求从P3.3输出CLK信号供ADC0809使用。因此产生CLK信号的方法就得用软件来产生了。 2由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (D/256*VREF)
2、调试过程
1在实验过程中,发现了数码管显示的电压在测试的那一路电压正常显示,而其他路为不定的电压值(电压为悬浮电压),加一个排阻接地后使它和低电平相连,在未加电压的情况下为低电平,数码管显示值为0值。
2用原程序进行调试时,不执行报警和通道选择、单路循环选择(原程序少了通道选择函数和报警函数)。多次修改和添加原程序后能够达到要求。
3、C语言源程序
#include reg52.h
#include intrins.h //延时函数用
#define ad_con P2 //A/D控制口
#define addata P0 //A/D数据记入读入口
#define Disdata P1 //显示数据段码输出口
#define uchar unsigned char
#define uint unsigned int
sbit ALE=P2^3; //锁存地址控制位
sbit START=P2^4; //启动一次转换位
sbit OE=P2^5; //0809输出数据 控制位
sbit EOC=P3^7; //转换结束标志位
sbit DISX=Disdata^7; //LED小数点
sbit A=P2^7;
sbit BO=P3^5;
sbit CO=P3^6;
//
//
uchar code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*共阳7段LED段码表0.1.2.3.4.5.6.7.8.9.不亮*/
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //4位列扫描控制字
////uchar data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //定义8个数据内存单元
uint data dis[5]={0x00,0x00,0x00,0x00,0x00}; //定义4个显示数据单元和1个数据存储单元
//
//
/**********1ms延时子函数***********/
delaylms(uint t) //t=1
{
uint i,j;
for(i=0;it;i++)
for(j=0;j120;j++)
;
}
//
//
/************显示扫描子函数***************/
scan()
{
uchar k,n;
int h;
dis[3]=0x01; //通道初值为1
for(n=0;n8;n++) //每次显示8个数据
{
dis[2]=ad_data[n]/51; //测得值转换为3位BCD码,
原创力文档

文档评论(0)