直流电压表

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

1系统方案
1.1流程图
图1 主程序(左)和液晶模块(右)流程
1.2电路特色
设计以单片机AT89C52芯片为核心的简单电压测量电路,它由5V直流电源供电。

在硬件方面,通过可变电阻调节输入电压的变化来反映检测到的电压变化。

通过A/D转换后数字量在单片机AT89C52处理在转换成相应的实际电压,通过LCD1602显示器进行显示。

LCD显示电压实现零辐射、低功耗、散热小、体积小、图像还原精确、字符显示锐利等。

1.3功能介绍
该电压表由单片A/D转换器构成,在很大的电压情况下,电压表去测量时会对其并联很大的电阻分掉高压,然后再进行测量,这时本来很大的电压,到后来测出来的电压就会很小,这就是A/D转换实现低压电压表测量高压。

2硬件设计
2.1单片机AT89C52的简介
AT89C52是美国Atmel公司生产的低电压、高性能CMOS 8位单片机,片内含8KB的可反复檫写的程序存储器和12B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C52单片机可灵活应用于各种控制领域。

AT89C52单片机属于AT89C51单片机的增强型,与Intel公司的80C52在引脚排列、硬件组成、工作特点和指令系统等方面兼容。

其主要工作特性是:
①片内程序存储器内含8KB的Flash程序存储器,可擦写寿命为1000次;片内数据存储器内含256字节的RAM;
②具有32根可编程I/O口线;
③具有3个可编程定时器;
④中断系统是具有8个中断源、6个中断矢量、2个级优先权的中断结构;
⑤串行口是具有一个全双工的可编程串行通信口;
⑥具有一个数据指针DPTR;
⑦低功耗工作模式有空闲模式和掉电模式;
⑧具有可编程的3级程序锁定位;
⑨AT89C52工作电源电压为5(1+0.2)V,且典型值为5V;
⑩AT89C52最高工作频率为24MHz。

图2 AT89C52引脚图
2.2 ADC0832芯片的介绍
ADC0832 是美国国家半导体公司生产的一种 8 位分辨率、双通道 A/D 转换
芯片,其最高分辨可达 256 级,可以适应一般的模拟量转换要求。

其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在 0~5V 之间。

芯片转换时间仅为 32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。

独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。

通过 DI 数据输入端,可以轻易的实现通道功能的选择。

由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎。

(1)ADC0832 具有以下特点:
①8 位分辨率;②双通道 A/D 转换;
③输入输出电平与 TTL/CMOS 相兼容;
④5V 电源供电时输入电压在 0~5V 之间;
⑤工作频率为 250KHZ,转换时间为 32μS;
⑥一般功耗仅为 15mW;
⑦8P、14P—DIP(双列直插)、PICC 多种封装;
⑧商用级芯片温宽为0°C to +70°C,工业级芯片温宽为−40°C to +85°C。

(2) ADC0832芯片的引脚排列
图3 ADC0832芯片的引脚排列
芯片接口说明:
CS_ 片选使能,低电平芯片使能。

CH0 模拟输入通道 0,或作为 IN+/-使用。

CH1 模拟输入通道 1,或作为 IN+/-使用。

GND 芯片参考 0 电位(地)。

DI 数据信号输入,选择通道控制。

DO 数据信号输出,转换数据输出。

CLK 芯片时钟输入。

Vcc/REF 电源输入及参考电压输入(复用)。

(3) ADC0832 与单片机的接口电路:
图4 ADC0832 与单片机的接口电路
单片机对 ADC0832 的控制原理:正常情况下 ADC0832 与单片机的接口应为 4 条数据线,分别是 CS、CLK、DO、DI。

但由于 DO 端与 DI 端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将 DO 和 DI 并联在一根数据线上使用。

(见图4)
(4)ADC0832 芯片接口程序的编写
图 5 ADC0832 芯片接口程序的编写流程
2.3高精度电位器3296
(1) 电位器3296尺寸图
图6 电位器3296尺寸图
3296代表型号, 103代表阻值,即10后面再加3个0,合计为10000欧姆,也可描述为10K欧姆。

