基于51单片机的简易数字电压表的设计单片机内容摘要:
引脚( 4 个) RST/VPD:复位信号输入引脚 /备用电源输入引脚。 ALE/PROG: 地址锁存允许信号输出引脚 /编程脉冲输入引脚。 EA/VPP:内、外存储器选择引脚 /片内 EPROM(或 Flatiron)编程电压输入引脚。 PSEN: 片外程序存储器读选通信号输出引脚。 16 第三章 ADC0809 ADC0809 引脚功能 ADC0809 的引脚如图所示,下面对引脚功能做简要说明 : 图 ADC0809 引脚 IN0~IN7: 8 个模拟量的输入端。 D0~D7: 8 位数字量输出端。 START:启动 A/D 转换,加正脉冲后 A/D 转换开始。 EOC:转换结束信号。 转换开始时, EOC 信号变低电平;转换结束时, EOC信号返回高电平。 该信号可以作为 CPU 查询 A/D 转换是否完成的信号,也可以作为向 CPU 发出中断申请的信号。 OE:输出允许信号, 输入高电平有效。 OE 端的电平由低变高时,转换结果被送到数据线上。 此信号有效时, CPU 可以从 ADC0809 中读取数据,同时也可以作为 ADC0809 的片选信号。 CLK:实时时钟,频率范围为 10KHZ~1280KHZ,典型值为 640KHZ。 ALE:通道地址锁存允许信号,输入高电平有效。 在 ALE=1 时,锁存ADDA~ADDC,选中模拟量输入。 ADDC~ADDC:通道地址选择输入,其排列顺序从低到高依次为 ADDA 、ADDB、 ADDC。 该地址与 8 个模拟量输入,通道的对应关系如表 1 所示 : 17 VREF+、 VREF正负参考电压。 一般情况下, VREF+接 +5V,VREF接地。 此时的转换关系如表 2 所示: VCC\GND:工作电源和 接 地 表 1 ADC0809 的输入输出关系 输入模拟电压 输出数字量 输入模拟量 输出数字量 0 0000 0000B ... ... ... ... 5 1111 1000 0000B 表 2 地址与模拟量通道之间的对应关系 ADDC ADDB ADDA 选中通道 0 0 0 IN0 0 0 1 IN1 0 1 0 IN2 0 1 1 IN3 1 0 0 IN4 1 0 1 IN5 1 1 0 IN6 1 1 1 IN7 18 ADC0809 内部结构 图 ADC0809 内部结构 ADC0809 的内部结构如图所示,它包含以下几部分: ( 1) 8 路模拟量选择开关 根据地址锁存与译码装置所提供的地址,从 8 个输入的 0V~5V 模拟量中选择一个输出。 ( 2) 8 位 A/D 转换器 能对所选择的模拟量进行 A/D 转换。 ( 3) 3 位地址码的锁存与译码装置 对所输入的 3 位 地址码进行锁存和译码,并将地址选择结果送给 8 路模拟量选择开关。 ( 4)三态输出的锁存缓冲器 是 TTL 结构,负责输出转换的最终结果。 此结果可直接连接到单片机的数据总线上。 控制与时序 逐次逼近寄存器 SAR 树状开关 内部 电阻网络 三态输出锁存缓冲器 A 8 路模拟量选择开关 地址锁存 与译码 8 位 A/D 转换器 电压比较器 EOC 转换结束 数字量输出D0~D7 ``` `D7 ADDA ADDB ADDC地址 选择 模拟量输入IN0`IN7 START CLK 地址锁存ALE Vcc GND + OE输出允许 19 与 80C51 的接口 图 80C51 与 ADC0809 的接口图 ADC0809 与 80C51 的接口满足 ADC0809 转换时序的要求,电路如图 所示: (1) 地址线与数据线的连接 ADC0809 内部输出电路有三态缓冲器,所以 8 位输出数据线可以直接和80C51 的 P0 口相连。 它的通道地址选择信号 ADDA~ADDC 均经过 74LS373 锁存,与 80C51 的P0 口中的任意 3 根 I/O 口线连接(图中与 、 、 相连 )。 (2) 时钟信号的连接 ADC0809 必须外接时钟。 该电路中借用 80C51 的 ALE 输出。 如果 80C51的晶振频率太高,则需要对 ALE 所输出的脉冲进行分频处理。 例如,晶振频率采用 12MHz时, ALE的频率为 2MHz,经过 4 分频后为 500KHz,才能与 ADC0809的 CLK 时钟端相连。 (3) 控制信号的连接 由于 ADC0809 的 ALE 和 START 均为正脉冲,而且基本同步,所以可以由80C51 的 和 WR“或非”而成。 同理, OE 信号 也可以由 80C51 的 和 20 RD“或非”而成。 EOC 信号经“非”门与 80C51 的 INTI 相连,可申请中断。 ADC0809 的应用 指导 ADC0809 应用说明 ( 1) ADC0809 内部带有输出锁存器,可以与 AT89S51 单片机直接相连。 ( 2) 初始化时,使 ST 和 OE 信号全为低电平。 ( 3) 送要转换的哪一通道的地址到 A, B, C 端口上。 ( 4) 在 ST 端给出一个至少有 100ns 宽的正脉冲信号。 ( 5) 是否转换完毕,我们根据 EOC 信号来判断。 ( 6) 当 EOC 变为高电平时,这时给 OE 为高电平,转换的数据就输出给单片机了。 ADC0809 转换结束的判断方法 在 ADC0809 编写程序时,首要问题是如何判断一次 A/D 转换何时结束,在此基础上才能正确读取转换结果。 常用的判断一次 A/D 转换结束时间的方法有三种。 ( 1)软件延时法 软件延时法是指用软件延时等待一次 A/D 转换结束。 延时时间取决于计算和调试而获得的 ADC 完成一次转换所需要的时间。 ( 2)中断法 中断法利用 EOC 作为向 80C51 申请中 断信号。 在主程序中启动 A/D 转换,在继续执行主程序。 在中断服务程序中读取转换结果。 ( 3)查询法 查询法将 EOC 接至 80C51 的某端口 I/O 口线。 启动 A/D 转换后,利用查询该 I/O口线引脚电平是否为 0 的方法读取转换结果。 21 ADC0809 编程方法 应用 ADC0809 进行程序设计时,一般要包含以下基本步骤: ( 1)初始化 设置 ADC0809 的 IN0~IN7 通道地址, 设置存放结果的首单元地址和通道数。 ( 2)启动 ADC0809 先送通道地址到 ADDA~ADDC, 由 ALE 锁存通道号地址,再让 START 有效启动 A/D 转换, 即执行一条“ MOVX @DPTR,A”指令产生 WR 信号 ,使 ALE、 START 有效,锁存通道号并启动 A/D 转换。 ( 3)判断 A/D 转换是否结束 ( 4)读取转换结果 A/D 转换完成后, EOC 端会发出一个正脉冲,接着执行“ MOVX A, @DPTR”指令产生 RD 信号 ,使 OE 端有效 ,打开锁存器三态门 ,8 位数据就读入单片机中。 22 第四章 硬件设计分析 电源设计 本次设计中利用桥式整流和电容滤波以及 7805 集成稳压来输出 +5V 电压,以满足 80C51, ADC0809, 74LS373 等器 件的工作需求,原理如下: 图 电源原理 关于 74LS02, 74LS04 图 (a) 74LS02 引脚 (b) 74LS04 引脚 四 2 输入或非门 74LS02 和六反相器 74LS04 均是基本的集成门电路,输出幅度大,带负载能力强,抗干扰能力强,其工作电压为 3~18V。 23 74LS373 概述 引脚图 图 74LS373 引脚 工 作原理 (1)1 脚是输出使能 (OE),是低电平有效 ,当 1 脚是高电平时 ,不管输入 1 1 1 18 如何 ,也不管 11 脚 (锁存控制端 ,G)如何 ,输出 2(Q1)、 5(Q2)、6(Q3)、 9(Q4)、 12(Q5)、 15(Q6)、 16(Q7)、 19(Q8)全部呈现高阻状态 (或者叫浮空状态 )。 (2)当 1 脚是低电平时 ,只要 11 脚 (锁存控制端 ,G)上出现一个下降 沿 ,输出2(Q1)、 5(Q2)、 6(Q3)、 9(Q4)、 12(Q5)、 15(Q6)、 16(Q7)、 19(Q8)立即呈现输入脚 1 1 1 18 的状态 . 锁存端 LE 由高变低时,输出端 8 位信息被锁存,直到 LE 端再次有效。 当三态门使能信号 OE 为低电平时,三态门导通,允许 Q1~Q8 输出, OE 为高电平时,输出悬空。 (3)74LS373 真值表 G 输出 Q 0 0 保持原输入 1 0 输出 =输入 X 1 高阻状态 24 0——低电平 ; 1——高电平; X——不定态; Q0——建立稳态前 Q 的电平; G——数据锁存控制端 ,与 80C51ALE 连高电平 , 畅通无阻低电平 , 关门锁存。 OE——使能端,接地。 当 G=1 时,锁存器输出端同输入端;当 G 由 “1”变为 “0”时,数据输入锁存器中。 OE 为输出允许端;当 OE=“0”时,三态门打开;当 OE=“1”时,三态门关闭,输出呈高阻状态。 (4) 74ls373 在单片机系统中的应用 当 74LS373 用作地址锁存器时,应使 OE 为低电平,此时锁存使能端 C 为高电平时,输出 Q1~Q8 状态与输入端 D1~8 状态相同;当 C 发生负的跳变时,输入端 D1~D8 数据锁入 Q1~Q8。 51 单片机的 ALE 信号可以直接与 74LS373 的 C 连接。 在 MCS51 单片机系统中,常采用 74LS373 作为地址锁存器使用,其连接方法如上图所示。 其中输入端 D1~D8 接至单片机的 P0 口,输出端 提供的是低 8位地址, G 端接至单片机的地址锁存允许信号 ALE。 输出允许端 OE 接地,表示输出三态门一直打开。 简易数字电压表的硬件设计 用一片 ADC0809 和必要的外围器件与 80C51 进行接口连接,要求对 IN0 所输入的模拟电压进行识别,将其转换成相应的二进制数并以发光二极管的形式显示。 原理图见附录。 25 结 论 通过这次比较完整的设计,使我们摆脱了单纯的理论知识学习状态,达到了理论与实践的结合锻炼了我的综合运用所学的专业基础知识,解决实际设计问题的能力,同时,也提高了我们查阅文献资料 、设计手册、设计规范以及电脑制图等专业能力水平,而且通过整体的掌握对布局的取舍以及对细节的斟酌处理,都使我们能力得到了锻炼、经验得到了丰富,抗压能力以及耐力在不同程度上得到了提高,这是我们都想看到的也是我们进行毕业设计的目的所在。 虽然这次毕业设计内容繁多、过程繁琐但我们收获很多,在这次设计过程中我们不仅对 A/D 转换芯片 ADC0809 有了进一步熟悉,随着设计的不断深入对它的工作原理、启动设置、转换结束判断及输出等都基本掌握,在和老师的沟通交流的过程中我们对设计有了新的认识,并且对实物的连接与布局有了新的看法, 对我们的专业有了进一步的认识,希望在以后的实验中吸取更多地经验学会更多的实践知识。 26 参考文献 张友德:单片 微型 机原理、应用和实验、电子工业出版社。 吴经国:单片机应用技术,中国电力出版社。 李群芳: 单片机微型计算机与接口技术,电工业出版社。 王吉鹏等:微机原理与接口技术,高等教育出版社。 张晔等:单片机应用技术,高等教育出版社。 李建忠:单片机原理及应用 .西安 :西安电子科技大学出版社。 2020 年 谢自美 .电子线路设计实验测试(第二版) .武汉 :华中理工出版社 ,2020 27 . 软件设计程序 ORG 0000H LJMP START ORG 0013H LJMP INT_1 ORG 0100H START: MOV R7, 00H MOV DPTR, 0FEF8H SETB 1T1 SETB EA SETB EX1 A_D: MOV R0, 00H MOV A, R0 MOVX @DPTR, A CJNE R7, 00H, $ MOV A, B MOV P1, A MOV R7, 0FFH。基于51单片机的简易数字电压表的设计单片机
相关推荐
e(busy==1)。 //判断是否为空闲, 1 为忙, 0为空闲 } void write_(uchar ) // 写指令函数 { P0=。 // 指令付给 P0口 rs=0。 //0 0 写指令 无输出 rw=0。 lcden=0。 //关闭 lcd 使能 check()。 //检验按键 lcden=1。 //开启 lcd 使能 哈尔滨华德学院课程设计用纸 11 } void
寄生 (电容 )电源为止。 此外,还可外接 5 V 电源,给 DSl8820 供电。 DSl8820 的供电方式灵活,利用外接电源还可增加系统的稳定性和可靠性。 图 7 为读取数据流程图。 读取 DS18B20 数据的部分 程序代码为: 4 数据测试 将温度传感器与冰水混合物接触,经过充分搅拌达到热平衡后调节系统,使显示读数为0. 00(标定 0℃ );利用气压计读出当时当地的大气压强
ed=true android:drawable=@drawable/desktop_music_voice2 / item android:drawable=@drawable/desktop_music_voice / /selector 5 播放动画的设计 有两个动画文件 和 文件, 当动画结束时 启动另外一个 activity动画特效是两个 imageView同时采用 淡入 ,旋转和
路中采用的共阴极的 LED 数码管,所以在设计电路时加了一个达林顿电路 ULN2020对信号进行放大,产生足够大的电流驱动数码管显示。 由于 4511 只能进行 BCD 十进制译码,只能译到 0 至 9,所以在这里我们利用 4511 译 码输出我们所需要的温度。 报警电路简介 图 3 温度在七段数码管上显示连接图 本文中所设计的报警电路较为简单,由一个自我震荡型的蜂鸣器(只要在蜂鸣器两端加上超过
P0口具有内部上拉电阻。 在 EPROM 编程时, P0 口接收指令字节,同时输出指令字节在程序校验时。 程序校验时需要外接上拉电阻。 P1 口: P1 口是一带有内部上拉电阻的 8位双向 I/O 口。 P1 口的输出缓冲能接受或输出 4 个 TTL 逻辑门电路。 当对 P1 口写 1 时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。 当作为输入端使用时, P1
EDDirection = !LEDDirection。 LEDIndex = (LEDIndex+1)%16。 } //Mode 7 void Mode_7(void) { if(LEDDirection) LEDShow(0x003FLEDIndex)。 else LEDShow(0xFC00LEDIndex)。 if(LEDIndex==9) LEDDirection =