数字电压表的设计 - 图文

更新时间:2023-09-29 12:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机原理 课程结业报告

题目(14): (数字电压表的设计)

学号:031240634 姓名:刘漫

一、 设计要求

以单片机为核心,设计一个数字电压表。采用中断方式,对2路0~5V的模拟电压进行循环采集,采集的数据送LED显示,并 存入内存。超过界限时指示灯闪烁。

二、 设计原理

以单片机为控制器,ADC0809为ADC器件的AD 转换电路,设计要求的电压显示,是对ADC采集所得信号的进一 步处理。为得到可读的电压值,需根据ADC的原理,对采集所得的信号进行计算,并显示在LED上。本项目中ADC0809的参考电压为+5V,根据定义,采集所得的二进制信号addata所指代的电压值 为:

adata?5V 256而若将其显示到小数点后两位,不考虑小数点的存在(将其乘以100),其计算的数值为:

addata?100?5V?addata?1.96V

256。将小数点显示在第二位数码管上,即为实际的电压。本示例程序将1.25 V和2.5 V作为两路输入的报警值,反映在二进制数字上,分别为0x40和0x80。当AD结果超过这一数 值时,将会出现二极管闪烁和蜂鸣器发声。

三、 设计电路图

3.1设计思路

1、根据设计要求,选择AT89C51单片机为核心控制器件。

2、A/D转换采用ADC0809实现,输出端口与单片机的接口为P1口,时钟等端口与P2口的低四位引脚相连。

3、数字电压显示采用LCD显示。

3.2系统组成

硬件电路设计由3个部分组成:A/D转换电路,AT89C51单片机系统,LCD显示系统。硬件电路设计框图如图所示:

模拟电压 ADC0809 转换 AT89C51单片机 数据显示

数字电压表系统硬件设计框图

3.3原理图

四、 核心代码设计思路及程序流程图

4.1程序设计方案

根据模块划分的原则,将该程序划分为初始化模块、A/D转换子程序和显示子程序,这三这个程序模块构成了整个系统软件的主程序,如图1如所示:

开始 初始化 否 调用A/D转换子程序 调用显示子程序 是 结束

图1 数字式直流电压表主程序框图

4.2系统子程序设计

4.2.1子程序初始化

所谓初始化,是对将要用到的AT89C51单片机内部部件或者扩展芯片进行初始工作状态设定,主要设置定时器的工作模式、初值预置、开中断和打开定时器等。

4.2.2 A/D转化子程序

A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图2所示。

开始 启动转换 否 A/D转换结束 是 输出转换结果 数值转换 显示 结束

五、 Proteus仿真图

电压较小时

电压接近报警值时

电压达到报警值后

达到最大测量范围值时

六、 Keil核心源代码

#include \ #include #define uchar unsigned char #define uint unsigned int uchar code normal[]=\ %uchar code abnormal[]=\

sbit ST_ALE=P3^0; //START and ALE both connect to P3.0 sbit EOC=P3^1; //EOC connect to P3.1 sbit OE=P3^2; //OE conect to P3.2 sbit CLK=P3^3; sbit lcdrs=P2^4; sbit lcdrw=P2^5; sbit lcden=P2^6; sbit beep=P3^4; sbit led=P3^5;

unsigned char CHANNEL; //AD channel variable uchar code num[]=\

/*

void delay(unsigned char time) {

unsigned char i,j; for(i=time;i>0;i--) for(j=250;j>0;j--) ; } */

void delay(uint x) { }

void write_com(uchar com ) { }

void write_data(uchar date) { } void init() { }

lcden=0; lcdrw=0;

write_com(0x38);//lcd显示模式,16x02;8接口 write_com(0x0c);//开显示,显示光标,光标闪烁 write_com(0x06);//地址自加,字符不整屏移动; write_com(0x01);//清屏; lcden = 0;

lcdrs = 1;//n.1 write into the data; P1 = date; delay(5); lcden=1; delay(5); lcden=0; lcden = 0;

lcdrs = 0;//表示命令选择 P1 = com; delay(5); lcden=1; delay(5); lcden=0; uint i; for(;x>0;x--)

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

void display(uchar channel) {

unsigned long temp;

unsigned char DATA,count,digit[4]; unsigned int k=0,i=0;

DATA=P0; //save AD data

temp=DATA; //the temporary variable

temp=temp*1000/51; //AD formula:D=A*5/255 digit[0]=temp/1000; //the thousands place digit[1]=temp00/100; //the hundreds place digit[2]=temp000/10; //the tens place digit[3]=temp000; //the ones place

if(channel==0) {

write_com(0x80); write_data('1'); write_data('=');

write_data(num[digit[0]]); write_data('.');

write_data(num[digit[1]]); write_data(num[digit[2]]); write_data(num[digit[3]]); write_com(0x80+0x08); }

if(channel==1) {

write_com(0x80+0x40);

if(DATA>0x40) { } else { }

for(count=0;count<8;count++) { }

write_data(normal[count]); for(count=0;count<8;count++) { } beep=1;

write_data(abnormal[count]);

write_data('V');

beep=0;

write_data('V'); }

void main() {

CHANNEL=0xF8; //AD channel 0 ST_ALE=0; //START and ALE default OE=0; //OE default

TMOD=0x02; //T0 operate in mode 2 TH0=0xFF; //auto load value TL0=0xFF; //default value EA=1; //all interrupt enable ET0=1; //T0 interrupt enable TR0=1; //T0 run init(); beep=0; led=0; while(1) {

write_data('2'); write_data('=');

write_data(num[digit[0]]); write_data('.');

write_data(num[digit[1]]); write_data(num[digit[2]]); write_data(num[digit[3]]); write_com(0x80+0x40+0x08); }

if(DATA>0x80) { } else { }

for(count=0;count<8;count++) { }

write_data(normal[count]); for(count=0;count<8;count++) { } led=1;

write_data(abnormal[count]);

led=0;

P2=0x07&CHANNEL; //choose AD channel ST_ALE=1; //lock the AD channel address ST_ALE=0; //AD run

while(EOC==0); //wait until AD over OE=1; //enable to transmit AD data if(CHANNEL==0xF8) {

display(0); //view the AD result and diaplay LED }

if(CHANNEL==0xF9) {

display(1); //view the AD result and diaplay LED }

delay(50); //delay to prepare for next AD channel OE=0; //forbit to transmit AD data if(CHANNEL==0xF9)

CHANNEL=0xF7; //AD channel loop CHANNEL++; //next AD channel } }

void T1_TIME() interrupt 1 using 0 {

CLK=~CLK; //CLK 500 kHz }

P2=0x07&CHANNEL; //choose AD channel ST_ALE=1; //lock the AD channel address ST_ALE=0; //AD run

while(EOC==0); //wait until AD over OE=1; //enable to transmit AD data if(CHANNEL==0xF8) {

display(0); //view the AD result and diaplay LED }

if(CHANNEL==0xF9) {

display(1); //view the AD result and diaplay LED }

delay(50); //delay to prepare for next AD channel OE=0; //forbit to transmit AD data if(CHANNEL==0xF9)

CHANNEL=0xF7; //AD channel loop CHANNEL++; //next AD channel } }

void T1_TIME() interrupt 1 using 0 {

CLK=~CLK; //CLK 500 kHz }

本文来源:https://www.bwwdw.com/article/1khd.html

Top