单片机课程设计电压表
3)在ADC0809采集正常、12864液晶显示正常以后,我们 发现ADC0809采集的数据不正常,会出现大幅度波动,并且显 示的测得电压有时候不正确。这是因为ADC0809是逐次比较型 AD,所以它的精度是不准确的,一般情况下逐次比较型AD是 不能用作仪表用AD的,仪表级运放一般都是运用双积分型 AD。但是因为硬件外设的限制,我们只能用ADC0809。因 此,我们在算法上进行了优化,采用连续取样三次取平均的平 均值算法。在我们采用了平均值算法以后,ADC的采样值稳定 了许多也准确了许多。 (3) 调试运行结果
本实验所用12864液晶显示器
4. 系统程序设计 4.1 主程序流程图
系统主程序流程图如图4-1所示。
图4-1 主程序流程图
5. 系统调试 5.1 Proteus软件仿真调试
(1) 调试过程 启动计算机,打开Proteus仿真软件,进入仿真环境。将写 好的程序存入单片机中,点击运行。即可观察程序运行情况, 也可以通过暂停键暂停程序,通过结束键随时结束程序。 (2) 调试时遇到的问题及解决方法 1)在第一次调试时,我忘记了给ADC0809的CLK引脚提供 时钟信号,结果ADC输出的值都是0,然后我找到ADC0809的 时序图进行分析,最终,我发现了我所忽视的问题,然后在 proteus的元件库中找到了一个信号发生器用来给ADC0809提供 时钟信号。ADC0809输出正常。 2)在第一次调试时,我们的液晶屏显示全部是黑屏,经过 仔细排查,最终确定是元件电路图出现的问题,最终我将液晶 的数据口的标号去掉,用导线一根一根的与单片机的I/O口相 连,才使液晶屏显示正常。原来是我的标号使用错误导致的液 晶屏显示不正常。
//开总中断 //设定定时器T0工作方式 //利用T0中断产生CLK信号 //定时40us频率25K //启动定时器T0
ST = 1; OE = 1; // P1 = 0x06; } uint adin0() { uint value; OE = 1; ST = 1; P1& = 0xf1; P1| = 0x06; delay(1); ST = 0; delay(1); ST = 1; while(!EOC); delay(1); OE = 0; delay(1); P0 = 0xff; Value = P0; OE=1; return value; } uint adin1() { uint value; OE = 1; EOC = 1; ST = 1; P1 &= 0xf1; P1 |= 0x00; delay(1); ST = 0; delay(1);
sbit SW1 = P2^6; sbit SW2 = P2^7; void delay(unsigned char time) { unsigned char i,j; for(i = 0;i < time;i++) for(j = 0;j < 110;j++); } void init() { // P2 = 0xff; EA = 1; TMOD = 0x02; TH0 = 0xd8; TL0 = 0xd8; TR0 = 1; ET0 = 1; //延时
和C4可以稳定振荡频率,并使快速起振。本电路选用晶振 12MHz,C1=C2=30pF。晶体的频率越高,系统的时间频率越 高,单片机的运行速度也就越快。 其与单片机的接口电路如图3-1所示。 图3-1 时钟电路
3.2 复位电路
复位是单片机的初始化操作,只需给AT89S51的复位引脚 RST加上大于2个机器周期(即24个时钟振荡周期)的高电平 就可使AT89S51复位。AT89S51的复位是由外部的复位电路实 现的。复位电路通常采用上电自动复位和按钮复位两种方式。 本设计采用的是上电复位电路。上电自动复位电路是通过外部 复位电路给电容C充电加至RST引脚一个短的高电平信号,信 号随着Vcc对电容C的充电过程而逐渐回落,即RST引脚上的高 电平持续时间取决于电容C的充电时间。因此,为了保证系统 可靠的复位,RST引脚上的高电平必须维持足够长的时间。如 图3-2 图3-2 复位电路
图2-1 系统的整体方案设计图
3. 系统硬件电路设计 3.1 时钟电路
AT89S51单片机各功能部件的运行都以时钟控制为基准, 有条不紊、一拍一拍地工作。因此,时钟频率直接影响单片机 的速度,时钟电路的质量也直接影响单片机系统的稳定性。单 片机时钟信号产生有两种方式:一是内部时钟电路,二是外部 时钟电路,本设计使用内部时钟电路,在单片机的XTAL1和 XTAL2引脚接石英晶体,作为单片机内部振荡电路的负载, 构成中自激振荡器,可在单片机内部产生时钟脉冲信号,C3
而中文的“你”在字模中的记载却如图2所示:
根据芯片的不同取模的方式不同,有多种取模方式:单色 点阵液晶字模,横向取模,字节正序,单色点阵液晶字模,横 向取模,字节倒序,单色点阵液晶字模,纵向取模,字节正 序,单色点阵液晶字模,纵向取模,字节倒序等等。而 PROTUES中的AMPIRE12684为纵向取~0xbf 列平地址范围 0x40~0x7f 绘图RAM 的地址计数器(AC)只对列地址自动加一,当列 地址=0x7F时会重新设为0 DDRAM的坐标地址与资料排列顺序如下图:
2. 整体方案设计
电压表设计以AT89C51单片机作为整个系统的控制核心, 应用其强大的接口功能,构成整个硬件系统。该系统主要由时 钟电路 复位电路 ADC0809模块和12864液晶模块等几部分组 成。各模块的主要功能如下: (1) 时钟电路的功能是为单片机提供时钟信号 (2) 复位电路的功能是使单片机处于某种确定的初始状态 (3) A/D转换器的功能是把需要测量的模拟电压信号转换成 0~255的数字电压信号,然后送入单片机。 系统的整体设计方案设计图如图2-1所示。
档位4 档位3 档位2
档位1
5.2 硬件调试
(1) 调试过程 安装好仿真器,用串行数据通信线连接计算机与仿真器, 把仿真头插到模块的单片机插座中,打开模块电源,插上仿真 器电源插头。将写好的.C文件通过Keil软件生成.hex文件。打 开STC-ISP软件,打开程序文件,改变和电脑相适应的COM 口,点击下载,将hex文件考入单片机中。观察测试结果。 (2) 调试时遇到的问题及解决方法 1)在我们连接好硬件线路开始硬件仿真时,发现液晶屏没 有显示,于是开始排查软件问题,结果调试了很久还是没有显 示,这时才怀疑是硬件问题,我们将实验箱提供的12864的例 程烧写进去,结果还是没有显示。我们才知道原来是液晶坏 了,于是我们换了一个实验箱,液晶才显示正常。 2)这个实验箱的P0口没有接上拉电阻,所以不能当做通用 I/O使用,于是我们自行焊接了一个上拉电阻,接在了P0口 上。在我们连接好硬件线路开始硬件仿真后,我们的ADC输出 全为0,于是我编写了一个用P0口驱动LED灯的小程序来测试 经过我们上拉以后的P0口的推动能力,我们用电压表测量了P0 口的输出,发现P0口输出的低电平正常,为0.07V,而P0口的 高电平只能上拉到0.5V。所以我们怀疑由于P0口的其他连线, 将P0口的输出拉低了,所以我们放弃了P0口,将P3口进行分 时复用,既作为ADC0809的数据输入口,又作为12864液晶屏 的数据口。最终我们的液晶屏的显示和ADC0809的采集全部正 常,完美地完成了所有功能。
6. 程序清单
#include <reg51.h>
#include "ascii.h" #define uchar unsigned char #define uint unsigned int #define NULL 0 #define LCD_DATA P3 sbit RS = P2^2; sbit RW = P2^1; sbit LCD_EN = P2^0; sbit LCD_CS1 = P2^5; sbit LCD_CS2 = P2^4; sbit sbit sbit sbit CLK = P1^4; ST = P1^5; OE = P1^6; EOC = P1^0;
驱动输出装置显示数字电压信号。
1. 设计任务
结合实际情况,基于AT89C51单片机设计一个电压表。应 满足的功能要求为: 按键换量程(小数点的位置),使用ADC0809,串行静态 显示(十进制),数值转换(小数运算 BCD转换)。 主要硬件设备:单片机实验开发系统:矩阵键盘,开关量 输入模块,液晶显示器,ADC0809模数转换芯片
换完毕我们根据EOC信号来判断。当EOC变为高电平时, 这时给OE为高电平,转换的数据就输出给单片机了。 其与单片机的接口电路如图3-3所示。
图3-3 ADC0809与单片机的接口电路
3.4 12864液晶显示模块
(1) 汉字和英文显示原理 在数字电路中,所有的数据都是以0和1保存的,对LCD控 制器进行不同的数据操作,可以得到不同的结果。对于显示英 文操作,由于英文字母种类很少,只需要8位(一字节)即 可。而对于中文,常用却有6000以上,于是我们的DOS前辈想 了一个办法,就是将ASCII表的高128个很少用到的数值以两个 为一组来表示汉字,即汉字的内码。而剩下的低128位则留给 英文字符使用,即英文的内码。 那么,得到了汉字的内码后,还仅是一组数字,那又如 何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是 一组数字,但它的意义却与数字的意义有了根本的变化,它是 用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字 模的记载方式如图1所示
单片机原理及接口技术
课程设计报告
设计题 电压表设计 目: 学 号: 姓 名: 指导教 师:
信息与电气工程学院 二零一四年六月
电压表设计
本文介绍了一种基于单片机的简易数字电压表的设计。该 设计主要由A/D转换模块 、数据处理模块及显示模块。A/D转 换模块主要由芯片ADC0809来完成,它负责把采集到的模拟量 转换为相应的数字量,然后再传送到数据处理模块。数据处理 模块则由芯片AT89C51来完成,其负责把ADC0809传送来的数 字量经过一定的数据处理,产生相应的显示码送到显示模块进 行显示;此外,它还控制着ADC0809芯片的工作。该系统的数 字电压表电路简单,所用的元件较少,成本低,且测量精度和 可靠性较高。此数字电压表可测量模拟输入电压值,并通过 12864液晶显示出来。 电压表的设计是采用数字化的测量技术,把连续的模拟量 转换成不连续的离散的数字形式并加以显示的仪表。传统的指 针式电压表功能单一,精度低,不能满足数字化时代的需求, 采用单片机的数字电压表,由于精度高,抗干扰能力强,可扩 展性强,集成方便,还可与PC进行实时通信。数字电压表是 诸多数字化仪表的核心与基础。以数字电压表为核心可以扩展 成各种通用数字仪表,专用数字仪表 及各种非电量的数字化 仪表。目前,由各种单片A/D转换器构成的数字电压表已被广 泛的用于电子及电工的测量、工业自动化仪表、自动测试系统 等智能化测量领域,展示出强大的生命力。新型数字电压表以 其高准确度、高可靠性、高分辨率、高性价比等优良特性备受 人们的青睐。 数字电压表作为数字化仪表的基础与核心,已被广泛的用 于电子及电工的测量、工业自动化仪表、自动测试系统等智能 化测量领域。它把连续的模拟量转换成不连续的离散的数字形 式并加以显示,有别于传统的以指针加刻度盘进行读数的方 法,避免了读数的视差和视觉疲劳。目前,数字万用表的内部 核心部件是A/D转换器,转换器的精度很大程度上影响着数字 万用表的准确度,本设计A/D转换器对输入模拟信号进行转 换,控制核心AT89C51再对转换的结果进行运算和处理,最后