1、简易数字电压表第六组简易数字电压表作 者:王 稳 陈华烽 王 勇辅导老师:徐武雄 摘 要本系统采用了以单片机AT89S52为控制核心,用HD7279来控制键盘和显示部分,通过ADC0809来实现模拟和数字电压的转换,再通过数码管来显示电压值及选择的通道值。本系统要实现的功能如下:测量05V的8路输入电压值,并在四位LED数码管上显示,最高位显示通道号,通道采样由按键来选择(0号,1号 . 7号键分别来选择模拟通道0 .7 ) 。目录一、方案论证与比较 2二、主要电路原理图及相关分析计算 31.键盘和显示控制模块 32.模拟数字转换模块 53.单片机控制模块 6三、软件算法设计 6四、系统测试方
2、法及数据 71测试仪器 72测试方法与结果 83测试结果分析 8六、总结 8七、参考文献 9八、附录 91基本元器件清单 9电阻 9电容 92芯片引脚图 10AT89S52 10ADC0809 1214024分频器 133软件设计程序清单 13一、方案论证与比较本系统由单片机控制模块、键盘和显示控制模块、模数转换模块等组成。总体的框架图如图1所示。图1从整体的框架来看,本系统设计过程中,就是键盘和显示控制模块有两种不同的设计方案,而其他的模块设计上基本上使用了一种方案。如:单片机控制模块使用的是ATMEL公司的AT89S52;模拟数字转换模块使用的是ADC0809芯片。键盘和显示控制模块的两种
3、不同的方案如下:方案一:采用逻辑门电路及开关去实现,比如使用74LS244去驱动显示部分,但实现起来比较复杂且不稳定、不方便。方案二:使用芯片HD7279(串行接口8位LED数码管及64位键键盘智能控制芯片),单片机可以方便的对它进行适时的控制,功能极其的强大,所以是首选的芯片。总上所述,方案二比较实用,故选择方案二。二、主要电路原理图及相关分析计算1.键盘和显示控制模块本模块使用的是HD7279芯片。HD7279是一片具有串行接口的可同时驱动8位共阴式数码管或只独立的智能显示驱动芯片,该芯片同时还可连接多达键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。HD7279内部含有译码器,
4、可直接接受BCD码或16进制码并同时具有种译码方式,此外还具有多种控制指令如消隐闪烁左移右移段寻址等。HD7279具有片选信号可方便地实现多于8位的显示或多于64键的键盘接口。 HD7279典型的应用电路图如图2所示:图2本系统中,只用了它64键中的8个,以及用了8个显示管中的4个,而且非常方便的跟单片机系统连接起来,从而可以达到设计的功能要求,所以在键盘和显示模块中,我们选用了HD7279芯片。2.模拟数字转换模块本模块采用的是芯片ADC0809。ADC0809是8位逐次比较式A/D转换芯片,具有8路模拟量输入通道。其内部逻辑结构如图3所示: CLKSTARTD0D1D2D3D4D5D6D7
5、VCCGNDEOCALECBAIN7IN6IN5IN4IN3IN2IN0IN1VREF()VREF(+) 图3图中,8路模拟开关用于选通8个模拟通道,允许8路模拟量分时输入,并公用一个A/D转换器进行转换。IN0IN7为8路模拟量输入器,模拟输入电压的范围是05V,对应的数字量为00HFFH,转换时间为100us,ADDA、ADDB、ADDC为通道地址线,用于选择通道。其通道寻址如表1所示。ALE是通道地址锁存信号,其上升沿时,把ADDA、ADDB、ADDC地址状态地址锁存器中。VREF(+)、VREF()接基准电源,在精度要求不太高的情况下,供电电源就可用作基准电源。START是启动引脚,其
6、上脉冲的下降沿启动一次新的AD转换。EOC是转换结束信号,可用于向单片机申请中断或供单片机查询。CLK是时钟端,典型的时钟频率为640kHz。DB0DB7是数字量输出。 ADC0809通道地址选择表ADDC ADDB ADDA选择的通道 0 0 0IN0 0 0 1IN1 0 1 0IN2 0 1 1IN3 1 0 0IN4 1 0 1 IN5 1 1 0IN6 1 1 1IN7 表1 ADC0809的转换时钟由单片机的ALE提供。3.单片机控制模块单片机控制模块使用的芯片是ATMEL公司生产的AT89S52。使用该芯片很容易实现对其他模块的控制,所以整个系统的工作核心还是单片机控制模块,通过
7、对单片机AT89S52写入程序,可以方便的用软件来控制整个过程,而且由于AT89S52中有一个可以反复擦写的FLASH,所以可以很方便的修改程序。三、软件算法设计由于控制模块采用的是AT89S52单片机系统,所以要实现对整个系统的控制一定要一个好的程序,而要写出好的程序必须先有好的程序流程图,本程序设计并不是非常复杂,总体的程序流程图如图4所示。图4本程序的清单见附录。四、系统测试方法及数据1测试仪器Wave E2000编译器标准数字万用表UT-512测试方法与结果采用Wave E2000编译器进行源程序编译及仿真调试,同时进行硬件电路板的设计制作,烧好程序后进行软硬件调试,最后进行端口电压的
8、对比测试,测试对比表见表2,表中标准电压值采用UT51数字万用表测试.简易数字电压表与“标准”数字电压表对比测试表标准/V0.000.150.851.001.251.751.982.322.65简易电压测得值/V0.000.170.861.021.261.762.002.332.66绝对误差/V0.00+0.02+0.01+0.02+0.01+0.01+0.02+0.01+0.01标准误差/V3.003.453.554.004.504.604.704.814.90简易电压表测得值/V3.013.473.564.014.524.624.724.824.92绝对误差/V+0.01+0.02+0.0
9、1+0.01+0.02+0.02+0.02+0.01+0.02表23测试结果分析从表2中可以看出,简易数字电压表与“标准”数字电压表测得的绝对误差均在0.02 V以内,这与采用8位A/D转换器所能达到的理论误差精度相一致,在一般的应用场合可完全满足要求。六、总结整个系统本着简单可靠的原则完成了本设计任务,达到了设计的基本功能要求,但在性能及成本上还有待改进。 七、参考文献1 康华光(.)电子技术基础模拟部分( M)(.)北京(:)高等教育出版社(,)1999年(.)2 陈大钦(.)电子技术基础实验(M)(.)北京(:)高等教育出版社(,)2003年(.)3 谢自美(.)电子线路设计实验测试(M
10、)(.)武汉(:)华中科技大学出版社(,)2002年(.)4 李建忠(.)单片机原理及应用(M)(.)西安(:)西安电子科技大学出版(,)2002年(.)5 李光飞(.)单片机课程设计实例指导(M)(.)北京(:)北京航空航天技术大学出版社(,)2003年(.)八、附录1基本元器件清单电阻电容2芯片引脚图AT89S52如图5所示图5AT89S52引脚功能如下: P0口8位漏极开路的双向I/O口 当使用片外存储及外扩I/O口时, P0口作为低字节地址/数据复用线在编程时P0口可用于接收指令代码字节,在程序校验是,P0口可输出指令字节(延时需要加外部上拉电阻) P0口可驱动8个TTL负载 P1口8
11、位准双向I/O口,具有内部上拉电阻P -1口是为用户准备的I/O口双向口,在编程和校验时,可用做输入低8位地址,用做输入时,应先将输出锁存器置1, P1口可驱动4个TTL负载 P2口8位、2准双向I/O口,具有内部上拉电阻当使用片外存储或外扩I/O口时,P2口输出高8位地址。在编程/校检时,P2口可接收高字节地址和某些控制信号。P2口也可作普通I/O口使用。用做输入时,应先将输出锁存器置1。P2口可驱动4个TTL负载。 P3口8位、准双向I/O口,具有内部上拉电阻。P3口可作为普通I/O口。用做输入时,应先将输出锁存器置1。在编程/校检时,P3口接收某些控制信号。它可驱动4个TTL负载。P3口
12、还提供各种代替功能,如表3所示。 P3口替代功能引脚替代功能 说 明P3.0RXD串行数据接收P3.1TXD串行数据发送 P3.2INT0 外部中断0申请P3.3INT1外部中断1申请P3.4T0定时器0外部事件计数输入P3.5T1定时器1外部事件计数输入P3.6W R外部RAM写选通P3.7R D外部RAM读选通表3 RST-复位输入,高电平有效。在振荡器稳定工作时,在RST脚施加两个机器周期(即24个晶振周期)以上的高电平,将器件复位。 EA/VPP-外部程序存储器访问允许信号EA(External Access Enable)。 当EA信号接地时,对ROM的读操作限定在外部程序存储器,地
13、址为0000HFFFFH;当EA接VCC时,对ROM的读操作从内部程序存储器开始,并可延续至外部程序存储器。在编程时,该引脚可接编程电压(AT89C51的VPP为5V或12V;AT89C51 的VPP为12V)。在编程校验时,该引脚可接VCC.。 PSEN-外部程序存储器读选通信号PSEN (Program Store Enable )在系统扩展时,ALE的下降沿将0口输出的低位地址锁存在外接的地址存储器中,以实现地字节地址,和数据的分时传送此外,ALE端连续输出正脉冲,频率为晶振频率的,可用作外部定时脉冲使用但要注意,每次访问外ROM时要丢失一个ALE脉冲在编程期间,该引脚输入编程脉冲(PR
14、OG)。 XTAL1-片内振荡器反向放大器和时钟发生线路的输入端使用片内振荡器时,连接外部石英晶体和微调电容 XTAL2-片内振荡器反向放大器的输入端,当使用片内振荡器时,外接石英晶体和微调电容当使用片内振荡器时,引脚XTAL1接收外振荡器信号,XTAL2悬空 VCC-电源电压输入引脚 GND-电源地ADC0809如图6所示图6ADC0809引脚功能 IN7IN0:8路模拟电压的输入范围是05V。 ADDAADDC:地址输入信号,译码后选择模拟量中的一路进行A/D转换。 ALE:地址锁存允许输入信号,上升沿有效,信号有效时锁存地址信号,并启动译码电路,选中一路模拟量输入。 START:启动转换
15、输入信号,正脉冲有效。信号的上升沿复位内部寄存器,下降沿启动控制逻辑,开始A/D转换。 EOC:转换结束输出信号,该信号的下降沿,表示转换正在进行,EOC变为高电平时,表示转换结束。 OE:输出允许信号,高电平有效,信号有效时,转换结果送到数据输出线。 D0D7:8位数字信号输出。 CLOCK:外部时钟输入,始终最高频率为640kHz,当频率为640kHz,转换时间约为100us. VREF(+)、VREF(-):基准电压,单记性输入时,VREF(+)接+5V,VREF(-)接地.VCC :电源电压,接+5V.GND:信号接地端.14024分频器(如图7所示)图73软件设计程序清单;*;变量定
16、义;*;*;变量定义;*BIT_COUNT DATA 03FHTIMER DATA 03EHTIMER1 DATA 03DHTIMER2 DATA 03CHTIMER3 DATA 03BHTIMER4 DATA 03AHSEG_NUM DATA 039HSEG_CNT DATA 038HLAST_SEG DATA 037HDATA_IN DATA 020HDATA_OUT DATA 021H;*;输入输出引脚定义;*CS BIT P1.4 CLK BIT P1.5DAT BIT P1.2KEY BIT P1.3 ORG 00H AJMP START ORG 03H AJMP INT00 ;外部
17、中断0 ;ORG 080H;*; 主程序;*START: MOV SP,#50H MOV P1,#11011011B ;初始化p1端口 MOV R0,30H ;r0为存放采集到的数据 CLR IT0 ;设置外部 SETB EA ;cpu开放中断 SETB EX0 ;允许外部中断0 MAIN: MOV DATA_OUT,#10100100B ;复位指令 LCALL SEND ;发送该字节到HD7279 lCALL DEMO_DELAY lCALL DEMO_DELAY lCALL DEMO_DELAY lCALL DEMO_DELAY SETB CS MOV DATA_OUT,#10001000
18、B ;闪烁指令 LCALL SEND MOV DATA_OUT,#11110111B ;最高位为闪烁位(4) LCALL SEND MOV DATA_OUT,#10010011B ;下载数据但不译码好处是可以自己选择字型 LCALL SEND MOV DATA_OUT,#00001000B ;显示下画线_ LCALL SEND MOV DATA_OUT,#10000000B LCALL SEND MOV DATA_OUT,#0000000B LCALL SEND MOV DATA_OUT,#10000001B LCALL SEND MOV DATA_OUT,#00000000B LCALL S
19、END MOV DATA_OUT,#10000010B LCALL SEND MOV DATA_OUT,#10000000B LCALL SEND SETB CS ;不选中 MOV TIMER4,#0 MOV TIMER3,#0 MOV TIMER2,#0WAIT_KEY: MOV A,TIMER4 ;计时 ADD A,#1 MOV TIMER4,A MOV A,TIMER3 ADDC A,#0 MOV TIMER3,A MOV A,TIMER2 ADDC A,#0 MOV TIMER2,A MOV A,TIMER4 ;检查是否到20秒 CJNE A,#0,CHECK_KEY MOV A,TI
20、MER3 CJNE A,#0,CHECK_KEY MOV A,TIMER2 CJNE A,#20,CHECK_KEY JMP MAIN ;20秒内无键按下,从头开始CHECK_KEY: JB KEY,WAIT_KEY ;未到时,检查按键,如无键则继续计时 MOV DATA_OUT,#00010101B ; 有键按下,读键码 LCALL SEND LCALL RECEIVE SETB CS MOV TIMER4,#0 ;清计时器 MOV TIMER3,#0 MOV TIMER2,#0 MOV R1,DATA_IN ;取数到A中 MOV DPTR,#TABLE L1: MOV A,#00H MOV
21、C A,A+DPTR JZ WAIT_KEY CLR C SUBB A,R1 JZ NOT_S_15 INC DPTR JMP L1 NOT_S_15: MOV DATA_OUT,#11001011B ;在第四位显示键码低8位 LCALL SEND CLR C MOV A,DATA_IN SUBB A,#18H MOV LAST_SEG,A ;保存起来在LAST_SEG中 MOV DATA_OUT,A LCALL SEND SETB CS;WAIT_RELEASE2: JNB KEY,WAIT_RELEASE2 ;开始启动ADC0809 CLR C MOV DPTR,#0FEF8H ;进入地址
22、为Int0,初始地址 MOV A,LAST_SEG ADD A,DPL ;进入与实际接触的低8地址 MOV DPL,A MOV A,#00H ;高位值不动 MOVX DPTR,A ;驱动ADC0809启动,因为用的是M0VX指令,A是的值无意义 DELAY: MOV R7,#02 ;启动时延时25ms,因为这是HD7279的特点D2: MOV R4,#25D3: MOV R3,#248 DJNZ R3,$ DJNZ R4,D3 DJNZ R7,D2 JMP WAIT_KEY ;中断等待 INT00: CLR C MOV DPTR,#0FEF8H MOV A,LAST_SEG ADD A,DPl
23、 MOV DPl,A MOVX A,DPTR ;读取转换后的数字量 MOV R0,A CLR EA ;已经转换完就关闭 CLR EX0 ;禁止外部中断0 LCALL L5 ;调用显示子程序 MOV R1,#05DISP1: LCALL DISP DJNZ R1,DISP1 MOV DPTR,#0FE8FH ; MOVX DPTR,A JMP MAIN L5: CLR C MOV R5,#00H MOV R4,#00H MOV R3,#08HNEXT: RLC A MOV R2,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 MOV R
24、4,A MOV A,R2 DJNZ R3,NEXTL6: MOV A,R5 ADD A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A RET DISP: MOV A,R5 ANL A,#0FH ORL A,#10H MOV DATA_OUT,#10000000B LCALL SEND ANL A,#01111111B ;去DP点 MOV DATA_OUT,A LCALL SEND LCALL DELAY1 MOV A,R5 ANL A,#0F0H SWAP A ORL A,#20H MOV DATA_OUT,#10000000B LCALL
25、 SEND MOV DATA_OUT,A ;DP点 LCALL SEND LCALL DELAY1 MOV A,R4 ANL A,#0FH ORL A,#40H MOV DATA_OUT,#10000000B LCALL SEND ANL A,#01111111B ;去DP点 MOV DATA_OUT,A LCALL SEND LCALL DELAY1 CLR A RET SEND: MOV BIT_COUNT,#08 CLR CS ; 选中HD7279 ACALL LONG_DELAYSEND_LOOP: MOV C,DATA_OUT.7 MOV DAT,C SETB CLK ;启动 MOV
26、 A,DATA_OUT RL A MOV DATA_OUT,A ACALL SHORT_DELAY CLR CLK ACALL SHORT_DELAY DJNZ BIT_COUNT,SEND_LOOP CLR DAT RETRECEIVE: MOV BIT_COUNT,#08 SETB DAT ACALL LONG_DELAYRECEIVE_LOOP: SETB CLK ACALL SHORT_DELAY MOV A,DATA_IN RL A MOV DATA_IN,A MOV C,DAT MOV DATA_IN.0,C CLR CLK ACALL SHORT_DELAY DJNZ BIT_C
27、OUNT,RECEIVE_LOOP CLR DAT RETLONG_DELAY: MOV TIMER,#25 DJNZ TIMER,$ RET SHORT_DELAY: MOV TIMER,#4 DJNZ TIMER,$ RET DELAY1: MOV R7,#02 ;启动时延时5ms,因为这是HD7279的特点D12: MOV R4,#05D13: MOV R3,#248 DJNZ R3,$ DJNZ R4,D13 DJNZ R7,D12 RETDEMO_DELAY: MOV TIMER1,#50 ;延时约50MSDEMO_DELAY_1: MOV TIMER,#250DEMO_DELAY_2: NOP NOP DJNZ TIMER,DEMO_DELAY_2 DJNZ TIMER1,DEMO_DELAY_1 RET TABLE: DB 18H,19H,1AH,1BH,1CH,1DH,1EH,1FH,00H END