简易数字电压表的设计

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

单片机课程设计
姓名:罗双林
学号:0803731173
班级:电气082
成绩:
指导老师:吴玉蓉
设计时间:2011-1-4——2011-1-16
摘要
简易数字电压测量电路由A/D转换、数据处理及显示控制等组成。

当外部0~5V的模拟信号输入时,首先通过ADC0809转换模块进行转换,转换成数字信号并进入通道进行选择后,将信号传入STC89C52RC单片机时,单片机通过按键电路中的一个按键来选择单路还是8路,另一个按键作单路显示时选择通道,当选择完毕后将数据送入到显示器。

Simple digital voltage measurement circuit by the A/D conversion, data processing and display control etc.
When external 0 ~ 5-v analog signal input, first by ADC0809 conversion module for conversion, converted into digital signals and into the passage, after selecting the signal STC89C52RC microcontroller, introduced into the microcontroller through buttons circuit a button to choose single road or no.8, another button for single road show when choosing the right channel, when choosing after completion
will enter data into to the display.
目录
第一章课程设计任务书 (4)
1.1 设计目的任务及要求 (4)
1.2设计时间及进度安排 (4)
第二章课程设计说明书 (5)
2.1设计方案 (5)
2.2系统硬件电路的设计 (6)
2.3主要元件选型及相关功能介绍 (7)
2.4系统软件设计 (13)
第三章结论及心得体会 (15)
参考文献 (15)
附录 (16)
源程序 (16)
简易数字电压表的设计
一.课程设计目的和要求:
本课程是一门实践性、应用性很强的课程。

通过课程设计使学生较系统地掌握有关单片机控制的设计思想和设计方法,为学生今后从事单片机控制系统开发工作打下坚实的基础。

本课程设计的基本要求是使学生全面掌握单片机控制系统设计的基本理论,熟悉掌握MCS -51 系列单片机的编程方法,学生在接近实际工作环境下,完成一个简单的单片机控制系统
对简易数字电压表的设计,掌握目前自动仪表的一般设计要求,工程设计方法,开发及设计工具的使用方法。

功能要求:
1.设计和调试一种基于单片机的数字直流电压表。

要求具有如下功能:
(1) 测量范围:直流电压0~5V 。

(2) 显示:用四位LED数码管显示。

(3) 测量最小分辨率:0.02V
2、设计步骤及进度
(1) 查阅资料(约占10%)。

(2) 确定设计思路,画出系统框图(约占10%)。

(3) 硬件设计(约占20%)
①确定各个模块的电路实现方法,计算并确定元器件型号。

②画出系统硬件电路原理图。

(4) 软件设计(约占25%)
①画出系统主程序和A/D转换测量子程序流程图。

②编写程序并仿真调试。

(5) 制作电路板(约占10%)。

(6) 写入程序,调试(约占10%)。

(7) 总结设计过程,编写课程设计报告(约占10%)
(8) 准备及答辩(约占5%)
3、撰写课程设计报告,内容主要包括:
内容包括题目、目录、摘要、正文、结论、体会、参考文献等。

学生在完成上述全部工作之后,应将全部内容以先后顺序写成设计报告一份,阐述整个设计内容,要求重点突出、特色鲜明、语言简练、文字通畅,字迹工整。

报告书以A4纸打印,装订成册(文字不少于4000 字)。

二.设计说明书:
1.元器件选型:
●A/D转换器: ADC0809
●8位单片机: STC89C52RC
●同相三态缓冲器/线驱动器: 74ls244
●二进制计数器:MC14024
●显示装置:LED数码管
●三极管四个
●电阻若干
●电容三个
●按键开关二个
●12M晶振一个
2.系统方案确定:
按系统功能实现要求,决定控制系统采用AT89C52单片机,A/D转换采用ADC0809。

系统除能确保实现要求的功能外,还可以方便地进行8路其他A/D转换量的测量、远程测量结果传送等扩展功能。

