多功能数字电压表、万年历和温度测试器(编辑修改稿)内容摘要:

EEPROM 中,掉电后依然保存。 DS18B20 的性能是新一代产品中最好的。 性能价格比也非常出色。 DS1822 与 DS18B20 软件兼容,是 DS18B20 的简化版本。 省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为 177。 2176。 C ,适用于对性能要求不高,成本控制严格的应用,是经济型产品。 继 一线总线 的早期产品后, DS1820 开辟了温度传感器技术的新概念。 DS18B20 和 DS1822 使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。 DS18B20 的新性能 1) 可用数据线供电,电压范围: ~; 2) 测温范围: 55~+125℃ ,在 10~+85℃ 时精度为 177。 ℃ ; 3) 可编程的分辨率为 9~12 位,对应的可分辨温度分别为 ℃ 、 ℃ 、℃ 和 ℃ ; 4) 12 位分辨率时最多在 750ms 内把温度值转换为数字; 5) 负压特性:电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。 DS18B20 的外形和内部结构 DS18B20 内部结构主要由四部分组成: 64 位光刻 ROM、温度传感器、非挥发的温度报警触发器 TH和 TL、配置寄存器。 DS18B20 的管脚排列如下 : DS18B20 外形图 引脚定义: 1) DQ 为数字信号输入 /输出端; 2) GND 为电源地; 3) VDD 为外接供电电源输入端(在寄生电源接线方式时接地)。 内部结构 DS18B20 内部结构图 DS18B20 有 4个主要的数据部件: 1)光刻 ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 DS18B20 的地址序列码。 64 位光刻 ROM的排列是:开始 8位( 28H)是产品类型标号,接着的 48 位是该 DS18B20 自身的序列号,最后 8 位是前面 56位的循环冗余校验码( CRC=X8+X5+X4+1)。 光刻 ROM 的作用是使每一个 DS18B20 都各不相同,这样就可以实现一根总线上挂接多个 DS18B20 的目的。 2) DS18B20 中的温度传感器可完成对温度的测量,以 12位转化为例:用 16 位符号扩展的二进制补码读数形式提供,以 ℃ /LSB 形式表达,其中S为符号位。 表 61 DS18B20 温度值格式表 这是 12位转化后得到的 12位数据,存储在 18B20 的两个 8比特的 RAM 中,二进制中的前面 5位是符号位,如果测得的温度大于 0,这 5位为 0,只要将测到的数值乘于 即可得到实际温度;如果温度小于 0,这 5位为 1,测到的数值需要取反加 1再乘于 即可得到实际温度。 例如 +125℃ 的数字输出为 07D0H, +℃ 的数字输出为 0191H, ℃的数字输出为 FF6FH, 55℃ 的数字输出为 FC90H。 表 62 DS18B20 温度数据表 3) DS18B20 温度传感器的存储器 DS18B20温度传感器的内部存储器包括一个高速暂存 RAM和一个非易失性的可电擦除的 EEPRAM,后者存放高温度和低温度触发器 TH、 TL和结构寄存器。 4)配置寄存器 该字节各位的意义如下: 表 63 配置寄存器结构 TM R1 R0 1 1 1 1 1 低五位一直都是 1 , TM 是测试模式位,用于设置 DS18B20 在工作模式还是在测试模式。 在 DS18B20 出厂时该位被设置为 0,用户不要去改动。 R1和 R0 用来设置分辨率,如下表所示:( DS18B20 出厂时被设置为 12 位) 分辨率设置表: 表 64 温度值分辨率设置表 R1 R0 分辨率 温度最大转换时间 0 0 9 位 0 1 10 位 1 0 11 位 375ms 1 1 12 位 750ms 硬件模块设计 1)数字电压模块 设计方框图如下 原理接线图如下 单片机 A/D 转换器 电压显示器 模拟电压输入 量程控制电路 系统总框图 2)万年历与温测模块 原理接线图如下 4 软件设计 我们采用 C 语言编程,通过定时器 0 计时实现显示时间功能,通过串口中断实现上位机对下位机的模式切换功能。 通过键盘扫描和扫描处理函数,实现键 盘的模式切换功能。 同时我们还设计了浮点数显示处理函数,采样函数,交流采集电压峰峰值函数,显示交流周期和峰峰值函数。 这些函数的组合,实现了电压表功能的完善。 万年历总流程图 系统软件设计总流程图 温度检测 温度检测总流程图 DS18B20在单片机控制下分三个阶段 : ● 18B20 初始化:初始化流程图见 ●读 18B20时序:读 DS18B20流程见图 : ●写 18B20时序:写 18B20 流程见图 图 DS18B20流程图 图 DS18B20流程图 5软硬件联调 ............................................... .......... 6总结 ............................................... .......... 设计中遇到的问题和解决方案 ....................... ............. 对本次设计的展望 .................................... 参考文献 .......................................... ...... .... . ...... ... 附录 1: 源程序代码 1) 数字电压表程序 include //头文件 define uchar unsigned char // define uint unsigned int // // ***********ADC************* / //========ADC0809=相关管脚设置以及变量定义 =================== sbit ADC_ST=P3^0。 sbit ADC_OE=P3^1。 sbit ADC_EOC=P3^2。 sbit ADC_CLK=P3^3。 uint ADC_xianshi。 float ADC_number,ADC_shiji。 // ======================1602============== //===================1602 管脚设置及变量定义 ================= uchar code table[]=CuiLongFei!。 uchar qian,bai,shi,ge。 sbit lcden=P3^4。 sbit lcdrs=P3^5。 uchar num。 //=============== sbit LED=P2^0。 // **********延时程序 *********** // // // // ********************* // //================毫秒级的延时程序 =============== void DelayMS(uint xms) { uint i,j。 for(i=xms。 i0。 i) for(j=115。 j0。 j)。 } //================微秒级的延时程序 =============== void Delayus(unsigned int i) { while(i)。 } //========================================== //===================1602 写命令子程序 ======================= void write_(uchar ) { lcdrs=0。 //RS=0。 P1=。 //P1 DelayMS(5)。 lcden=1。 //EN=1。 DelayMS(5)。 lcden=0。 } //===================1602 写数据子程序 ======================= void write_data(uchar date) { lcdrs=1。 P1=date。 DelayMS(5)。 lcden=1。 DelayMS(5)。 lcden=0。 } //======================1602 初始化子程序 ===================== //========================================================== void init() { lcden=0。 write_(0x38)。 // write_(0x0c)。 write_(0x06)。 write_(0x01)。 } //==========================ADC=================== //=================ADC0809 显示数据的处理 ============ void ADC_Display() { qian=ADC_xianshi/1000。 bai=ADC_xianshi%1000/100。 shi=ADC_xianshi%100/10。 ge=ADC_xianshi%100%10。 } //============ADC 初始化 ================== void ADC_Main() { ADC_ST=0。 Delayus(5)。 ADC_ST=1。 Delayus(5)。 ADC_ST=0。 Delayus(5)。 while(ADC_EOC==0)。 // EOC=1。 转换结束 ADC_OE=1。 Delayus(5)。 ADC_number=P0。 Delayus(5)。 ADC_OE=0。 Delayus(5)。 Delayus(5)。 ADC_shiji=(*ADC_number)/。 ADC_xianshi=ADC_shiji*1000。 Delayus(5)。 } //======================main============================= //======================主函数 ======================== void main() { init()。 //1602 初始化 write_(0x80)。 //1602 第一排显示命令 for(num=0。 num11。 num++) //显示崔龙飞 { write_data(table[num])。 DelayMS(20)。 } while(1) //循环函数 { LED=0。 ADC_Main()。 //ADC 初始化 ADC_Display()。 //ADC 数据处理 write_(0x80+0x40)。 //1602 第二排显示命令 //==================显示测量的电压值 ================== write_data(0x30+qian)。 DelayMS(20)。 write_data(0x30+bai)。 DelayMS(20)。 write_data(0x30+shi)。 DelayMS(20)。 write_data(0x30+ge)。 DelayMS(20)。 //===================MV 显示 ========================== write_data(39。 M39。 )。 DelayMS(20)。 write_data(39。 V39。 )。 DelayMS(20)。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。