数字电压表课程设计

更新时间:2024-03-20 19:39:01 阅读量: 综合文库 文档下载

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

课 程 设 计

课程名称 单片机原理与应用 课题名称 简易数字电压表

专 业 自动化 班 级 0904 学 号

姓 名 指导教师 林 国 汉、王迎旭、李晓秀、汪 超、李世军

2012年6月18日

湖南工程学院

课 程 设 计 任 务 书

课程名称 单片机原理及应用 课 题 简易数字电压表

学生姓名 学 号 指导老师 林 国 汉 审 批 专业班级 自动化0904

任务书下达日期 2012年 6 月 18日 任务完成日期 2012年 6 月 30日

设计内容与设计要求 设计内容: 设计一个简易数字电压表,设计内容包括: (1) 使用51单片机,A/D转换芯片,LED或者LCD显示器 (2) 能测量0-5V的直流电压 (3) 能连续、稳定显示所测电压 (4) 测量误差<0.02V) (5) 多路电压轮流/选择显示*(可选) (6) 其它功能*(可选) 设计要求: 1)确定系统设计方案; 2)进行系统的硬件设计 3)完成必要的参数计算与元器件选择; 4)完成应用程序设计; 5)进行软硬件调试;

主 要 设 计 条 件 1 单片机开发板 2 PC机 3 PROTEL软件 4 PROTEUS软件 说 明 书 格 式 1. 课程设计任务书 2. 目录 3. 系统总体方案选择与说明 4. 系统结构框图与工作原理 5. 各单元硬件设计说明及计算方法 6. 软件设计与说明(包括流程图) 7. 调试结果与必要的调试说明 8. 使用说明 9. 程序清单 10、总结 11、参考文献 附录 附录A 系统原理图 附录B 程序清单

进 度 安 排 设计时间为两周 第一周 星期一、上午:布置课题任务,讲课及课题介绍 下午:借阅有关资料,总体方案讨论 星期二、确定总体设计方案 星期三、硬件模块方案设计 星期四、软件模块方案设计 星期五、各硬件模块设计 第二周 星期一、各硬件模块设计 星期二、各软件模块设计 星期三、各软件模块设计 星期四、写说明书 星期五、上午:写说明书,整理资料 下午:交设计资料,答辩 参 考 文 献 1、《单片机原理及应用》李建忠 编 西安电子科技大学出版社 2、《单片微型计算机原理与接口技术》 高峰 编 电子工业出版社 3、《单片机应用新技术教程》邹逢兴 编 高等教育出版社 4、《16位微型计算机原理接口及其应用》 朱宇光 编 电子工业出版社 5、《微型计算机原理与接口技术》 吴秀清 编 中国科学技术出版社 6、《微型计算机接口技术》 邓亚平 编 清华大学出版社 7、《单片机原理及及应用》 王迎旭 编 机械工业出版社

目录

第1章 概述?????????????????????????1 第2章总体设计方案??????????????????????2 2.1 设计要求????????????????????????2 2.2设计思路????????????????????????3 2.3 总框图?????????????????????????3 第3章 硬件系统设计?????????????????????4 3.1 AT89C52的功能介绍???????????????????4 3.2 ADC0808的引脚和功能介绍????????????????5 3.3 晶振电路介绍??????????????????????6 3.4 复位电路介绍??????????????????????7 3.5 LCD的控制显示?????????????????????8 第4章 软件系统设计?????????????????????9 4.1 主程序?????????????????????????9 4.2 A/D转换子程序?????????????????????10 4.3 LCD显示控制程序????????????????????11 第5章仿真与调试??????????????????????12心得体会??????????????????????????17 参考文献??????????????????????????18 附录????????????????????????????19

第1章 概 述

单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。数字电压表是采用数字化测量技术,把连续的模拟量(直流出入电压)转换成不连续的、离散的数字形式并加以显示的仪表。与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到了崭新的水平。现在,由各种单片A/D转换器构成的数字电压表,已经被广泛用于电子及电工测量、工业自动化各个领域。本设计重点介绍了基于单片机原理下的数字电压表的工作原理。

第2章 总体设计方案

2.1 设计要求

要求简易数字电压表能对0~5v范围内的8路信号进行检测,能将所测量的电压在LCD显示器上显示(0.00~5.00),键盘操作有:复位、显示通道+、显示通道+、循环显示、停止、功能

2.2 设计思路