数字电压表系统设计方案框图如图。

P0:地址数据低8位口P1:普通I/O口P2:地址高8位口P3:特殊功能口
晶振电路保证信号传输同步,串口通信是与外界进行信息交换的一种方式,按键电路中一个按键是单路和轮流显示的选择,一个按键是单路时的通道选择。

实现过程:
当外部0~5V的模拟信号输入时,首先通过ADC8090转换模块进行转换,转换成数字信号并进入通道进行选择后,将信号传入STC89C52RC单片机时,单片机通过按键电路中的一个按键来选择单路还是8路,另一个按键作单路显示时选择通道,当选择完毕后将数据送入到显示器,通过P3特殊功能口经三极管驱动输出控制位。

3.系统硬件部分:
简易数字电压测量电路由A/D转换、数据处理及显示控制等组成,电路原理图如图所示。

A/D转换由集成电路0809完成。

0809具有8路模拟输入端口,地址线(23~ 25脚)可决定对哪一路模拟输入作A/D转换。

22脚为地址锁存控制,当输入为高电平时,对地址信号进行锁存。

6脚为测试控制,当输入一个2uS宽高电平脉冲时,就开始A/D转换。

7脚为A/D转换结束标志,当A/D转换结束时,7脚输出高电平。

9脚为A/D转换数据输出允许控制,当OE脚为高电平时,A/D转换数据从该端口输出。

10脚为0809的时钟输入端,利用单片机30脚的六分频晶振频率再通过14024二分频得到1MHz时钟。

单片机的P1、P3.0~P3.3端口作为四位LED数码管显示控制。

P3.5端口用作单路显示/循环显示转换按钮,P3.6端口用作单路显示时选择通道。

P0端口作A/D转换数据读入用,P2端口用作0809的A/D转换控制。

4.主要元件选型及相关功能介绍 STC89C52RC单片机:
引脚功能:
Vcc: 电源电压
GND:地
P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。

作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。

在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。

在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。

对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。

作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流
与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入.flash编程和程序校验期间,P1接收低8位地址。

(P1.0/T2)和输入(P1.1/T2EX),P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。

对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。

在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。

P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。

P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。

对P3口写入“1”时,它们被内部上位电阻拉高并可作为输入端口。

此时,被外部拉低的P3口将用上拉电阻输出电流
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。

RST:复位输入。

当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片复位。

ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。

一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。

要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。

对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。

如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE 操作。

该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。

此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。

PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当STC89C52RC 由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。

在此期间,当访问外部数据存储器,将跳过两次RSEN信号。

EA/VPP:外部访问允许。

欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。

需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。

如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。

Flash 存储器编程时,该引脚加上+12V的编程允许电源VPP,当然这必须是该器件是使用12V编程电压VPP。

XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。

XTAL2:振荡器反相放大器的输出端。

外部时钟:输入端接在XTAL1
输出端接在XTAL2
晶体可以在1.2mhz-12mhz之间任选,电容可以在20-60uf之间选择。

ADC0809:A/D转换器:
ADC0809是采样频率为8位的、以逐次逼近原理进行模—数转换的器件。

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

①.主要特性
1)8路8位A/D转换器,即分辨率8位。

2)具有转换起停控制端。

3)转换时间为100μs
4)单个+5V电源供电
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。

6)工作温度范围为-40~+85摄氏度
7)低功耗,约15mW。

②.内部结构
ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图13.22所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近
③.外部特性(引脚功能)
ADC0809芯片有28条引脚,采用双列直插式封装,如图所示。

下面说明各引脚功能。

IN0~IN7:8路模拟量输入端。

2-1~2-8:8位数字量输出端。

ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路
ALE:地址锁存允许信号,输入,高电平有效。

START:A/D转换启动信号,输入,高电平有效。

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

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

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

CLK:时钟脉冲输入端。

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

REF(+)、REF(-):基准电压。

Vcc:电源,单一+5V。

