51单片机红外red监控温度ds18b20

#include “public.h”
#include “ds18b20.h”
#include “ired.h”
#include “smg.h”
#include “beep.h”

//定义宏值
#define RPT_KEY_VALUE 0x19
#define USD_KEY_VALUE 0x0d
#define two_KEY_VALUE 0x18
//#define five_KEY_VALUE 0x1c

sbit led1 = P2^0;
sbit led2 = P2^1;

/******************************************************************
*主函数
****************************************************************/

void main()
{

 u8 both_buf[8];
 u8 ired_save1 = 0;
 u8 ired_save2 = 0;
 u8 time_gap = 0;
 
 int temp_max = 0; 
 int temp_value;	
 int temp_max_save = 0;
								  
 ds18b20_init();//初始化
 ired_init();//红外初始化
 while(1)
 {

	time_gap++;
	if(time_gap%50 == 0)
		temp_value = ds18b20_read_temperture()*10;
	if(temp_value < 0)
	{
		temp_value = -temp_value;
		both_buf[0] = 0x40;
	}
	else
		both_buf[0] = 0x00;
		both_buf[1] = gsmg_code[temp_value/1000];
		both_buf[2] = gsmg_code[temp_value%1000/100];
		both_buf[3] = gsmg_code[temp_value%1000%100/10]|0x80;
		both_buf[4] = gsmg_code[temp_value%1000%100%10];

	 ired_save1 = ired_data_save[2]; 
	 if(ired_save1 != 0)ired_save2 = ired_save1;
	 both_buf[5] = gsmg_code[ired_save2/16];
	 both_buf[6] = gsmg_code[ired_save2%16];
	 both_buf[7] = 0X76;      
	 smg_display(both_buf,1);  

	 if(ired_save1 == RPT_KEY_VALUE) 
	 {
	     led1 = 0;
	     ired_data_save[2] = 0; 
	 } 
	 else if(ired_save1 == two_KEY_VALUE) 
	 {  
	     led2 = 0;
		 temp_max = 220;     
	 } 
	 else if(ired_save1 == USD_KEY_VALUE) 
	 {
		 led1 = 1;
		 led2 = 1;
		 temp_max_save = temp_max;
		 if(temp_value >= temp_max_save)
		 beep_alarm(100,10);


	 } 
}

}
#include “ired.h”
u8 ired_data_save[4];

void ired_init(void)
{
IT0 = 1;
EX0 = 1;
EA = 1;
IRED = 1;
}

void ired() interrupt 0
{ u16 time_delay = 0;
u8 ired_high_time = 0;
u8 i = 0,j = 0;

 if(IRED == 0)
 {
	 time_delay = 1000;
	 while(!IRED && time_delay)	  
	 {
	   	delay_10us(1);
		time_delay--;
		if(time_delay == 0)return; 
	 }
	 if(IRED == 1)			      
	 {
		  time_delay = 500;
		  while(IRED && time_delay)	
		  {
		   	delay_10us(1);
			time_delay--;
			if(time_delay == 0)return;	
		  }
		  for(i = 0;i < 4;i++)		  
		  {
			  for(j = 0;j < 8;j++)	  
			  {
				   time_delay = 60;
			       while((IRED == 0) && time_delay)	 
			       {
					   	delay_10us(1);
						time_delay--;
						if(time_delay == 0)return;	 
				   }
					while(IRED)
					{
						delay_10us(10);
						ired_high_time++;
						if(ired_high_time > 20)return; 
					}
					ired_data_save[i] >>= 1;
					if(ired_high_time > 8)	  
					   ired_data_save[i] |= 0x80; 
					   ired_high_time = 0;	  
			  }
		  }
	 }
	if(	ired_data_save[2] != ~ired_data_save[3])	
	{
	  for(i = 0;i < 4;i++)
	  ired_data_save[i] = 0;   
	}
 }

}