(2)电位器的作用——调节电压(含直流电压与信号电压)和电流的大小
(3)电位器的结构特点——电位器的电阻体有两个固定端,通过手动调节转轴或滑柄,改变动触点在电阻体上的位置,则改变了动触点与任一个固定端之间的电阻值,从而改变了电压与电流的大小。

2.4 JC-1A开发板
图7 JC-1A开发板
3 软件电路设计
3.1 系统总体框图
图8 系统总体框图
3.2 总电路原理图
图9 总体电路原理图
通过一个A/D(ADC0832模拟数字转换)芯片采集后将外测电压信号转换为数字信号,再由单片机(AT89C52)处理信号,输出信号,由LCD1602显示各路电压。

4 仿真与测试结果
4.1 电路仿真
图10 电路仿真图
4.2 电路测试
图11 电路测试图
本报告设计并制作了一个基于单片机STC89C52的0-20量程的直流电压表。

用ADC0832、高精度电位器和JC-1A开发设计一个能测量直流电压的电压表。

输入被测信号0-50V,显示精度到0.01V。

本设计用LCD1602显示结果。

实际测试结果与标准万用表测得误差为0.07V。

参考文献
[1]黄智伟.全国大学生电子设计竞赛.常用电路模块制作[M]. 北京:北京航空航天大学出版社,2011年,第1版.
[2]谭浩强.C程序设计(第四版)[M]. 北京:清华大学出版社,2010年,第4版.
[3]张友德.单片微型机原理、应用与实验[M].上海:复旦大学出版社,2005
[4]高吉祥·《电子技术基础实验与课程设计》[M]·电子工业出版社,2002年2月
[5]黄永定·《电子线路试验与课程设计》[M]·机械工业出版社,2005年8月
图12 PCB图
图13 实物图
附录3:程序
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code
table[]="0123456789";
uchar code table1[]=" volt:";
uchar code table2[]=" . V";
//定义adc0832
sbit CS=P3^7;
sbit Clk=P1^0;
sbit DATI=P1^1;
sbit DATO=P1^1;
//定义lcd1602
sbit lcdrs=P3^5;
sbit lcdrw=P2^1;
sbit lcde=P3^4;
long m, key,k;
uint dat=0;
uchar shi,feng,shifeng,ge,j;
//sbit temp=P2^7; //输出250khz脉冲
void delayms(uchar x)
{
uchar y;
while(x--)
{
for(y=120;y>0;y--);
}
}
//函数功能:AD转换子程序unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 ) //通道选择
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读
取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) //比较前8位与后8位的值,如果不相同舍去。

dat = test;
_nop_();
CS = 1; //释放
ADC0832
DATO = 1;
Clk = 1;
return dat;
}
void write_com(com)
{
lcdrs=0;
lcdrw=0;
lcde=0;
P0=com;
lcde=1;
delayms(5);
lcde=0;
}
void write_dat(date)
{
lcdrs=1;
lcdrw=0;
lcde=0;
P0=date;
lcde=1;
delayms(2);
lcde=0;
}
void lcd_init()
{
write_com(0x38);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
void main()
{
lcd_init();
key=1;
k=2;
for(j=0;j<16;j++)
{
write_dat(table1[j]);
}
while(1)
{
k=adc0832(0);
if(key!=k)
{
write_com(0x80+0x42); //
m=(float)(100*k*20/255);多乘了100是为了使得20/255是个整数,后面都除以100去掉了
// shi=((int)m)/1000;
// ge=((int)m)%1000/100; // feng=((int)m)%100/10; // shifeng=((int)m) % 10;
m=k*784;
shi=m/100000;
ge=m/10000%10;
feng=m/1000%10;
shifeng=m/100 % 10;
write_com(0x80+0x41);
for(j=0;j<6;j++)
{
write_dat(table2[j]);
}
key=k;
write_com(0x80+0x41);
write_dat(table[shi]);
write_com(0x80+0x42);
write_dat(table[ge]);
write_com(0x80+0x44);
write_dat(table[feng]);
write_com(0x80+0x45); write_dat(table[shifeng]);
}
}
}。

相关文档
最新文档