GND:地。

ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。

此地址经译码选通8路模拟输入之一到比较器。

START上升沿将逐次逼近寄存器复位。

下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。

直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。

当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。

图中多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用一个A/D转换器进行转换,这是一种经济的多路数据采集方法。

地址锁存与译码电路完成对A、B、C 3个地址位进行锁存和译码,其译码输出用于通道选择,其转换结果通过三态输出锁存器存放、输出,因此可以直接与系统数据总线相连,下图为通道选择表。

74ls244:是一个缓冲输入口,同时也是一个单向驱动器一减轻总线负担。

74ls244是ttl 八同相三态缓冲器/线驱动器,其coms器件对应为74hc244,常用在单片机mcu 系统中,作为单片机的输入输出数据缓冲器,在选通时输入数据送到总线上,在非选通时对总线呈高阻态。

74ls244的内部结构原理图,可以看出74ls244由2组、每组四路输入、输出构成。

每组有一个控制端G,由控制端的高或低电平决定该组数据被接通还是断开。

74ls244管脚功能表:
●MC14024:用与二进制计数。

【用途】二进制计数器【性能参数】双列14脚封装。

【互换兼容】CD4024●
5.软件部分:
主程序
在刚上电时,系统默认为循环显示8个通道的电压值状态。

当进行一次测量后,将显示每一通道的A/D转换值,每个通道的数据显示时间为1S左右。

主程序在调用显示子程序和测试
之程序之间循环,主程序流程图见图。

显示子程序
显示子程序采用动态扫描法实现四位数码管的数值显示。

测量所得的A/D转换数据放在70H~77H内存单元中,测量数据在显示时需转换成10进制BCD码放在78H~7BH单元中,其中7BH存放通道标志数。

寄存器R3用作8路循环控制,R0用作显示数据地址指针。

三.心得体会
此系统的设计实现基本可以符合设计要求,在连线方面比较复杂,所以版面不是很整洁。

短短两周的课程设计已经结束了,通过这次的课程设计锻炼了我们的实践能力,也是对我们以后的实际工作能力的具体训练和考察过程。

现在是一个高科技的时代,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说是无处不在的。

因此对于我们这一专业的同学来说,学好单片机,并正确应用单片机是非常重要的。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

这次的课程设计还让我学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。

更重要的是,我在这一设计过程中,学会了坚持不懈,不轻言放弃。

在本次设计过程中,我们遇到了很多突发事件和各种困难,设计和调试曾一度陷入中断,但通过团队的仔细分析和自我调整状态后我们终于解决了所有的问题。

