亲们,能不能帮我运行这些代码看看。关于单片机温度设...
主程序代码为:
#include <reg51.h> // 51系类单片机头文件
#include "LCD1602.h" //包含对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; //定义温度下限值 温度*10
uint 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()); //温度处理
}
}
}
附录1
18B20.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;
}