625基于51单片机的数字电压表设计资料.docx

上传人:b****3 文档编号:4927937 上传时间:2023-05-07 格式:DOCX 页数:21 大小:213.82KB
下载 相关 举报
625基于51单片机的数字电压表设计资料.docx_第1页
第1页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第2页
第2页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第3页
第3页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第4页
第4页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第5页
第5页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第6页
第6页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第7页
第7页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第8页
第8页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第9页
第9页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第10页
第10页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第11页
第11页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第12页
第12页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第13页
第13页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第14页
第14页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第15页
第15页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第16页
第16页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第17页
第17页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第18页
第18页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第19页
第19页 / 共21页
625基于51单片机的数字电压表设计资料.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

625基于51单片机的数字电压表设计资料.docx

《625基于51单片机的数字电压表设计资料.docx》由会员分享,可在线阅读,更多相关《625基于51单片机的数字电压表设计资料.docx(21页珍藏版)》请在冰点文库上搜索。

625基于51单片机的数字电压表设计资料.docx

625基于51单片机的数字电压表设计资料

 

《单片机技术及其应用》

课程设计报告

 

题目:

数字电压表的设计

班级:

学号:

姓名:

同组人员:

指导教师:

 

2014年06月25日

目录

1.设计要求及方案1

1.1设计要求1

1.2方案论证及选择1

1.2.1主要设计图1

1.2.2主控芯片1

1.2.3显示部分1

2.主要器件2

2.151单片机2

2.2ADC模数转换芯片3

2.3数码管4

3.设计原理5

3.1设计思路5

3.2设计模块6

3.2.1模数转换模块6

3.2.2数据处理及控制模块7

4.硬件电路设计7

4.1单片机接入的电路7

4.2晶振电路8

4.3复位电路8

4.4模拟输入电路9

4.5ADC芯片与单片机接口电路9

4.6显示电路10

5.软件设计11

5.1程序流程图11

5.2程序设计11

5.2.1主程序11

5.2.2显示程序12

6.调试焊接疑难解决14

6.1调试电路14

6.2硬件焊接制作步骤14

6.3疑难及解决方案14

7.心得体会14

8.指导老师意见15

附录15

数字电压表的设计

1.设计要求及方案

1.1设计要求

采用51系列单片机和ADC设计一个数字电压表,采用了数字芯片A/D转换、单片机控制的数码管显示、单片机的数据处理,输入为0~5V线性模拟信号,输出通过LED显示,要求显示两位小数。

1.2方案论证及选择

1.2.1主要设计图

电压采集

模数转换

单片机处理

数码管显示

图1-2-1设计方框图

1.2.2主控芯片

选用单片机AT89C51和A/D转换芯片ADC0809实现电压的转换和控制,用四位数码管显示出最后的转换电压结果。

缺点是价格稍贵;优点是转换京都高,且转换的过程和控制、显示部分可以控制。

1.2.3显示部分

方案1:

选用4个单体的共阴极数码管。

优点是价格比较便宜;缺点是焊接时比较麻烦,容易出错。

方案2:

选用一个四联的共阴极数码管,外加四个三极管驱动。

这个电路几乎没有缺点;优点是便于控制,价格低廉,焊接简单。

基于课程设计的要求和实验室所能提供的仪器,选用了:

方案2。

 

2.主要器件

2.151单片机

图2-1AT89C51单片机

AT89C51是51系列单片机的一个型号,它是ATMEL公司生产的。

AT89C52是一个低电压、高性能CMOS8为单片机。

将通用的微处理器和Flash存储器结合在一起,可反复擦写的Flash存储器可有效地降低开发成本。

AT89C51有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。

主要功能特性:

低功耗空闲和掉电模式,软件设置睡眠和唤醒功能。

兼容MCS51指令系统,8K可反复擦写(>1000次)FlashROM。

3个16位可编程定时/计数器中断,时钟频率0-24MHz。

32个双向I/O口,256B内部RAM。

2个串行中断,可编程UART串行通道。

2个外部中断源,共6个中断源。

2个读写中断口线,3级加密位。

2.2ADC模数转换芯片

图2-2ADC0808图

ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。

其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。

ADC0808是ADC0809的简化版本,功能基本相同。

一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。

引脚功能(外部特性)

ADC0808芯片有28条引脚,采用双列直插式封装,如右图所示。

各引脚功能如下:

1~5和26~28(IN0~IN7):

8路模拟量输入端。

8、14、15和17~21:

8位数字量输出端。

22(ALE):

地址锁存允许信号,输入,高电平有效。

6(START):

A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。

7(EOC):

A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。

9(OE):

数据输出允许信号,输入,高电平有效。

当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。

10(CLK):

时钟脉冲输入端。

要求时钟频率不高于640KHZ。

12(VREF(+))和16(VREF(-)):

参考电压输入端

11(Vcc):

主电源输入端。

13(GND):

地。

23~25(ADDA、ADDB、ADDC):

3位地址输入线,用于选通8路模拟输入中的一路。

2.3数码管

图2-3共阴极四位数码管

数码管有两种:

一种共阴极、另一种为共阳极,本次课程设计用的是共阴极。

下面比较详细说明共阴极与共阳极的共同点与区别:

图2-4共阴极与共阳极区别图

图2-4中(b)的左边为共阴极数码管,也就是数码管的阴极管接地。

那时某段亮,这段就必须接高电平。

共阴极数码管0~9的C51编码为:

ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f};

ucharcodetable[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

其中1不带小数点,2带小数点。

共阳极就是数码管的每段都接高电平,这样要是哪段亮就这段就得接地。

3.设计原理

3.1设计思路

模拟电压经过档位切换到不同的分压电路筛减后,经隔离干扰送到A/D转换器进行A/D转换。

然后送到单片机中进行数据处理。

处理后的数据送到LED中显示。

同时通过串行通讯与上位通信。

硬件电路及软件程序。

而硬件电路又大体可分为A/D转换电路、LED显示电路,各部分电路的设计及原理将会在硬件电路设计部分详细介绍;程序的设计使用汇编语言编程,利用Keil和PROTEUS软件对其编译和仿真。

一般I/O接口芯片的驱动能力是很有限的,在LED显示器接口电路中,输出口所能提供的驱动电流一般是不够的尤其是设计中需要用到多位LED,此时就需要增加LED驱动电路。

驱动电路有多种,常用的是TTL或MOS集成电路驱动器,在本设计中采用了74LS244驱动电路。

本实验采用AT89C51单片机芯片配合ADC0808模/数转换芯片构成一个简易的数字电压表。

该电路通过ADC0808芯片采样输入口IN0输入的0~5V的模拟量电压,经过模/数转换后,产生相应的数字量经过其输出通道D0~D7传送给AT89C51芯片的P0口。

AT89C51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码,并通过其P1口传送给数码管。

同时它还通过其三位I/O口P1.0、P1.1、P1.2、P1.3产生位选信号,控制数码管的亮灭。

另外,AT89C51还控制着ADC0808的工作。

其ALE管脚为ADC0808提供了1MHz工作的时钟脉冲;P2.4控制ADC0808的地址锁存端(ALE);P2.1控制ADC0808的启动端(START);P2.3控制ADC0808的输出允许端(OE);P2.0控制ADC0808的转换结束信号(EOC),总体思路如下图3-1。

图3-1设计思路图

3.2设计模块

3.2.1模数转换模块

电路原理图如下所示,三个地址位ADDA,ADDB,ADDC均接高电平+5V电压,因而所需测量的外部电压可由ADC0808的IN7端口输入。

由于ADC0808

在进行A/D转换时需要有CLK信,本设计中利用AT89C51的定时中断产生一个100KHZ的脉冲,由P1.4口送给ADC0808的时钟端,通过软件给其输入一个正脉冲,可立即启动A/D转换。

在软件设计中,由于我们对单片机知识还没能很熟练的掌握,用中断方式较复杂,且这个程序CPU工作量不大,查询方式对速度不会产生影响,所以我们采用查询方式,确保仿真的进度和准确度。

图3-2系统原理图

在A/D转换开始之前,逐次逼近寄存器的SAR的内容为0,在A/D转换过程中,SAR存放“试探”数字量,在转换完毕后,它的内容即为A/D转换的结果数字量。

逻辑控制与定时电路在START正脉冲启动后工作,没来一个CLK脉冲,该电路就可能告知向SAR中传送一次试探值,对应输出U0与U1比较,确定一次逼近值,经过8次逼近,即可获得最后转换的结果数字量。

此处,EOC端口的信号显示ADC0808的状态,开始A/D转换时,EOC为低电平,转换结束后,输出高电平。

3.2.2数据处理及控制模块

A/D转换完毕后,单片机的P1.6口接收到一高电平,立马通过P2将OE置1,ADC0808的三态输出锁存器被打开,转换完的数字信号经过与D0~D7相连的P0口进入AT89C51。

AT89C51根据公式1-1将数字信号转换为模拟量,然后利用程序获取模拟量的每一位,分别通过P2口输出到LED上。

与此同时,AT89C51会通过P2.0~P2.3口选择用哪一段LED显示所传出的数据。

例如,当P2.0~P2.3=1110,则LED接收到的数据会在第四段LED上显示。

另外,AT89C51一旦获得了数据后便会将ST置0,即模数转换器停止转换,知道LED获得新的数据并显示出来,ST才会重新置1.由于AT89C51转换速率很快(微妙量级),所以不会影响其接收新的数据。

4.硬件电路设计

4.1单片机接入的电路

图4-1单片机电路

AT89C51单片机芯片接受ADC0808模/数转换芯片把模拟量电压转换后产生相应的数字量送入P0口,然后AT89C51把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码,并通过其P1口传送给数码管。

同时它还通过其三位I/O口P1.0、P1.1、P1.2、P1.3产生位选信号,控制数码管的亮灭。

4.2晶振电路

图4-2晶振电路

接12MHz晶振,根据芯片手册,适合并联30pf微调电容,从而构成并联谐振,帮助和稳定输出波形。

4.3复位电路

图4-3复位电路

AT89C51单片机要求至少两个高电平,以便单片机做好准备工作。

当上电时,由于电容的电压不能突变,会输出高电平,当电容充电到一定程度,就会输出低电平,单片机利用输出高电平的这段时间复位。

电阻和电容的值选择要合适。

在这要求R1<

,R2=10

 

4.4模拟输入电路

图4-4模拟输入电路

通过可变电阻一端接电源+5v,一端接地GND,通过改变电阻的阻值,从而改变所测电压值,实现电压的模拟信号输入。

4.5ADC芯片与单片机接口电路

图4-5ADC芯片与单片机接口电路

ADC0808的输出接到P1口,OUT1对应的是最高位,START与ALE可以接在一起。

在这里,START接P3.0,OE接P3.1,EOC接P3.2,ClOCK接P3.4。

4.6显示电路

图4-6显示电路

通过P0口控制四位共阴极数码管段选,通过P2口的低四位控制位选。

值得注意的是P0需要接上拉电阻,否则P0会处于高阻态。

设计原理:

将模拟量通过IN0输入,经过ADC0808芯片转换,得到数字量输出到单片机P0口,经过单片机处理后,送到四位共阴极数码管上显示。

仿真图如图4-7

图4-7仿真图

 

5.软件设计

5.1程序流程图

图5-1程序流程图

5.2程序设计

5.2.1主程序

在转换期间,EOC处于低电平,因此在AD转换开始前EOC置为低电平,START在上升沿期间将芯片内的所有寄存器清零,在下降沿来临时开始转换,由于所用的时钟为100KHz,比较的缓慢不需要再延时,在此等待转换结束,结束后将其数字量输出。

voidmain(void)

{

ET0=1;//开定时器中断0

EA=1;//开中断

TMOD=0x02;//设置定时器0工作模式2

TH0=216;//设置时延

TL0=216;

TR0=1;//打开定时器0

while

(1)

{

START=1;

START=0;//启动转换

while(EOC==0);//等待模数转换结束

OE=1;

tvdata=P1;//读取ADC0808的转化后的8位数据

tvdata*=20-0.01;//对数据进行处理,这个和参考电压有关系

OE=0;

ledxianshi();//数码管显示

delay();

}

}

5.2.2显示程序

voiddelay(void)

{

uinti;

for(i=0;i<10;i++);//简单延时

}

/*数码管显示函数*/

voidledxianshi(void)

{

uchark,i;

if(tvdata>5000)

tvdata=5000;

led[0]=tvdata%10;//取tvdata的个位

led[1]=tvdata/10%10;//取十位

led[2]=tvdata/100%10;//取百位

led[3]=tvdata/1000;//取千位

for(k=0;k<4;k++)//循环显示四位数码管

{

P2=tv[k];

i=led[k];

P0=a[i];

if(k==0||k==1||k==2)//显示小数点

{

P27=0;

}

if(k==3)

{

P27=1;

}

delay();

}

}

为了在C语言源程序中直接编写中断服务函数的需要,KeilCx51编译器对函数的定义进行了扩展,增加了一个扩展关键字interrupt,它是函数定义是的一个选项,加上这个选项即可以将一个函数定义成中断服务函数。

定义中断服务函数的一般形式为:

函数类型函数名(形式参数表)[interruptn][usingn]

由于ADC0808的CLOCK的时钟频率不高于640KHZ,在这利用定时器T0的中断产生时钟频率,则可设置为:

voidt0(void)interrupt1using0

{

CLK=~CLK;

}

 

6.调试焊接疑难解决

6.1调试电路

(1)目测:

检查外部的各种元件或者是电路是否有断点,有无虚焊

(2)用万用表测试:

先用万用表符合目测中有疑问的点,再检查各种电源线与地线之间是否有短路现象。

(3)加电检测:

给板子加电,检测所有的插座或是器件的电源端的电压是否符合要求的值。

注意事项:

在通电检查前,一定要确保电路板没有短路

6.2硬件焊接制作步骤

(1)将单片机的最小系统焊接出来,进行调试,检验是否能下载程序、进行电路复位、晶振是否起振。

(2)焊接完后对电路进行调试,检查结果是否正确。

6.3疑难及解决方案

(1)单片机的最小系统完成后,接上发现显示灯不亮。

检查发光二极管是否接地或接电源,若都接了则检查晶振是否起振,电路是否短路或断路,结果发现忘记将发光二极管接地。

(2)通电后发现数码管显示亮度不均匀

检查与数码连接电路是否有误、短路或短路。

(3)现数码管显示的数字比较闪

修改程序,调整扫描延时时间,即可改正。

(4)数码管的小数点不能正常显示

经屡次调试程序后,数码管显示正常。

7.心得体会

本次课程设计让我温习了单片机的基本原理、功能以及构造,以及ADC0808的基本工作原理,学会了使用KeilCx51和Protuse这两个软件的基本使用方法,利用C语言在KeilCx51下进行编程实现所需要的功能,同时在Protuse软件上画电路图并进行仿真,提高了动手能力和分析问题的能力。

软件部分的编程,主要是通过看芯片的相关书籍及一些基本资料进行编写的,所以我意识到了当你需要某个东西时,一定要去了解它,弄清楚其工作原理、实现方案以及需要注意的地方,特别是像一些芯片工作的时序图,这是编程之前必须去了解的。

程序编写的过程中,我也遇到了一些难以解决的问题,再次感谢老师的帮助。

当然,写程序的时候灵活变动,不纠结执着一点,多实践多试验,勤思考大胆动手。

8.指导老师意见

 

附录

参考书目:

[1]王惠中,王强,《微机原理及接口技术》,上海,华东理工大学出版社,2006年8月1日

[2]郭天祥,《新概念51单片机C语言教程》,北京,电子工业出版社,2009年1月1日

附录1:

总电路

附录2:

程序代码

#include

#include

#defineucharunsignedchar

#defineucharunsignedchar

#defineuintunsignedint

sbitSTART=P3^0;

sbitOE=P3^1;

sbitEOC=P3^2;

sbitP27=P2^7;

sbitCLK=P3^4;

uchardataled[4];

uintdatatvdata;

ucharcodetv[]={0xfe,0xfd,0xfb,0xf7};

ucharcodea[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

voiddelay(void)

{

uinti;

for(i=0;i<10;i++);

}

voidledxianshi(void)

{

uchark,i;

if(tvdata>5000)

tvdata=5000;

led[0]=tvdata%10;

led[1]=tvdata/10%10;

led[2]=tvdata/100%10;

led[3]=tvdata/1000;

for(k=0;k<4;k++)

{

P2=tv[k];

i=led[k];

P0=a[i];

if(k==0||k==1||k==2)

{

P27=0;

}

if(k==3)

{

P27=1;

}

delay();

}

}

voidmain(void)

{

ET0=1;

EA=1;

TMOD=0x02;

TH0=216;

TL0=216;

TR0=1;

while

(1)

{

START=1;

START=0;

while(EOC==0);

OE=1;

tvdata=P1;

tvdata*=20-0.01;

OE=0;

ledxianshi();

delay();

}

}

voidt0(void)interrupt1using0

{

CLK=~CLK;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2