我们不仅完成了一件作品,而且大大提高了我们的动手能力,团队协作和竞争意识,对我们的毅力和意志力也是一个重要的考验,这些在今后的人生道路上将是一笔宝贵的财富
参考文献:
1、杨光友,朱宏辉,《单片微型计算机原理及接口技术》,水利水电出版社,2002.9.
3、谢维成,杨加国等,《单片机原理与应用及C51程序设计》,清华大学出版社,2006.8.
附录:
控制源程序
以下是简易数字电压表的单片机控制源程序:
//测量电压最大值为5V,显示最大值为5.00V
//使用STC89C52RC单片机,12MHz晶振,P0口读入A/D值,P2口为A/D转换控制口//数码管为共阳极连接,P1口为字段码口,P3口为位选口
//KEY1(P3.5)为单路/循环显示转换按键
//KEY2(P3.6)为单路显示时当前通道选择按键
//FLAG为单路/循环显示控制位,当为0时循环显示,为1时单路显示
//主函数
#include "reg52.h"
extern test( );
extern scan ( );
main( )
{ P0=0xff; //初始化端口
P2=0x00; P1=0xff; //初始化为0通道
P3=0xff;
while(1)
{ test(); //测量转换数据
scan(); //显示数据
}
}
//1ms延时子函数
#define uint unsigned int
void delay1ms(uint t)
{ uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++)
;
}
//ADC0809转换子函数
#include "reg52.h"
#include "intrins.h" //调用_nop_( )延时函数
#define uchar unsigned char
#define ad_con P2 //ADC0809的控制口
#define addata P0 //ADC0809的数据口
uchar data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //ADC0809的8个通道转换数据缓冲区
sbit ALE=P2^3; //ADC0809的地址锁存信号
sbit START=P2^4; //ADC0809的启动信号
sbit OE=P2^5; //ADC0809的允许信号
sbit EOC=P3^7; //ADC0809的转换结束信号
test( )
{ uchar m;
uchar s=0x00; //初始通道为0
ad_con=s; //第一通道地址送ADC0809控制口
for(m=0;m<8;m++)
{ALE=1;_nop_();_nop_(); ALE=0; //锁存通道地址
START=1;_nop_();_nop_(); START=0; //启动转换
_nop_();_nop_() ;_nop_();_nop_();
while(EOC==0); //等待转换结束
OE=1;ad_data[m]=addata;OE=0; //读取当前通道转换0数据
s++;ad_con=s; //改变通道地址
}
ad_con=0x00; //通道地址恢复初值
}
//检测按键子函数
#include "reg52.h"
#define uchar unsigned char
sbit KEY1=P3^5; //循环或单路显示选择按键
sbit KEY2=P3^6; //通道选择按键
sbit FLAG=PSW^0; //循环或单路显示标志位
extern uchar number; //存放单通道显示时的当前通道数
keytest( )
{ if(KEY1==0) //检测循环或淡路选择按键是否按下?
{FLAG=!FLAG; //标志位取反,循环、淡路显示间切换
while(KEY1==0);
}
if(FLAG==1) //单路显示方式,检测通道选择按键是否按下?
{if(KEY2==0)
{ number++; //通道数+1
if(number==8)
{ number=0;}
while(KEY2==0) ;
}
}
}
//显示扫描子函数
#include "reg52.h"
#define disdata P1 //数码管的字段码输出口
#define uchar unsigned char
#define uint unsigned int
void delay1ms(uint t);
uchar number=0x00;
sbit DISX=disdata^7; //小数点位
sbit FLAG=PSW^0; //循环或单路显示标志位
uchar code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0xFF}; //LED 的七段数码管的字段码(0-9,灭)
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //LED数码管的位选码
uint data dis[5]={0x00,0x00,0x00,0x00,0x00}; //前4个为LED数码管的显示缓冲区,最后一个为暂存单元
extern uchar data ad_data[8]; //ADC0809的8个通道转换数据缓冲区extern keytest( );
scan( )
{
uchar k,n;
int h;
if(FLAG==0) //循环显示子程序
{ dis[3]=0x00; //通道值清0
for(n=0;n<8;n++) //8路通道
{ dis[2]=ad_data[n]/51; //当前通道数据转换为BCD码存入显示缓冲区
dis[4]=ad_data[n]%51; //余数(电压小数位)送暂存单元
dis[4]=dis[4]*10; //余数×10
dis[1]= dis[4]/51;
dis[4]= dis[4]%51;
dis[4]= dis[4]*10;
dis[0]= dis[4]/51;
for(h=0;h<500;h++) //每个通道显示1s
{for(k=0;k<4;k++) //4位LED扫描显示
{disdata=dis_7[dis[k]];
if(k==2) {DISX=0;}//点亮小数点
P3=scan_con[k];
delay1ms(1);P3=0xff;
}
}
dis[3]++; //通道值加1
keytest(); //按键检测
}
}
if(FLAG==1) //单路显示子程序{ dis[3]=number; //当前通道数送通道显示for(k=0;k<4;k++)
{disdata=dis_7[dis[k]];
if(k==2) DISX=0;
P3=scan_con[k];
delay1ms(1);P3=0xff;
}
keytest(); //检测按键
}}。

相关文档
最新文档