基于单片机的数字电压表设计报告.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理及系统课程设计
专业:电气工程及其自动化
班级:
姓名:
学号:
指导教师:
兰州交通大学自动化与电气工程学院
2010 年 3 月 7 日
基于单片机的数字电压表设计
摘要
本文是基于单片机的数字电压表的设计,用单片机AT89S52作为主控单元,ADC0809作模数转换芯片,测量0~5V直流电压,其测量最小误差为0.02V。本设计主要分为硬件电路及软件程序两部分。硬件电路可分为A/D转换电路、LED 显示电路。程序的设计使用C语言编程。
关键词:AT89S52;数字电压表;ADC0809
Abstract
The design of this article is based on single chip microcomputer digital voltmeter, AT89S52 MCU as the main control unit, the ADC0809 modulus conversion chip, measurement of 0 ~ 5 V dc voltage, the minimum error of measurement is 0.02 V. This design is mainly divided into two parts, hardware circuit and software program. Hardware circuit can be divided into A/D conversion circuit, LED display circuit. Program design using C language programming.
Key Words: AT89S52, Digital Voltmeter, ADC0809
1.引言
随着电子时代的来临,人们对各种数字仪表的精度要求更高,以前的指针仪表已经不能满足人们的需要,所以就出现了数字电压表这种更精确的测量仪器。
本次课程设计的主要任务是完成模拟量电压转换成数字量电压,然后通过数码管显示出来。主要包括两大模块:转换模块,显示模块,结合硬件和软件,使误差最小。
2.系统总体方案设计
2.1总体设计方案
根据系统设计的要求和功能,将系统分为主控模块,A/D转换模块,LED 显示模块,复位电路,时钟电路几个模块,系统框图如图1所示,主控模块采用AT89S52单片机,A/D转换模块采用ADC0809芯片,用于A/D转换,显示模块采用4位七段共阳LED数码管,用于显示电压值。
1
2
图3.2系统原理图
6.总结
4
两周的课程设计结束了,在这过程中,我学到了很多东西。首先,我学会了单片机设计的基本过程有哪些,每一过程有哪些基本的步骤,怎样通过查资料去完成这每一步。其次我巩固了上学期所学的一些单片机知识,从而加深了对ADC0809芯片的功能的了解。在编程过程中,遇到了许多困难,通过与同学之间的交流和咨询,最后解决了这些困难。所谓实践出真知,学到的东西只有运用到实践当中,才能真正体会到知识的力量。最后,通过这次课程设计,让我明白了想法和实践还是有差距的,当你真正去做一件事的时候,你会发现你的想法可能不适用,随时都需要调整,另外扎实的理论知识也是完成设计任何设计必不可少的要素,一切想法离开了理论知识都是空想。
参考文献
[1]彭为,黄科,雷道仲.单片机典型系统设计实例精讲[M].电子工业出版社.2009:22-54.
[2] 谭浩强.C程序设计(第三版)[M].清华大学出版社.2009:32-46.
[3] 王思明,张金敏,张鑫等.单片机原理及应用系统设计(第一版)[M].科学出版社.2012:70-292.
5
附录A源程序代码
#include
#include
#define uchar unsigned char
sbit p21=P2^1;
sbit p22=P2^2;
sbit p23=P2^3;
sbit EOC=P3^1;
sbit OE=P3^0;
sbit ST=P3^2;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p36=P3^6;
uchar code tab[]={0x40,0x79,0x24,0x30,0x19,0x12};
uchar code led[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; uchar code led_[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay(uchar n)
{
uchar i,j;
for(i=0;i for(j=0;j<125;j++); } void convert(uchar volt_data) { 6 unsigned int temp; temp=100*volt_data/51; P0=led[temp/100]; //个位上的数字显示 p21=1; //选通个位 delay(3); //延时 p21=0; //不选通个位 P0=led_[temp%100/10]; // 十分位的数字显示 p22=1; //选通十分位 delay(3); //延时 p22=0; //不选通十分位 P0=led_[temp%10]; //百分位的数字显示 p23=1; //选通百分位 delay(3); //延时 p23=0; //不选通百分位 } void main() { uchar volt_data; p34=1; p35=1; p36=0; //选通ADC0808的IN3通道 while(1) { ST=0; _nop_(); ST=1; _nop_(); ST=0; //开始转换 if(EOC==0) //如果EOC为0,则继续转换 delay(100); while(EOC==0); //当EOC为1时,转换完毕 OE=1; //数据允许输出标志 volt_data=P1; //讲P1口的数据送volt_data OE=0; convert(volt_data); } } 7