本系统由以下几个模块构成:AT89C52、ADC0808、LCD液晶显示。由于ADC0808在进行A/D转换时需要CLK信号,本系统中ADC0808的CLK直接由外部电源提供为600Hz的方波。ADC0808的参考电压是VRFF=VCC,所以转换之后的数据要经过数据处理,在液晶管上显示电压值。简易数字电压表测量电路由A/D转换、数据处理及显示控制等组成。A/D转换由集成电路0808完成。0808具有8路模拟输入端口,地址(23-25)脚可决定对哪路模拟输入作A/D转换,22脚为地址锁存脚,当输入为高电平时,对地址信号进行锁存。6脚为测试控制,当输入一个2us宽高电平脉冲时,就开始进行A/D转换。7脚为A/D转换结束标志,当A/D转换结束时7脚输出高电平。9脚为A/D转换数据输出允许控制,当OE脚为高电平时,A/D转换数据从该端口输出。10脚为0808的时钟输入端,由外部信号源提供。单片机的P0端口作为LCD1602显示控制。P3.7端口作为通道循环。P1端口作A/D转换数据读入用,P2端口用作0808的A/D转换控制。

2.3 设计总框图

时钟电路

复位电路

AT89C52 P1 P2 A/D转换电路 测量电压输入 显示系统

图 2.1 总框图

第3章 硬件系统设计

3.1 AT89C52功能介绍

AT89S52为 ATMEL所生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。

图 3.1 AT89C52 引脚图

AT89S52主要功能列举如下:

1、拥有灵巧的8位CPU和在系统可编程Flash

2、晶片内部具时钟振荡器(传统最高工作频率可至 12MHz) 3、内部程序存储器(ROM)为 8KB 4、内部数据存储器(RAM)为 256字节 5、32 个可编程I/O 口线 6、8 个中断向量源

7、三个 16 位定时器/计数器 8、三级加密程序存储器 9、全双工UART串行通道

3.2 ADC0808的引脚和功能介绍

ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。

图3.2 ADC0808管脚图

3.2.1 内部结构

ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。

3.2.2引脚功能(外部特性)

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路模拟输入中的一路。

3.3 晶振电路介绍

图 3.3 晶振电路

晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。高级的精度更高。有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。

3.4 复位电路介绍

图3.4 复位电路

复位电路是为确保微机系统中电路稳定可靠工作必不可少的一部分,复位电路的第一功能是上电复位。一般微机电路正常工作需要供电电源为5V±5%,即4.75~5.25V。由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才被撤除,微机电路开始正常工作。

3.5 LCD的控制显示

图3.5 LCD液晶显示管模型

LCD1602的8位双向数据端接AT89C52的P0端口,RS(寄存器选择)接P2.4,RW(读写信号线)接P2.5,E(使能端)接P2.6。

第4章 软件系统设计

4.1 主程序

根据我们的设计,把程序分为初始化块,A/D转换子程序,显示子程序,按键子程序。运行程序后,进入初始化,然后调用A/D转化子程序,同时判断是否有键闭合,如果没有闭合,则命令显示子程序延时等待,若有键闭合,则调用显示子程序,最后完成显示电压值的任务。主程序流程图如图4.1所示。

开始 初始化 N 调用A/D转化子程序 是否有键闭合? Y 显示子程序延时 调用显示子程序 结束

图 4.1 数字电压表主程序流程图

4.2 A/D转换子程序

A/D转换子程序用于对ADC0808的4路输入模拟电压进行A/D转换,并将转换的数值存入4个相应的存储单元中。

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

图4.2 A/D转换流程图

4.3 LCD显示子程序

LCD1602通过D0~D7的8位数据端传输数据和指令。 显示模式设置: (初始化)

0011 0000 [0x38] 设置16×2显示,5×7点阵,8位数据接口;

开始 LCD 初始化 单片机向LCD写命令 单片机向LCD写数据 显示数据 结束

图 4.3 LCD显示流程图

第5章 仿真与调试

5.1 软件调试

软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正。Proteus软件可以对基于微控制器的设计连同所有的周围电子器件一起仿真,用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。Proteus支持的微处理芯片包括8051系列、AVR系列、PIC系列、HC11系列及Z80等等。Proteus可以完成单片机系统原理图电路绘制、PCB设计,更为显著点的特点是可以与u Visions3 IDE工具软件结合进行编程仿真调试[8]。

本系统的调试主要以软件为主,其中,系统电路图的绘制和仿真我采用的是Proteus软件,而程序方面,采用的是c语言,用Keil软件将程序写入单片机。

5.2 显示结果及误差分析

5.2.1 显示结果

1. 当IN0口输入电压值为0V时,显示结果如图14所示,测量误差为0V。

