#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文件没有写,就是一些函数的声明