《硬件课程设计基于Microchip单片机的数字温度计.doc》由会员分享,可在线阅读,更多相关《硬件课程设计基于Microchip单片机的数字温度计.doc(20页珍藏版)》请在三一办公上搜索。
1、基于Microchip单片机的数字温度计硬件课程设计电子与信息工程 通信工程0805 指导老师:王红目 录2.概述33.需求分析3功能要求3设计要求3开发平台34.设计原理33.1 PIC18F452单片机33.11 振荡器配置43.1.2 复位53.1.3存储器构成54.1.4I/0口53.1.5 中断6DS18B20温度传感器65.电路分析和完整电路图104.1 驱动蜂鸣器104.2字符LCD104.3温度传感器114.4键盘114.5硬件结构图114.6 PROTUES仿真图如图所示126.软件分析和完整流程图125.1温度传感器流程图及代码与注释125.2 LCD显示部分代码与注释14
2、5.3 蜂鸣器流程图及部分代码与注释145.4 按键控制报警门限部分代码及注释157.调试故障的检测与分析167.1温度传感器DS18B20部分167.2蜂鸣器部分167.2.1蜂鸣器响并且数字显示不变167.2.2蜂鸣器报警后低于报警温度时仍然在报警177.3显示部分177.4按键控制报警门限问题178.总体认知179.参考文献1710.附录181. 概述本设计以PIC18F452单片机为核心,采用美国DALLAS公司的数字温度传感器DS18B20,设计了一种简单的数字温度测量与报警系统。本设计介绍PIC单片机和温度传感器DS18B20,以及温度传感器DS18B20的工作时序。同时,提出最简
3、单的温度测量与显示报警系统的硬件电路和软件程序设计的方案。2. 需求分析功能要求测量环境温度,采用接触式温度传感器测量,用液晶LCD显示温度值,用DS18B20作为温度传感器采集温度,最终把当前温度显示在液晶上。可以实现报警功能。当温度高于某一设定值时通过蜂鸣器报警。设计要求 由液晶LCD显示当前温度值。 精度为0.5C。 当温度高于某一设定值时通过蜂鸣器进行报警。 通过开关控制蜂鸣器门限值开发平台 APP001 board-实验板,板上主芯片为PIC18F452,适用于PIC18和PIC16系列的40PIN的MCU MPLAB ICD2 -在线调试器 可支持Microchip绝大多数flas
4、h芯片的调试 MPLAB C18-C编译器 Microchip PIC18 系列 温度传感器 DS18B203. 设计原理3.1 PIC18F452单片机PIC18F452是一种带有10位A/D的高性能增强型闪存单片机。它有高性能的RISC CPU。他的程序存储器先性寻址有32KB,数据存储器线性寻址有1.5KB。其指令总线为16位,数据总线为8位宽。他有高达10MIPS的操作,比如他有4-10MHz的振荡器及带锁相环的时钟输入。他有40MHz振荡器及时钟输入。外设特性: 高灌电流/ 拉电流 25 mA/25 mA 三个外部中断引脚 Timer0 模块:带8 位可编程的预分频器的8 位/16
5、位定时器/ 计数器 Timer1 模块:16 位定时器/ 计数器 Timer2 模块:带8 位周期寄存器(作为PWM时基)的定时器/ 计数器 Timer3 模块:16 位定时器/ 计数器 副振荡器时钟选项:Timer1/Timer3 两个捕捉/ 比较/PWM(CCP)模块。CCP 引脚可以配置为:- 捕捉输入:捕捉为16 位,最大分辨率为6.25 ns (TCY/16)- 比较为16 位,最大分辨率为100 ns (TCY)- PWM输出:PWM 分辨率为1 到10 位,8 位分辨率时最大PWM 频率为156 kHz10 位分辨率时最大PWM 频率为39 kHz 主同步串行口(Master S
6、ynchronous SerialPort, MSSP)模块,两种操作模式:- 3线SPI (支持所有的4 种SPI 模式)- I2C 主从模式 可寻址的USART 模块:- 支持RS-485 和RS-232并行从动端口(Parallel Slave Port, PSP)模拟特性: 兼容的10 位模数转换器模块(A/D),具有:- 快速采样率- 休眠期间可以进行转换- 线性度小于等于1 LSb 可编程低压检测(Programmable Low VoltageDetection, PLVD)- 支持低压检测中断 可编程欠压复位(Brown-out Reset, BOR)特殊单片机特性: 增强型典
7、型闪存程序存储器可擦写100,000 次 数据EEPROM 存储器可擦写1,000,000 次 闪存/ 数据EEPROM 保存期大于40 年 软件控制下可自行再编程 上电复位(Power-on Reset, POR)、上电延时定时器(Power-up Timer, PWRT)和振荡器起振定时器(Oscillator Start-up Timer, OST) 带有独立的片内RC 振荡器的看门狗定时器(Watchdog Timer, WDT)可保证运行可靠 可编程代码保护 省电的休眠模式 用户可选的振荡器包括:- 4倍锁相环(用于主振荡器)- 32 kHz副振荡器时钟输入 由5V 单电源供电,通过
8、两引脚电路进行在线串行编程(In-Circuit Serial Programming,ICSP) 通过两引脚进行在线调试(In-Circuit Debug,ICD)3.11 振荡器配置PIC18F452可以在八种震荡模式下工作。用户可以通过对三个配置位(FOSC2,FOSC1和FOSC0)编程来选择其中一种模式:1. LP 低功耗晶体2. XT 晶振/ 谐振器3. HS 高速晶体/ 谐振器4. HS PLL 高速晶体/谐振器,允许使用锁相环5. RC 外部电阻/ 电容振荡模式6. RCIO 外部电阻/ 电容振荡模式,使用I/O引脚7. EC 外部时钟振荡模式8. ECIO 外部时钟振荡模式,
9、使用I/O 引脚在本实验中我使用16M晶振,所以选择HS 高速晶体/ 谐振器。#pragma config OSC=HS /晶振选择HS模式(高速外部模式)3.1.2 复位PIC18F452有以下几种复位方式: 上电复位(POR) 正常工作状态下的MCLR 复位 休眠状态下的MCLR 复位 看门狗定时器(WDT)复位(正常工作状态下) 可编程的欠压复位(BOR) RESET 指令 堆栈满复位 堆栈下溢复位在本实验中为方便关闭看门狗关闭低电压保护。#pragma config LVP=OFF /关闭低电压保护#pragma config WDT=OFF /关闭看门狗3.1.3存储器构成在增强型M
10、CU 器件中有三种存储器模块。这些存储器模块是:n 程序存储器n 数据RAMn 数据EEPROM数据和程序存储器各自使用不同的总线,这样就能同时访问这些模块。3.1.4 I/0口当相应的外设使能时,对应的引脚不能作为通用I/O引脚使用。每个端口有三个用于操作的寄存器,这些寄存器分别是: TRIS 寄存器(数据方向寄存器) PORT寄存器(读取器件引脚的电平状态) LAT寄存器(输出锁存器)通过观察引脚配置,发现E的IO口与电源和地相邻,为方便使用E作为IO口。PORTE 是一个3 位宽的双向端口。对应的数据方向寄存器是TRISE。将TRISE 位置1,使相应的PORTE 引脚作为输入(即,相应
11、的输出驱动呈高阻态)。将TRISE位清零,使相应的PORTE 引脚作为输出(即,输出锁存器中的数据从相应引脚输出)。数据锁存器(LATE)也是存储器映射的。对LATE 寄存器的“读修改写”操作是读写锁存的PORTE 输出值。PORTE 有三个引脚(RE0/RD/AN5、RE1/WR/AN6 和RE2/CS/AN7) ,可对其分别进行配置,或为输入或为输出。这些引脚都有施密特触发输入缓冲器。I/O口模式下的PORTE结构图3.1.5 中断PIC18FXX2 器件具有多个中断源及一个中断优先级功能,该功能可以给每个中断源分配高优先级中断或者低优先级中断。高优先级中断向量位于000008h,低优先级
12、中断向量位于000018h。高优先级中断事件会覆盖掉任何正在执行的低优先级中断。DS18B20温度传感器DS18B20温度传感器是美国DALLAS半导体公司推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。DS18B20的性能特点如下:独特的单线接口仅需要一个端口引脚进行通信,无须经过其它变换电路;多个DS18B20可以并联在惟一的三线上,实现多点组网功能;内含64位经过激光修正的只读存储器ROM;可通过数据线供电,内含寄生电源,电压范围为3.05.5;零待机功耗;温度以9或12位数字;用户可定
13、义报警设置; 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;测温范围为-55-+125,测量分辨率为0.0625采用单总线专用技术,DS18B20采用3脚PR35封装或8脚SOIC封装,其内部结构框图如图所示。DS1820 有三个主要数字部件:1)64 位激光ROM,2)温度传感器,3)非易失性温度报警触发器TH 和TL。器件用如下方式从单线通讯线上汲取能量:在信号线处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。DS1820 也可用外部
14、5V 电源供电。DS1820 依靠一个单线端口通讯。在单线端口条件下,必须先建立ROM 操作协议,才能进行存储器和控制操作。因此,控制器必须首先提供下面5 个ROM 操作命令之一:1)读ROM,2)匹配ROM,3)搜索ROM,4)跳过ROM,5)报警搜索。一条控制操作命令指示 DS1820 完成一次温度测量。测量结果放在DS1820 的暂存器里,用一条读暂存器内容的存储器操作命令可以把暂存器中数据读出。温度报警触发器TH 和TL 各由一个EEPROM 字节构成。如果没有对DS1820 使用报警搜索命令,这些寄存器可以做为一般用途的用户存储器使用。可以用一条存储器操作命令对TH 和TL 进行写入
15、,对这些寄存器的读出需要通过暂存器。所有数据都是以最低有效位在前的方式进行读写。DS1820 通过一种片上温度测量技术来测量温度。图4 示出了温度测量电路的方框图。DS1820 是这样测温的:用一个高温度系数的振荡器确定一个门周期,内部计数器在这个门周期内对一个低温度系数的振荡器的脉冲进行计数来得到温度值。计数器被预置到对应于-55的一个值。如果计数器在门周期结束前到达0,则温度寄存器(同样被预置到-55)的值增加,表明所测温度大于-55。同时,计数器被复位到一个值,这个值由斜坡式累加器电路确定,斜坡式累加器电路用来补偿感温振荡器的抛物线特性。然后计数器又开始计数直到0,如果门周期仍未结束,将
16、重复这一过程。斜坡式累加器用来补偿感温振荡器的非线性,以期在测温时获得比较高的分辨力。这是通过改变计数器对温度每增加一度所需计数的的值来实现的。因此,要想获得所需的分辨力,必须同时知道在给定温度下计数器的值和每一度的计数值。DS1820 内部对此计算的结果可提供0.5的分辨力。温度以16bit 带符号位扩展的二进制补码形式读出,表1 给出了温度值和输出数据的关系。数据通过单线接口以串行方式传输。DS1820 的存储器结构示于图8。存储器由一个暂存RAM 和一个存储高低温报警触发值TH 和TL 的非易失性电可擦除(E2)RAM 组成。当在单线总线上通讯时,暂存器帮助确保数据的完整性。数据先被写入
17、暂存器,这里的数据可被读回。数据经过校验后,用一个拷贝暂存器命令会把数据传到非易性(E2)RAM 中。这一过程确保更改存储器时数据的完整性。单线总线的空闲状态是高电平。无论任何理由需要暂停某一执行过程时,如果还想恢复执行的话,总线必必须停留在空闲状态。在恢复期间,如果单线总线处于非活动(高电平)状态,位与位间的恢复时间可以无限长。如果总线停留在低电平超过480s,总线上的所有器件都将被复位。通过单线总线端口访问 DS1820 的协议如下:初始化通过单线总线的所有执行(处理)都从一个初始化序列开始。初始化序列包括一个由总线控制器发出的复位脉冲和跟有其后由从机发出的存在脉冲。存在脉冲让总线控制器知
18、道 DS1820 在总线上且已准备好操作。详见“单线信号”节。ROM 操作命令一旦总线控制器探测到一个存在脉冲,它就可以发出 5 个ROM 命令中的任一个。所有ROM 操作命令都8 位长度。I/O 信号DS1820 需要严格的协议以确保数据的完整性。协议包括几种单线信号类型:复位脉冲、存在脉冲、写0、写1、读0 和读1。所有这些信号,除存在脉冲外,都是由总线控制器发出的。和 DS1820 间的任何通讯都需要以初始化序列开始,初始化序列见图11。一个复位脉冲跟着一个存在脉冲表明DS1820 已经准备好发送和接收数据。总线控制器发出(TX)一个复位脉冲(一个最少保持480s 的低电平信号),然后释
19、放总线,进入接收状态(RX)。单线总线由5K 上拉电阻拉到高电平。探测到I/O 引脚上的上升沿后,DS1820 等待1560s,然后发出存在脉冲(一个60240s 的低电平信号)。读/写时间隙DS1820 的数据读写是通过时间隙处理位和命令字来确认信息交换。写时间隙当主机把数据线从逻辑高电平拉到逻辑低电平的时候,写时间隙开始。有两种写时间隙:写1 时间隙和写0 时间隙。所有写时间隙必须最少持续60s,包括两个写周期间至少1s 的恢复时间。I/O 线电平变低后,DS1820 在一个15s 到60s 的窗口内对I/O 线采样。如果线上是高电平,就是写1,如果线上是低电平,就是写0(见图12)读时间
20、隙当从 DS1820 读取数据时,主机生成读时间隙。当主机把数据线从高高平拉到低电平时,写时间隙开始。数据线必须保持至少1s;从DS1820 输出的数据在读时间隙的下降沿出现后15s 内有效。因此,主机在读时间隙开始后必须停止把I/O 脚驱动为低电平15s,以读取I/O 脚状态(见图12)。在读时间隙的结尾,I/O 引脚将被外部上拉电阻拉到高电平。所有读时间隙必须最少60s,包括两个读周期间至少1s 的恢复时间。当DS18B20处于写存储器操作时,总线上必须有强的上拉,上拉开启时间最大为10us。由于单线制只有一根线,因此发送接口必须是三态的。4. 电路分析和完整电路图4.1 驱动蜂鸣器APP
21、001开发板上蜂鸣器由RC2控制一个三极管来驱动,当JP4的跳线开关短路时,RC2管脚输出高电平便会是蜂鸣器发出声音,RC2输出低电平便使蜂鸣器停止发声。4.2字符LCDAPP001开发板配置2*16字符LCD,接口为LCD的RS接PIC18F452的RD4,表示命令和数据标志位;LCD的RW接PIC18F452的RD5,表示读写控制位; LCD的使能接PIC18F452的RA2。LCD与PIC18F452的接口是RD0-RD3,连接到LCD模块的DB4-DB7。RD=0时,RD0-RD3是读取和写入数据到LCD的命令寄存器;RD=时,RD0-RD3读取和写入要显示的数据4.3温度传感器使用D
22、S18B20温度传感器。其中DS18B20的高低电平与PIC18F452的高低电平直接相连,DS8B20的传输数据引脚与RE0相连。本连接只为方便,未考虑其他因素。4.4键盘使用开发板上按键4.5硬件结构图由图中可以看出,温度传感器使用单片机的D端口,按键,LCD显示,蜂鸣器使用单片机的I/O口。同时通过MPLAB IDE2进行程序的调试。4.6 PROTUES仿真图如图所示蜂鸣器通过RC2相连,温度传感器通过RE0相连,LCD通过RD相连。同时PIC18F452也外接晶振。5. 软件分析和完整流程图5.1温度传感器流程图及代码与注释/定义端口#define DQ PORTEbits.RE0
23、/定义18B20数据端口#define DQ_DIR TRISEbits.TRISE0 /定义18B20D口方向寄存器#define DQ_HIGH() DQ_DIR =1 /设置数据口为输入#define DQ_LOW() DQ = 0; DQ_DIR = 0 /设置数据口为输出/ DS18B20初始化程序void Init18B20(void) DQ_LOW(); /主机拉至低电平delay(100); /至少延时480us(400us960us) 总线控制器发出(TX)一个复位脉冲(一个最少保持480s 的低电平信号)DQ=1; /释放总线灯电阻拉高总线delay(8); /进行适当延时
24、DQ_HIGH(); /讲数据口和寄存器都置高delay(16); /至少延时100usDQ_DIR = 0; /将寄存器置0DQ=1; /将数据口置1写时间间隙需要延时,大概为小于15us,并且在两次独立写间隙间要45us的恢复时间。写时序起始于单片机拉低总线。void Write_Byte (unsigned char wr) /单字节写入unsigned char i;DQ_DIR = 0; /将寄存器置0 DQ=1;/将数据口置1for (i=0;i8;i+)DQ = 0;/将数据口置0Nop();Nop();Nop();Nop();/进行小延时1); DQ=1;/将数据口置1根据DS
25、18B20读时序,读间隙需要延时,并且在2次独立的读间隙至少西药1us的恢复时间。读间隙起始于单片机拉低总线至少1us,DS18B20在读时序开始15us开始采样总线电平。unsigned char Read_Byte (void) /读取单字节unsigned char i,u=0;DQ_DIR = 0;/将寄存器置0DQ = 1;/将数据口置1for(i=0;i1);/NOP();NOP();DQ = 1;DQ_DIR= 1;Nop(); if(DQ)u= (u|0x80);delay(8);/50usDQ_DIR = 0;DQ = 1;return(u);void DS18B20_Rea
26、d(void) /读取DS18B20当前温度值 Init18B20();Write_Byte(0xCC); / 跳过 ROMWrite_Byte(0x44); / 启动温度转换Delay_nms(1);Init18B20();/复位操作Write_Byte(0xCC); / 跳过 ROMWrite_Byte(0xBE); / 读暂存器Temperature.Temp0 = Read_Byte(); Temperature.Temp1 = Read_Byte(); 5.2 LCD显示部分代码与注释OpenLCD();/打开LCDWriteCmdLCD( 0x01 );delay_ms(5);/
27、延时 LCD_Set_Cursor( 0, 0 );/ 光标指向(0,0) putrsLCD(Temperature is);/ 输入字符串 LCD_Set_Cursor( 1, 0 );/光标指向(1,0) delay_ms(1);/ 延时 putcLCD( ch);/ 输出温度值 LCD_Set_Cursor( 1, 1 ); delay_ms(1); putcLCD(cl);/ LCD_Set_Cursor( 1, 2 ); delay_ms(1); putrsLCD(.); LCD_Set_Cursor( 1, 3 ); delay_ms(1); putcLCD(c1); LCD_Se
28、t_Cursor( 1,5 ); delay_ms(1); putrsLCD(C);5.3 蜂鸣器流程图及部分代码与注释void pwm_0(void) /不发声 TRISC=0x00; /端口C设为输出 RC2=0; delay_pwm(200); /延时 void pwm_1(void) /发声 TRISC=0x00; /端口C设为输出 RC2=0; RC2=RC2; /给RC2管脚送一个矩形脉冲,使之发声 delay_pwm(200); /延时 if (value290) /温度大于设定值则发声,否则不发声pwm_1(); elsepwm_0();5.4 按键控制报警门限部分代码及注释T
29、RISB=0x01; /初始化B端口 TRISA=0x10;/初始化A端口if(RA4=0)/若按下A键 temp=value;/将当前值设为门限值 else if(RB0=0)/若按下B键 temp=270;/门限值设为27C if (valuetemp)/上述报警门限从而发生相应的修改pwm_1(); elsepwm_0();6. 调试故障的检测与分析6.1 温度传感器DS18B20部分温度传感器DS18B20的时序问题是本设计的一个非常重要的问题。在初始化DS18B20时,必须使总线控制器发出(TX)一个复位脉冲(一个最少保持480s 的低电平信号),然后释放总线,进入接收状态(RX)。
30、经过尝试,任何小于480us的延时都不能正常初始化DS18B20导致最后的结果输出为0。同时,这个延时也不能过长,必须小于960us,否则也不能正常初始化。在初始化的时候我参考了部分网上的代码。但是都不能正常输出。原因是本实验的晶振使用16M晶振,而网上代码的晶振有12M,有4M,所以这些延时程序都不正确。要写出正确的延时程序必须使用示波器观察波形。通过示波器观察以及修改部分网上的代码我得出了比较接近的延时程序。最后初始化成功。使得DS18B20能够正常工作。在显示温度值过程中,即使初始化成功显示不能正常显示。究其原因,发现在初始化之前也得初始化端口号。在显示前加入初始化程序即可:端口初始化程
31、序:TRISE = 0;/E端口寄存器置0ADCON1 = 0X0F;由于DS18B20采用单总线工作方式,由于所有数据和控制信号都通过单总线传输,因此总线的时序逻辑必须非常严格。总结下,就是单片机和DS18B20的通讯是由一个单片机的复位脉冲和一个DS18B20的应答脉冲开始的。单片机先发一个复位脉冲,保持低电平至少480us而且不能超过960us。之后单片机释放总线,等待DS18B20应答。DS18B20接收到复位脉冲后等待15-60us发出应答脉冲。应答脉冲能保持60-240us。单片机从发送完复位脉冲到再次控制总线至少要480us.6.2 蜂鸣器部分蜂鸣器部分实现比较简单。但是碰到几个
32、问题。6.2.1 蜂鸣器响并且数字显示不变一开始直接在程序中加入蜂鸣器报警的程序,然而测试的时候发现一旦达到超过温度值得情况,数字显示则不发生变化。通过调试,发现用蜂鸣器实现报警功能是在一个死循环内。在达到死循环后,一方面不能再读取温度,导致在LCD上不能继续显示,另一方面,蜂鸣器会一直响。解决办法是去掉蜂鸣器报警功能中的死循环,将这个循环利用主循环完成。6.2.2 蜂鸣器报警后低于报警温度时仍然在报警蜂鸣器报警功能中另一个问题是当报警功能实现后,当温度低于设定值时仍然报警,蜂鸣器一直在响。解决办法是设定两个蜂鸣器报警功能,一个是蜂鸣器响,另一个是蜂鸣器不响。当温度值大于设定值时调用蜂鸣器响的
33、函数,当温度值小于设定值时调用蜂鸣器不响的函数。这样就解决了这个问题。6.3 显示部分LCD发生屏幕闪烁的问题。经过调试发现是因为延时过长的问题。所以通过调整延时函数,实现了LCE屏幕不发生闪烁。6.4 按键控制报警门限问题按键部分首先问题是按键结束后没有任何反应,经过调试发现是未经过按键的端口的初始化,导致按键功能不能实现。按键部分第二个问题是本来打算使用按键来设定温度值,然而因为按键驱动问题没有实现。经过思考发现可以通过按键记录当时温度值,然后将这个温度值作为设定值。通过这个方案,很方便的实现了按键设定温度值得问题。7. 总体认知本设计采用PIC18F452控制器和DS18B20温度传感器
34、构成温度控制系统。通过实验仿真能正确测量和正确显示温度。通过本次实验,我深刻认识了温度传感器DS18B20的严格的时序性及方便性。DS18B20无需A/D转换器,转换速度快,降低成本,简化电路,提高电路的集成度,易于扩展。通过解决DS18B20的时序问题,我终于有机会尝试理论与实践的结合。通过调试判断时序,使得我对DS18B20的逻辑过程有了很深的理解。同时,通过一步一步加上功能模块,我对单片机PIC18F452有了更深入的理解。比如在温度显示模块上加报警模块,然后再加按键控制报警模块。通过一步一步的调试终于可以实现所有的功能。同时,在调试解决问题的时候,我通过它的调试方法也理解了单片机的调试
35、步骤,发现他跟软件调试差不多,只是多了硬件部分。总体来说,本次实验让我有了次实践的机会。通过本课程的学习,我也对本课程提出几点建议。下次做温度传感器可以不用实验板,让我们自己设计电路然后通过阅读芯片资料完成温度传感器的设计。本次实验由于采用实验板,有很多例程可以参考,所以制作相对简单。8. 参考文献1.DS18B20数据手册ds18b20_cn2.PIC18F452数据手册3. 张明 基于PIC单片机和DS18B20的温度测量系统设计2006附录主函数程序#include #include #include my_LCD.h#pragma configOSC=HS, WDT=OFF, LVP=
36、OFF #define OSC_CLOCK 10#defineRA4PORTAbits.RA4#defineRB0PORTBbits.RB0#defineRC2 PORTCbits.RC2 #define uch unsigned char#define DQ PORTEbits.RE0 #define DQ_DIR TRISEbits.TRISE0 #define DQ_HIGH() DQ_DIR =1#define DQ_LOW() DQ = 0; DQ_DIR = 0 union Temperature unsigned int Tval; unsigned char Temp2;vol
37、atile union Temperature Temperature;void delay_ms(long A);void delay(unsigned int n);void Init18B20(void);void Write_Byte (unsigned char wr);unsigned char Read_Byte (void);void DS18B20_Read(void);void Delay_nms(unsigned int n);void Delay_nus(unsigned int n);void delay_pwm(unsigned char k);void pwm_1
38、(void);void pwm_0(void);void main() unsigned char i,ch,cl,c1,c2;float t ;unsigned int value=0;unsigned int temp=270;TRISE = 0;ADCON1 = 0X0F;TRISB=0x01; TRISA=0x10;while(1)DS18B20_Read();t=Temperature.Tval*0.0625; value=t*10; if(RA4=0) temp=value; else if(RB0=0) temp=270; if (valuetemp)pwm_1(); elsep
39、wm_0(); ch=value/100+0x30; cl=value%100/10+0x30; c1=value%10+0x30; OpenLCD();WriteCmdLCD( 0x01 );delay_ms(5); LCD_Set_Cursor( 0, 0 ); putrsLCD(Temperature is); LCD_Set_Cursor( 1, 0 ); delay_ms(1); putcLCD( ch); LCD_Set_Cursor( 1, 1 ); delay_ms(1); putcLCD(cl);/ LCD_Set_Cursor( 1, 2 ); delay_ms(1); p
40、utrsLCD(.); LCD_Set_Cursor( 1, 3 ); delay_ms(1); putcLCD(c1); LCD_Set_Cursor( 1,5 ); delay_ms(1); putrsLCD(C); void delay_ms(long A) long i;int us2TCY;us2TCY=(10*OSC_CLOCK)2;for(i=0;iA;i+) Delay100TCYx(us2TCY);void delay(unsigned int n) unsigned int m = 2*n; while(-m);void Init18B20(void) DQ_LOW();d
41、elay(100); DQ=1;delay(8);DQ_HIGH();delay(16);DQ_DIR = 0;DQ=1;void Write_Byte (unsigned char wr) unsigned char i;DQ_DIR = 0; DQ=1;for (i=0;i1); DQ=1;unsigned char Read_Byte (void) unsigned char i,u=0;DQ_DIR = 0;DQ = 1;for(i=0;i1);/NOP();NOP();DQ = 1;DQ_DIR= 1;Nop(); if(DQ)u= (u|0x80);delay(8);DQ_DIR = 0;DQ = 1;return(u);void DS18B20_Read(void) Init18B20();Write_Byte(0xCC); Write_Byte(0x44); Delay_nms(1);/Delay(20);Init18B20();Write_Byte(0xCC); Write_Byte(0xBE); Temperature.Temp0 = Read_Byte()