//ired.h文件
#ifndef _ired_H
#define _ired_H
#include “public.h”
sbit IRED = P3^2;
extern u8 ired_data_save[4];
void ired_init(void);
#endif

// ds18b20.h文件
#include “ds18b20.h”
#include “intrins.h”

void ds18b20_reset(void)
{
DS18B20_PORT = 0;
delay_10us(75);
DS18B20_PORT = 1;
delay_10us(2);
}

u8 ds18b20_check(void)
{

u8 time_temp = 0;
while(DS18B20_PORT && time_temp < 20)	
{
    time_temp++;
	delay_10us(1);
}
if(time_temp >= 20)return 1; 
else time_temp = 0;	
while ((!DS18B20_PORT) && time_temp < 20)	
{
    time_temp++;
	delay_10us(1);
}
if(time_temp >= 20)return 1; 

return 0;

}
//写字节
void ds18b20_write_byte(u8 dat)
{

u8 i = 0;
u8 temp = 0;

for( i = 0;i < 8;i++)
{
temp = dat&0x01;
dat >>= 1;
if(temp)
{
DS18B20_PORT = 0;
nop(); nop();
DS18B20_PORT = 1;
delay_10us(6);
}
else
{
DS18B20_PORT = 0;
delay_10us(6);
DS18B20_PORT = 1;
nop(); nop();
}
}
}

//读取位
u8 ds18b20_read_bit(void)
{

 u8 dat = 0;
 DS18B20_PORT = 0;
 _nop_(); _nop_();
 DS18B20_PORT = 1;
 _nop_(); _nop_();
 if(DS18B20_PORT)dat = 1;
 else dat = 0;
 delay_10us(5);
 return dat;

}

/****************************************************************
读取字节
*******************************************************************/
u8 ds18b20_read_byte(void)
{
u8 i = 0;
u8 dat = 0;
u8 temp = 0;
for(i = 0 ;i < 8;i++)
{
temp = ds18b20_read_bit();
dat = (temp << 7)|(dat >> 1);
}
return dat;

}
/*******************************************************************************
开始温度转换
*******************************************************************************/
void ds18b20_start(void)
{
ds18b20_reset() ;
ds18b20_check() ;
ds18b20_write_byte(0xcc);//SKIP ROM
ds18b20_write_byte(0x44);//ת»»ÃüÁî

}
/*******************************************************************************
*ds18b20初始化
*******************************************************************************/
u8 ds18b20_init(void)
{
ds18b20_reset();
return ds18b20_check();
}

/*******************************************************************************

  • 读取温度
    *******************************************************************************/
    float ds18b20_read_temperture(void)
    {
    float temp;
    u8 datl = 0;
    u8 dath = 0;
    u16 value = 0;
    ds18b20_start();
    ds18b20_reset() ;
    ds18b20_check() ;
    ds18b20_write_byte(0xcc);
    ds18b20_write_byte(0xbe);

       datl = ds18b20_read_byte(); 
       dath = ds18b20_read_byte();
       value = (dath <<8) + datl;	
    
       if((value&0xf800) == 0xf800)
       {
      	 value = (~value) + 1;	
      	 temp = value*(-0.0625);
       }
       else
       {
      	 temp = value*0.0625;
       }
       return temp;
    

}

#include “smg.h”