图14 输入电压为0V时,LED的显示结果

2.当IN0输入电压值为1.50V时,显示结果如图15所示。测量误差为0.01V。

图15 输入电压为1.50V时,LED的显示结果

3. 当IN0口输入电压值为3.50V时,显示结果如图16。测量误差为0.01V。

图16 输入电压为3.50V时,LED的显示结果

5.2.2 误差分析

通过以上仿真测量结果可得到简易数字电压表与“标准”数字电压表对比测试表,如下表4所示:

表4 简易数字电压表与“标准”数字电压表对比测试表

标准电简易电压表绝对误差/V 压值/V 测量值/V 0.00 0.00 0.00 0.50 0.51 0.01 1.00 1.00 0.00 1.50 1.51 0.01 2.00 2.00 0.00 2.50 2.50 0.00 3.00 3.00 0.00 3.50 3.50 0.00 4.00 4.00 0.00 4.99 5.00 0.01 由于单片机AT89C51为8位处理器,当输入电压为5.00V时,ADC0808输出数据值为255(FFH),因此单片机最高的数值分辨率为

0.0196V(5/255)。这就决定了电压表的最高分辨率只能到0.0196V,从上表可看到,测试电压一般以0.01V的幅度变化。 从上表可以看出,简易数字电压表测得的值基本上比标准电压值偏大0-0.01V,这可以通过校正ADC0808的基准电压来解决。因为该电压表设计时直接用5V的供电电源作为电压,所以电压可能有偏差。当要测量大于5V的电压时,可在输入口使用分压电阻,而程序中只要将计算程序的除数进行调整就可以了。

心得体会

为期两周的课程设计转眼结束了,我所在的小组做的课题是简易数字电压表。虽然说对于学习单片机的人们来说,这是个很简单的仿真,但是从这次课程设计中,我还是学到很多,也感悟了很多。

在这次难得的课程设计过程中我锻炼了自己的思考能力和动手能力。在设计电路的过程中,加强了我们思考问题的完整性和实际生活联系的可行性。在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机AT89C52及ADC0808等的各个管脚的功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。

这次做完课程设计我积累了以下几点学习经验:

(1) 学习单片机没有捷径,别指望两三天就学会,要坚持不懈,重在积累。

(2) 别崇拜高手,别相信天才,大部分人都不是天才,天才在于勤奋! (3) 单片机是一门应用性和实践性很强的学科,要多动手,多做实验。 (4) 要学会参考别人的程序,减少自己琢磨的时间,迅速提高自己的编程能力。

(5) 碰到问题可以借助网络来搜寻答案和对自己有帮助的问题,可以大大减少开发时间。

通过这次的课程设计作品的制作让我对单片机的理论有了更加深入的了解,而且由于单片机是很实用的一门技术,我们不得不考虑理论与现实的问题。通过这次实践使我更深刻的体会到了理论联系实际的重要性,我们在今后的学习工作中会更加的注重实际,避免称为只会纸上谈兵的赵括。

最后,感谢李晓秀老师不辞劳累地为我们进行指导,我们的成功离不您的帮助。课程设计时间虽然很短,但我学习了很多的东西,使我眼界打开,感受颇深。

参考文献

[1]胡健.单片机原理及接口技术.北京:机械工业出版社,2004年10月

[2]王毓银.数字电路逻辑设计.高等教育出版社,2005年12月 [3]于殿泓、王新年.单片机原理与程序设计实验教程.西安电子科技大学出版社,2007年5月

[4]李广弟.单片机基础.北京航空航天大学出版社,2007年5月

[5]魏立峰.单片机原理及应用技术.北京大学出版社,2005年

附录1:仿真原理图

附录2:源程序代码

名称:LCD1602

内容:通过标准程序动态显示字符

------------------------------------------------*/

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit RS = P2^4; //定义端口 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1

#define uchar unsigned char #define uint unsigned int uchar code Table[]=\

/******************************************************************/

/* 微秒延时函数 */

/******************************************************************/

void delay_us(unsigned int n) //延时 如果需要高精度延时 请嵌入

汇编 {

if (n == 0) { return ; }

while (--n); }

/******************************************************************/

/* 毫秒函数声明 */

/******************************************************************/

void delay_ms(unsigned char i) {

unsigned char a, b; for (a = 1; a < i; a++) {

for (b = 1; b; b++) { ; } } }

/******************************************************************/

/* 写入命令函数

*/

/******************************************************************/

void LCD_write_com(unsigned char com) { RS_CLR; RW_CLR; EN_SET; P0 = com; delay_us(5); EN_CLR; }

