1、基于51单片机的数字电压表课程设计信息与电气工程学院电子应用系统CDIO一级项目设计说明书(2011/2012学年第二学期) 题 目 :_ _数 字 电 压 表_专业班级 : 电子信息0902班 学生姓名 : 张 文 盛 学 号: 090070213 指导教师 :贾少锐、李晓东、马永强李丽宏、贾东立、刘会军设计周数 : 设计成绩 : 2012年6月28日1、CDIO设计目的 本次CDIO设计题目是:利用所学的51单片机,C语言,数字电路等知识,设计一个符合要求的数字电压表。主控芯片可以是AT89C51,而采集电压的模拟量转换成数字量的芯片可以是ADC0804,也可以是PCF8591。而显示模块
2、可以是数码管,也可以是液晶LCD1602,从而展示给我们所得的电压值。2、CDIO设计正文2.1 数字电压表系统设计框图本次数字电压表系统设计框图如图 1所示: 模拟量 数字量 程序 液晶 处理 驱动图1 数字电压表设计框图数字电压表主要由模/数转换电路、单片机控制电路、显示电路等三部分组成。其中PCF8591等器件组成的转换电路,将输入的模拟量信号进行取样、转换、然后将转换的数字信号送进单片机。单片机控制电路主要实现对数据进行程序处理;显示电路主要用于将单片机的信号数据转换后显示测量结果。模拟信号产生模块:输入电源电路(变压器、整流电路、滤波电路、稳压电路组成)和分压电路(9万欧姆和1万欧姆
3、的电阻分压)。模数转换模块组成部分:PCF8591芯片程序处理的单片机控制模块:AT89C51芯片电压结果显示部分:LCD1602液晶2.2 各模块介绍2.2.1 AT89C51芯片介绍AT89S52 具有以下标准功能:8k 字节 Flash,256 字节 RAM,32 位 I/O 口线,看门狗定时器,2 个数据指针,三个 16 位定时器/计数器,一个 6 向量 2 级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至 0Hz 静态逻辑操作,支持 2 种软件可选择节电模式。空闲模式下,CPU停止工作,允许 RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM
4、 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。AT89C52的引脚图如图2 所示。VCC : 接电源 GND: 接地P0 口:P0 口是一个 8 位漏极开路的双向 I/O 口。作为输出口,每位能驱动 8 个 TTL 逻辑电平。对 P0 端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0 口也被作为低 8 位地址/数据复用。在这种模式下,P0 具有内部上拉电阻。在 flash 编程时,P0 口也用来接收指令字节;在程序校验时,输出指令字节。程序校时,需要外部上拉电阻。P1 口:P1 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p1 输出
5、缓冲器能驱动 4 个TTL 逻辑电平。对 P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P2 口:P2 口是一个具有内部上拉电阻的 8 位双向 I/O 口,P2 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)在访问外部程序存储器或用 16 位地址读取外部数据存储器(例如执行 MOVX DPTR)时,P2 口送出高八位地址。P3 口:P3 口是一个具有内部上拉
6、电阻的 8 位双向 I/O 口,p2 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3 口亦作为 AT89C52 特殊功能(第二功能)使用,AT89C52的P3口的第二功能表如表1所示。表1 AT89C52的P3口的第二功能表脚号第二功能P3.0RXD(串行输入)P3.1TXD(串行输出)P3.2INT0(外部中断 0)P3.3INT0(外部中断 0)P3.4T0(定时器 0 外部输入)P3.5T1(定时器 1 外部输入)P3.6WR(外部数据存储器
7、写选通)P3.7RD(外部数据存储器写选通)RST: 复位输入。晶振工作时,RST 脚持续 2 个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出 96 个晶振周期的高电平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO 位可以使此功能无效。DISRTO 默认状态下,复位高电平有效。ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低 8 位地址的输出脉冲。在 flash 编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,A
8、LE 脉冲将会跳过。PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当 AT89S52 从外部程序存储器执行外部代码时,PSEN 在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN 将不被激活。EA/VPP:访问外部程序存储器控制信号。为使能从 0000H 到 FFFFH 的外部程序存储器读取指令,EA 必须接 GND。为了执行内部程序指令,EA 应该接 VCC。在 flash 编程期间,EA 也接收 12V编程电源( VPP)。XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。XTAL2:振荡器反相放大器的输出端。(2)晶振电路晶振电路是单片机的最小系统
9、的组成部分。典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)。特别注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行。(3)复位电路复位电路也是单片机的最小系统的组成部分。当单片机系统在运行中,受到环境干扰出现程序执行错乱的时候,按下复位按钮内部的程序自动从头开始执行。复位电路的原理是单片机RST引脚接收到2us以上的电平信号,只要保证电容的充放电时间大于2US,即可实现复位,所以电路
10、中的电容值是可以改变的。按键按下系统复位,是电容处于一个短路电路中,释放了所有的电能,电阻两端的电压增加引起的。单片机最小系统复位电路的极性电容的大小直接影响单片机的复位时间,一般采用1030uF,51单片机最小系统容值越大需要的复位时间越短。2.2.2 PCF8591 AD/DA芯片PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行IC总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同一个IC总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出
11、的地址、控制和数据信号都是通过双线双向IC总线以串行的方式进行传输。PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由IC总线的最大速率决定。1、主要技术指标和特性 单独供电 PCF8591的操作电压范围2.5V-6V 低待机电流 通过I2C总线串行输入/输出 PCF8591通过3个硬件地址引脚寻址 PCF8591的采样率由I2C总线速率决定 4个模拟输入可编程为单端型或差分输入 自动增量频道选择 PCF8591的模拟电压范围从Vss到VDD PCF8591内置跟踪保持电路 8-bit逐次逼近A/D转换器 通过1路模拟输出
12、实现DAC增益 2、ADC0808引脚功能 PCF8591引脚图如图3所示AIN0AIN3:模拟信号输入端。 A0A3:引脚地址端。 VDD、VSS:电源端。 (2.56V) SDA、SCL:I2C 总线的数据线、 时钟线。 OSC:外部时钟输入端,内部时钟输出端。 EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地。 AGND:模拟信号地。 AOUT:D/A 转换输出端。 VREF:基准电源端。4 功能描述(1)地址IIC总线系统中的每一片PCF8591通过发送有效地址到该地址器件来激活。该地址包括固定部分和可编程部分。可编程部分必需根据地址引脚A0、A1和A2来设置。在IIC总线协
13、议中地址必需是起始条件后作为第一个字节发送。地址字节的最后一位是用于设置以后数据传输方向的读/写。(2)控制字控制字节用于实现器件的各种功能,如模拟信号由哪几个通道输入等。控制字节存放在控制寄存器中。总线操作时为主控器发送的第二字节。其格式如下图5所示: 其中:D1、D0两位是A/D通道编号:00通道0,01通道1,10通道2,11通道3 D2 自动增益选择(有效位为1) D5、D4模拟量输入选择:00为四路单数入、01为三路差分输入、10为单端与差分配合输入、11为模拟输出允许有效 当系统为A/D转换时,模拟输出允许为0。模拟量输入选择位取值由输入方式决定:四路单端输入时取00,三路差分输入
14、时取01,单端与差分输入时取10,二路差分输入时取11。最低两位时通道编号位,当对0通道的模拟信号进行A/D转换时取00,当对1通道的模拟信号进行A/D转换时取01,当对2通道的模拟信号进行A/D转换时取10,当对3通道的模拟信号进行A/D转换时取11。 在进行数据操作时,首先是主控器发出起始信号,然后发出读寻址字节,被控器做出应答后,主控器从被控器读出第一个数据字节,主控器发出应答,主控器从被控器读出第二个数据字节,主控器发出应答一直到主控器从被控器中读出第n个数据字节,主控器发出非应答信号,最后主控器发出停止信号。(3)A/D转换A/D转换器采用逐次逼近转换技术。在A/D转换周期将临时使用
15、片上转换器和高增益比较器。一个A/D转换周期总是开始于发送一个有效读模式地址给PCF8591之后。A/D转换周期子在应答时钟脉冲的后延被触发。并在传输前一次转换结果时执行(见图6)图 6 A/D转换一旦一个转换周期被触发,所选通的输入电压采样将保存到芯片并被转换为对应的8位二进制码,取自差分输入的采样将被转换为8位二进制补码 转换结果被保存在ADC数据寄存器等待传输。如果自动增量标志被置1,将选择下一个通道。在读周期传输的第一个字节包含前一次读周期的转换结果代码,以上电复位之后读取的第一个字节是0x80。最高A/D转换速率取决于实际的IIC总线速度。(4)D/A转换发送给PCF8591的第三个
16、字节被存储到DAC数据存储器,并使用片内D/A转换器转换成对应的模拟电压。这个D/A 转换器由连接到外部参考电压的具有256个接头的电阻分压电路和选择开关组成。接头译码器切换一个接头至DAC输出线。模拟输出电压由自动清零单位增益放大器缓冲。这个缓冲放大器可通过设置控制寄存器的模拟输出允许标志来打开或关闭。在激活状态,输出电压将保持到新的数据字节被发送。提供给模拟输出AOUT的输出电压由下式给出。D/A转换顺序的波形图如图7 = +图7 D/A转换(5)振荡器片上振荡器产生A/D转换周期和刷新自动清零缓冲放大器需要的时钟信号。在使用这个振荡器时EXT引脚必须连接到VSS。在OSC引脚振荡频率是可
17、用的。如果EXT引脚被连接到VDD,振荡输出OSC将切换到高阻态以允许用户连接外部时钟信号至OSC。6 I2C总线特性I2C总线是不同的IC或模块之间的双向两线通信,这两条线是串行数据线(SDA)和串行时钟线(SCL),这两条线必须通过上拉电路连接至正电源。数据传输只能是在总线不忙时启动。(1)位传输 一个数据位在每一个时钟脉冲期间传输。SDA线上的数据必须在时钟脉冲的高电平期间保持稳定。这个期间数据线上的改变被当作控制信号。具体时序如图 8所示:图8 位传输(2)开始或停止条件 数据和时钟线在总不忙时保持高电平。在时钟为高电平时,数据线上的一个由高到低的变化被定义为开始条件。时钟为高电平时,
18、数据线上的一个由低到高的变化被定义为停止条件。具体时序如图 9所示图9 开始和停止条件(3)系统配置 产生信息的器件称作“发送机”,接收信息的器件称作“接收机”。控制信息的器件称作“主机”,被控制的器件称作“从机”。如图10 所示:图10 系统配置(4)应答在开始和停止条件之间从发送机传输到接收机的数据字节数是没有限制的。每个8位数据字节之后紧跟着一个应答位。应答位是由发送机放在总线的一个高电平,而主机也产生一个额外的与应答有关的时钟脉冲。地址匹配的从接收机必须在接收每一个字节后产生一个应答。在应答时钟脉冲期间,应答的器件必须将SDA线拉低。因此在应答相应的时钟脉冲的高电平期间,SDA线必须保
19、持稳定的低电平。在由从机终止的最后一个字节,主接收机必须通过产生一个低电平应答向发送机发送一个数据结束信号,这样发送机必须将数据线SDA拉高以允许主机产生停止条件。具体时序如图 11所示 图11 I2C 总线应答(5)总线协议 在开始条件后一个有效的硬件地址必须发送至PCF8591。读/写位定义了以后单个或多个字节数据传输的方向。开始条件、停止条件和应答位的格式应定时参考I2C总线特性。在写模式数据传输通过发送下一个数据的停止条件或开始条件来约束。总线协议具体时序如图12,13所示:图12 写模式的总线协议,D/A转换图13 读模式的总线协议,A/D转换2.2.3 LCD1602液晶字符型液晶
20、显示模块是一种专门用于显示字母、数字、符号等点阵式LCD。引脚功能说明表2 1602LCD的引脚说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表2 所示。编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生
21、“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表3所示:表3 液晶内部指令表
22、序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码
23、01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电
24、平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。与HD44780相兼容的芯片时序如表4所示:表4 芯片时序读状态输入RS=L,R/W=H,E=H输出D0D7=状态字写指令输入RS=L,R/W=L,D0D7=指令码,E=高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0D7=数据写数据输入RS=H,R/W=L,D0D7=数据,E=高脉冲输出无读操作时序如图14所示。写操作
25、时序如图15所示。2.3 系统硬件仿真用Protues绘制数字电压表的电路图后,将Keil4生成的HEX文件下载进主控芯片AT89C51芯片里,运行,电路图和结果如图 16所示2.4 系统程序设计根据设计要求结合硬件电路,采用的是PCF8591模数数模转换芯片,采用的是液晶显示方式,在液晶显示之前,需对采集回的二进制数字量进行转换显示,这段过程5V电压为基准进行数据处理。图16是程序流程图:图 16 程序流程图2.5 程序 2.5.1 主程序模块#include#include#includeconfig.h#includelcd.h/*与AD转换有关的全局变量*/uchar AD_resul
26、t=0;float Volt=0;/*与LCD显示有关的全局变*/char temp16,temp116;/*函数名*void LCD_DIS()*功 能 *显示函数*参 数 *说 明 */void LCD_DIS() sprintf(char *)temp,Volt:%-6.4fV,Volt); LCD_Str_DIS(char *)temp,0,1); sprintf(char *)temp1,FINISH); LCD_Str_DIS(char *)temp1,1,5); /*函数名*void AD_WORK()*功 能 *AD转换函数*参 数 *说 明 */void AD_WORK()
27、AD_start(); AD_write(0x90); AD_respons(); AD_write(0x41); AD_respons(); AD_end(); AD_start(); AD_write(0x90); AD_respons(); AD_write(0x41); AD_respons(); AD_start(); AD_write(0x91); AD_respons(); AD_result=AD_read(); AD_respons(); AD_end(); AD_start(); AD_write(0x90); AD_respons(); AD_write(0x41); AD_respons(); AD_write(AD_result); AD_respons(); AD_end();/*函数名*void Data_Done()*功 能 *数据处理函数*参 数 *说 明 */void Data_Done() P1=AD_result; /AD转换的值通过流水灯显示 Volt=(AD_result*5)/255.0; /以5V电压为基准,转换成真正的电压/*函数名*void main()*功 能 *参 数 *说 明 *
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1