u8 gsmg_code[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void smg_display(u8 dat[],u8 pos)
{
u8 i = 0;
u8 pos_temp = pos-1;

for( i = pos_temp; i < 8;i++)
{
	  switch(i)
	  {
	   case 0: LSC = 1;LSB = 1;LSA = 1;break;
	   case 1: LSC = 1;LSB = 1;LSA = 0;break;
	   case 2: LSC = 1;LSB = 0;LSA = 1;break;
	   case 3: LSC = 1;LSB = 0;LSA = 0;break;
	   case 4: LSC = 0;LSB = 1;LSA = 1;break;
	   case 5: LSC = 0;LSB = 1;LSA = 0;break;
	   case 6: LSC = 0;LSB = 0;LSA = 1;break;
	   case 7: LSC = 0;LSB = 0;LSA = 0;break;
	  }
	  SMG_A_DP_PORT = dat[i-pos_temp];
	  delay_10us(100);
	  SMG_A_DP_PORT = 0x00;

}

}

#ifndef _smg_H
#define _smg_H

#include “public.h”

#define SMG_A_DP_PORT P0
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

extern u8 gsmg_code[17];

void smg_display(u8 dat[],u8 pos);

#endif

#include “beep.h”

void beep_alarm(u16 time,u16 fre)
{
while (time–)
{
BEEP = !BEEP;
delay_10us(fre);
}

}

#ifndef _beep_H
#define _beep_H

#include “public.h”
sbit BEEP = P1^5;

void beep_alarm(u16 time,u16 fre);
#endif

#ifndef _public_H
#define _public_H
#include “reg52.h”

typedef unsigned int u16;
typedef unsigned char u8;
void delay_10us(u16 ten_us);

#endif

#include “public.h”
void delay_10us(u16 ten_us)
{
while(ten_us–);
}

个别模块的.h文件没有写,就是一些函数的声明

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以给出一个基本的方案: 1. 硬件设计 硬件部分需要有以下几个模块: - 51单片机 - DS18B20温度传感器 - 1602液晶显示屏 - 4个按键(分别为上、下、确认和返回) - 蜂鸣器(可选) 其中,DS18B20是常用的数字温度传感器,它可以直接通过单总线进行通讯。1602液晶显示屏可以用来显示温度值和一些提示信息,按键用于菜单的操作和参数的设置,蜂鸣器可以用于报警。 2. 软件设计 软件部分需要实现以下几个功能: - DS18B20温度传感器数据采集和转换为温度值 - 液晶屏显示温度值和菜单信息 - 按键操作和参数设置 - 温度报警功能 由于您并未提供具体的要求,因此我这里只提供一个基本的程序框架,您可以根据自己的需求进行修改和完善。 ```c #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit DQ = P3^7; //定义DS18B20数据引脚 uchar tempH, tempL; //存储温度值高八位和低八位 uchar alarmTemp = 30; //报警温度 uchar menuIndex = 0; //菜单选择项 uchar setTemp = 0; //设定温度 bit isTempSet = 0; //是否已经设置温度 bit isAlarmOn = 0; //是否报警 //延时函数,约1ms void delay(uint i) { while(i--); } //DS18B20复位 uchar ds18b20Reset() { uchar presence; DQ = 0; _nop_(); _nop_(); _nop_(); _nop_(); DQ = 1; _nop_(); _nop_(); presence = DQ; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); return presence; } //DS18B20写一个字节 void ds18b20WriteByte(uchar dat) { uchar i; for (i = 0; i < 8; i++) { DQ = 0; _nop_(); _nop_(); DQ = dat & 0x01; _nop_(); _nop_(); DQ = 1; _nop_(); _nop_(); dat >>= 1; } } //DS18B20读一个字节 uchar ds18b20ReadByte() { uchar i, dat = 0; for (i = 0; i < 8; i++) { dat >>= 1; DQ = 0; _nop_(); _nop_(); DQ = 1; _nop_(); _nop_(); if(DQ) dat |= 0x80; _nop_(); _nop_(); DQ = 0; } return dat; } //DS18B20转换温度 void ds18b20Convert() { ds18b20Reset(); ds18b20WriteByte(0xcc); ds18b20WriteByte(0x44); } //DS18B20读取温度 void ds18b20ReadTemp() { ds18b20Reset(); ds18b20WriteByte(0xcc); ds18b20WriteByte(0xbe); tempL = ds18b20ReadByte(); tempH = ds18b20ReadByte(); ds18b20Reset(); } //显示温度值 void showTemp() { uchar str[6]; sprintf(str, "%d.%dC", tempH, tempL); lcdWriteCom(0x80); //设置光标位置为第一行第一列 lcdWriteStr(str); } //显示菜单 void showMenu() { uchar str[16]; lcdWriteCom(0x80); //设置光标位置为第一行第一列 switch(menuIndex) { case 0: lcdWriteStr("1) Set alarm temp "); break; case 1: lcdWriteStr("2) Clear alarm "); break; case 2: lcdWriteStr("3) Exit menu "); break; } lcdWriteCom(0xc0); //设置光标位置为第二行第一列 sprintf(str, "Alarm: %d.%dC", alarmTemp, 0); lcdWriteStr(str); } //设置报警温度 void setAlarmTemp() { uchar key = getKey(); if(key == 1) //上键 { if(alarmTemp < 100) alarmTemp++; } else if(key == 2) //下键 { if(alarmTemp > -50) alarmTemp--; } else if(key == 3) //确认键 { isTempSet = 1; menuIndex++; } else if(key == 4) //返回键 { isTempSet = 0; menuIndex++; } } //清除报警 void clearAlarm() { uchar key = getKey(); if(key == 3) //确认键 { isAlarmOn = 0; menuIndex++; } else if(key == 4) //返回键 { menuIndex++; } } //获取按键值 uchar getKey() { uchar key = 0; delay(20); //去抖动 if(P2 != 0xf0) //有按键按下 { delay(1000); //延时等待按键稳定 if(P2 != 0xf0) //再次检测是否有按键按下 { switch(P2) { case 0xe0: //上键 key = 1; break; case 0xd0: //下键 key = 2; break; case 0xb0: //确认键 key = 3; break; case 0x70: //返回键 key = 4; break; } } } return key; } //温度报警 void tempAlarm() { if(isTempSet && tempH < alarmTemp) //温度低于设定值 { if(!isAlarmOn) //报警未开启 { isAlarmOn = 1; beep(); } } else { isAlarmOn = 0; } } //蜂鸣器响 void beep() { P1 |= 0x01; //蜂鸣器接在P1.0 delay(1000); P1 &= ~0x01; delay(1000); } //初始化LCD1602 void initLcd() { lcdWriteCom(0x38); //开显示 lcdWriteCom(0x0c); //光标不显示 lcdWriteCom(0x06); //光标移动 lcdWriteCom(0x01); //清屏 } //写命令到LCD1602 void lcdWriteCom(uchar com) { lcdEnable(); P0 = com; P2 &= ~0x01; //RS=0,写入命令 lcdDelay(); P2 &= ~0x04; //E=0,清除使能位 } //写数据到LCD1602 void lcdWriteData(uchar dat) { lcdEnable(); P0 = dat; P2 |= 0x01; //RS=1,写入数据 lcdDelay(); P2 &= ~0x04; //E=0,清除使能位 } //使能LCD1602 void lcdEnable() { P2 |= 0x04; //E=1,产生脉冲 lcdDelay(); P2 &= ~0x04; //E=0,清除使能位 } //LCD1602延时函数 void lcdDelay() { delay(500); } //主函数 void main() { initLcd(); //初始化LCD1602 while(1) { ds18b20Convert(); //DS18B20开始转换温度 delay(1000); //等待转换完成 ds18b20ReadTemp(); //读取温度值 showTemp(); //显示温度值 tempAlarm(); //温度报警 if(!isTempSet) //未设置温度 { showMenu(); //显示菜单 switch(menuIndex) { case 0: //设置报警温度 setAlarmTemp(); break; case 1: //清除报警 clearAlarm(); break; case 2: //退出菜单 menuIndex = 0; break; } } } } ``` 以上是一个简单的基于51单片机温度监控系统的方案,您可以根据自己的需求进行修改和完善。注意,该方案只提供了基本的硬件和软件设计思路,实际实现过程中需要根据具体情况进行调试和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值