/******************************************************************/

/* 写入数据函数 */

/******************************************************************/

void LCD_write_Data(unsigned char Data) { RS_SET; RW_CLR; EN_SET; P0 = Data; delay_us(5); EN_CLR;

}

/******************************************************************/

/* 清屏函数 */

/******************************************************************/

void LCD_clear(void) {

LCD_write_com(0x01); delay_ms(5);}

/******************************************************************/

/* 写入字符串函数 */

/******************************************************************/

void LCD_write_str(uchar x,uchar y,uchar n,uchar *s) { uchar i;

uchar Space[16]=\ if (y == 0) {

LCD_write_com(0x80 + x); } else

{

LCD_write_com(0xC0 + x); } for(i=0;i

LCD_write_Data( *s++); } s=Space;

for(i=n;i<16;i++) { } }

void LCD_Printf(uchar x,uchar y,unsigned long int Value) { uchar i;unsigned long k,j=1000000; uchar str[9]=\ for(i=0;i<6;i++)

{k=Value%j;j=j/10;k=k/j;str[i]=Table[k]; }

LCD_write_str(x,y,9,str); }

/******************************************************************/

LCD_write_Data( *s++);

/* 写入字节函数 */

/******************************************************************/

void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) {

LCD_write_com(0x80 + x); } else {

LCD_write_com(0xC0 + x); }

LCD_write_Data( Data); }

/******************************************************************/

/* 初始化函数 */

/******************************************************************/

void LCD_init(void) {

LCD_write_com(0x38); /*显示模式设置*/ delay_ms(5);

LCD_write_com(0x38);

delay_ms(5);

LCD_write_com(0x38); delay_ms(5);

LCD_write_com(0x38);

LCD_write_com(0x08); /*显示关闭*/ LCD_write_com(0x01); /*显示清屏*/

LCD_write_com(0x06); /*显示光标移动设置*/ delay_ms(5);

LCD_write_com(0x0C); /*显示开及光标设置*/ }

#include

#define uchar unsigned char #define uint unsigned int sbit rest=P3^6; sbit start=P3^7;

extern uchar code Table[]; extern void LCD_init(void) ;

extern void LCD_write_str(uchar x,uchar y,uchar n,uchar *s); extern void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data);

extern void LCD_Printf(uchar x,uchar y,unsigned long int Value); extern unsigned char Start_ADC(unsigned char CH); void _delay_ms(uint T) {uint i,j; for(i=0;i

; }

void main() {

uchar chanel; uint voltge; chanel=0; LCD_init(); _delay_ms(20);

LCD_write_str(0,0,12,\_delay_ms(5);

LCD_write_str(0,1,6,\_delay_ms(5); while(1) {if(start==0) {_delay_ms(100); if(start==0)

{LCD_write_char(11,0,Table[chanel]); voltge=Start_ADC(chanel); voltge=19.6*voltge; _delay_ms(5);

LCD_Printf(0,1,voltge); _delay_ms(5); chanel++;

if(chanel==8)chanel=0;}} if(rest==0){_delay_ms(100);

if(rest==0) {

chanel=0;

LCD_write_str(0,0,12,\_delay_ms(5);

LCD_write_str(0,1,6,\_delay_ms(5); }} } }

#include

sbit adda=P2^0; sbit addb=P2^1; sbit addc=P2^2; sbit ale=P2^3;

sbit oe=P2^7;

sbit start=P3^0; sbit eoc=P3^01;

void _delay_us(unsigned int n) //延时 如果需要高精度延时 请嵌入汇编 {

if (n == 0) { return ; }

while (--n); }

unsigned Start_ADC(unsigned char CH) { oe=0; start=0; ale=0; P2=CH;

_delay_us(100); ale=1;

_delay_us(100); start=1; _delay_us(100); start=0; while(eoc==0); _delay_us(100); oe=1;

电气信息学院课程设计评分表

评 价 项 目 优 设计方案的合理性与创造性 良 中 及格 差 软件设计完成情况 硬件调试完成情况 设计说明书与设计图纸质量 答辩情况 独立工作能力 完成任务情况 出勤情况 综 合 评 分

指导教师签名:_______________

日 期:_______________

电气信息学院课程设计评分表

评 价 项 目 优 设计方案的合理性与创造性 良 中 及格 差 软件设计完成情况 硬件调试完成情况 设计说明书与设计图纸质量 答辩情况 独立工作能力 完成任务情况 出勤情况 综 合 评 分

指导教师签名:_______________

日 期:_______________

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

Top