主程序代码为:#include <reg51.h> // 51
系类单片机头文件#include "LCD1602.h" //
包含对times New Roman">1602读写操作的头文件#include "Delay.h" //
延时操作头文件#include "18B20.h" //
包含对18B20操作的头文件#include<intrins.h>sbit beep = P3^0; //
定义蜂鸣器信号线sbit led0=P1^0; //
定义发光二极管端口sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;uint warn_l1=250; //
定义温度下限值 温度*10uint warn_l2=220;uint warn_h1=370;uint warn_h2=350;/******************************************************函数名称:
deal(uint t) **
函数功能:对18B20获取的温度进行相应的处理 * 入口参数:
temp *出口参数:无
********************************************************/void deal(uint t){if((t>warn_l2)&&(t<=warn_l1)) //22~25 度 {led0=0; //
第一个闪烁Delayms(20);led0=1;mdi(); //
蜂鸣器慢“滴”} //
模拟开启制热else if(t<=warn_l2) // <22 度{led0=0;led1=0; //
第一二灯闪烁Delayms(10);led0=1;led1=1;kdi(); //
蜂鸣器快“滴”} //
模拟加大制热功率else if((t>warn_h2)&&(t<=warn_h1)) //35~37度{led2=0; //
第三个灯闪烁Delayms(20);led2=1;mdi(); //
蜂鸣器慢“滴”} //
模拟开启制冷else if(t>=warn_h1) // >37度{led2=0; //
第三四个灯闪烁led3=0;Delayms(10);led2=1;led3=1;kdi(); //
蜂鸣器慢“滴”} //
模拟加大制冷功率else beep=1; //
温度正常}/******************************************************函数名称:
display(uint t); *函数功能:显示温度
* 入口参数:
t *出口参数:无
********************************************************/void display(uint t){write_com(0x80+12); // 第一行第
13列write_data(t/100+0x30); // 十位
+0X30转换为字符显示write_com(0x80+14);write_data(t%100/10+0x30); write_com(0x80+15);write_data(t%10+0x30);}/******************************************************函数名称:
main(void); **
函数功能:主函数 * 入口参数:无
**
出口参数:无 ********************************************************/void main(void){ uchar i = 0; uint temp = 0; while(1){ init(); //LCD
初始化 tempchange(); //
温度转换 _nop_(); //
稍作延时 temp = get_temp(); deal(temp); //
温度处理 _nop_(); for(i=10;i>0;i--) { display(temp()); //
温度处理 }} }
附录118B20.H 头文件#ifndef __18B20_h__ //
防止重复定义#define __18B20_h__#include<reg51.h>#include<intrins.h> #include"18B20.h"#include"Delay.h" extern void dsreset(void); //
函数声明 外部可见extern void tempwritebyte(uchar dat);extern bit tempreadbit(void);extern uchar tempreadbyte(void);extern void tempchange(void);extern uint get_temp(void); #endif 18B20.C
文件#include"18B20.h"sbit beep = P3^0; //
定义蜂鸣器信号线sbit ds = P2^7; //
定义18B20信号线static uint temp = 0;static float f_temp = 0.0; /***************************************
函数名称:dsreset(void) **
函数功能:18B20 初始化 **
入口参数:无 **
出口参数:无 ****************************************/ void dsreset(void){ ds = 1; //
将数据线置高电平 _nop_(); //
稍作延时,要尽可能短 ds = 0; //
拉低数据线 Delayus(40); //
延时 _nop_(); ds = 1; //
将数据线拉高 Delayus(14); //
延时 ds = 1; //
拉高数据线} /*********************************************
函数名称:temwritebyte(uchar dat) **
函数功能:向18B20写一个字节 **
入口参数:dat **
出口参数:无 *********************************************/void tempwritebyte(uchar dat){ uint i; for(i=0;i<8;i++) //
一个字节有8位 { ds=0; //
将数据线拉低 _nop_(); //
稍作延时,待数据稳定 ds=dat&0x01; //
低位在前,高位在后 Delayus(3); //
延时45us _nop_(); _nop_(); ds=1; //
将数据线拉高 dat>>=1; //
左移一位,继续发送下一位 }}/***************************************
函数名称:tempreadbit(void) **
函数功能:读一位数据 **
入口参数:无 **
出口参数:dat ****************************************/bit tempreadbit(void){ uint i = 0; //
定义i,做延时用 bit dat; //
定义一位数据 ds = 0;i++; ds = 1;i++;i++; dat = ds; i = 8;while(i>0)i--; return(dat); //
返回一位数据} /***************************************
函数名称:tempreadbyte(void) **
函数功能:读一个字节 **
入口参数:无 **
出口参数:dat ****************************************/uchar tempreadbyte(void){ uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tempreadbit();dat=(j<<7)|(dat>>1); //
读出的数据低位在前,刚好在一个字节dat里 } return(dat);} /***************************************
函数名称:tempchange(void) **
函数功能:获取18B20温度转换 **
入口参数:无 **
出口参数:无 ****************************************/ void tempchange(void){ dsreset(); //18B20
复位 Delayms(1); //
稍作延时 tempwritebyte(0xcc);//
跳过读ROM指令 tempwritebyte(0x44);//
写温度转换指令} /***************************************** **
函数名称:get_temp(void) **
函数功能:获取18B20寄存器中的数据**
入口参数:无 **
出口参数:temp *****************************************/uint get_temp(void){ uchar a,b; dsreset(); Delayms(1); tempwritebyte(0xcc); //
跳过ROM tempwritebyte(0xbe); //
读暂存器 a = tempreadbyte();//
读低8位 b = tempreadbyte();//
读高8位 temp = b; temp <<= 8;//
将两个字节合为一个字 temp = temp|a; f_temp = temp*0.0625;//
温度在寄存器中为12为,分辨率为0.0625 temp = f_temp*10+0.5; //
温度修正 四舍五入 return temp;}
一周热门 更多>