基于单片机的温度湿度采集系统
程序
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#include <intrins.h>
typedef bit BOOL ;
sbit io = P1^1 ;
sbit bee=P1^0;
sbit rs = P2^5 ;
sbit rw = P2^6 ;
sbit ep = P2^7 ;
bit flag_300ms ;
sbit K1=P1^2;
sbit K2=P1^3;
sbit K3=P1^4;
uchar yemian=0;
uchar flat=1;
uchar data_byte;
uchar RH,RL,TH,TL;
uchar WenDu,ShiDu;
#include "eeprom52.h"
void delay(uchar ms)
{
uchar i ;
while(ms--)
{
for(i = 0 ; i<250;i++) ;
}
}
void delay1()
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void longdelay(uchar s)
{
while(s--)
{
delay(20) ;
}
}
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, WenDu);
byte_write(0x2001, ShiDu);
byte_write(0x2060, a_a);
}
void read_eeprom()
{
WenDu = byte_read(0x2000);
ShiDu = byte_read(0x2001);
a_a = byte_read(0x2060);
}
void init_eeprom()
{
read_eeprom();
if(a_a != 2)
{
WenDu = 30;
ShiDu = 80;
a_a = 2;
write_eeprom();
}
}
void warn()
{
if(TH>=WenDu)
{
bee=0;
}
if(RH>=ShiDu)
{
bee=0;
}
if( TH<WenDu && RH<ShiDu )
{
bee=1;
}
}
BOOL lcd_bz()
{
BOOL result ;
rs = 0 ;
rw = 1 ;
ep = 1 ;
result = (BOOL)(P0 & 0x80) ;
ep = 0 ;
return result ;
}
void write_cmd(uchar cmd)
{
while(lcd_bz()) ;
rs = 0 ;
rw = 0 ;
ep = 0 ;
P0 = cmd ;
ep = 1 ;
ep = 0 ;
}
void write_addr(uchar addr)
{
write_cmd(addr|0x80) ;
}
void write_byte(uchar dat)
{
while(lcd_bz()) ;
rs = 1 ;
rw = 0 ;
ep = 0 ;
P0 = dat ;
ep = 1 ;
ep = 0 ;
}
void lcd_init()
{
write_cmd(0x38) ;
delay(1);
write_cmd(0x08) ;
delay(1);
write_cmd(0x01) ;
delay(1);
write_cmd(0x06) ;
delay(1);
write_cmd(0x0c) ;
delay(1);
}
void display(uchar addr, uchar q)
{
delay(1) ;
write_addr(addr) ;
write_byte(q) ;
delay(1) ;
}
void start()
{
io=1;
delay1();
io=0;
delay(20);
io=1;
delay1();
delay1();
delay1();
delay1();
delay1();
}
uchar receive_byte()
{
uchar i,temp,count;
for(i=0;i<8;i++)
{
temp=0;
delay1();delay1();delay1();delay1();
if(io==1)temp=1;
count=2;
while((io)&&count++);
if(count==1)break;
data_byte<<=1;
data_byte|=temp;
}
return data_byte;
}
void receive()
{
uchar T_H,T_L,R_H,R_L,check,num_check;
uchar count;
start();
io=1;
if(!io)
{
while((io)&&count++);
R_H=receive_byte();
R_L=receive_byte();
T_H=receive_byte();
T_L=receive_byte();
check=receive_byte();
io=0;
delay1();delay1();delay1();delay1();delay1();
io=1;
num_check=R_H+R_L+T_H+T_L;
if(num_check=check)
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
check=num_check;
}
}
}
void showw()
{
lcd_init();
delay(10);
display(0x05,'W');
display(0x06,'e');
display(0x07,'l');
display(0x08,'c');
display(0x09,'o');
display(0x0a,'m');
display(0x0b,'e');
delay(250);
delay(250);
delay(250);
}
void time_init()
{
EA = 1;
TMOD = 0X01;
ET0 = 1;
TR0 = 1;
}
void key()
{
if(!K1)
{
delay(20);
if(!K1)
{
while(!K1)
;
yemian++;
flat++;
if(yemian>=3) { yemian=0; }
}
}
}
shezhi()
{
if(!K2)
{
delay(50);
if(!K2)
{
;
if(yemian==1)
{
WenDu+=1;
if(WenDu>99) { WenDu=99; }
}
if(yemian==2)
{
ShiDu+=1;
if(ShiDu>99) { ShiDu=99; }
}
write_eeprom();
}
}
if(!K3)
{
delay(50);
if(!K3)
{
;
if(yemian==1)
{
WenDu-=1;
if(WenDu<1) {WenDu=1; }
}
if(yemian==2)
{
ShiDu-=1;
if(ShiDu<1) { ShiDu=1; }
}
write_eeprom();
}
}
}
void main()
{
init_eeprom();
time_init();
showw();
while(1)
{
key();
if(yemian==0)
{
if(flat==1)
{
flat=0;
lcd_init();
display(0x00,'T') ;
display(0x01,'e');
display(0x02,'m');
display(0x03,'p');
display(0x04,':');
display(0x08,0xdf);
display(0x09,'C');
display(0x40,'H') ;
display(0x41,'u');
display(0x42,'m');
display(0x43,'i');
display(0x44,':');
display(0x47,'%');
display(0x48,'R');
display(0x49,'H');
display(0x0c,'T');
display(0x0d,':');
display(0x0e,WenDu/10+0x30);
display(0x0f,WenDu%10+0x30);
display(0x4c,'H');
display(0x4d,':');
display(0x4e,ShiDu/10+0x30);
display(0x4f,ShiDu%10+0x30);
}
if(flag_300ms == 1)
{
flag_300ms = 0;
receive();
display(0x05,TH/10+0x30);
display(0x06,TH%10+0x30);
display(0x45,RH/10+0x30);
display(0x46,RH%10+0x30);
warn();
}
}
if(yemian==1)
{
if(flat==1)
{
flat=0;
bee=1;
lcd_init();
display(0x06,'T');
display(0x07,'e');
display(0x08,'m');
display(0x09,'p');
}
shezhi();
display(0x47,WenDu/10+0x30);
display(0x48,WenDu%10+0x30);
}
if(yemian==2)
{
if(flat==1)
{
flat=0;
bee=1;
lcd_init();
display(0x06,'H');
display(0x07,'u');
display(0x08,'m');
display(0x09,'i');
}
shezhi();
display(0x47,ShiDu/10+0x30);
display(0x48,ShiDu%10+0x30);
}
}
}
void time0_int() interrupt 1
{
static uchar value;
TH0 = 0x3c;
TL0 = 0xb0;
if(value % 6 == 0)
{
flag_300ms = 1;
value = 0;
}
}
头文件
#ifndef _EEPROM52_H_
#define _EEPROM52_H_
uchar a_a;
#define RdCommand 0x01
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01
sfr ISP_DATA=0xe2;
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
void ISP_IAP_enable(void)
{
EA = 0;
ISP_CONTR = ISP_CONTR & 0x18;
ISP_CONTR = ISP_CONTR | WaitTime;
}
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f;
ISP_TRIG = 0x00;
EA = 1;
}
void ISPgoon(void)
{
ISP_IAP_enable();
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
}
unsigned char byte_read(unsigned int byte_addr)
{
EA = 0;
ISP_ADDRH = (unsigned char)(byte_addr >> 8);
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8;
ISP_CMD = ISP_CMD | RdCommand;
ISPgoon();
ISP_IAP_disable();
EA = 1;
return (ISP_DATA);
}
void SectorErase(unsigned int sector_addr)
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00);
ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8;
ISP_CMD = ISP_CMD | EraseCommand;
ISPgoon();
ISP_IAP_disable();
}
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
EA = 0;
ISP_ADDRH = (unsigned char)(byte_addr >> 8);
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8;
ISP_CMD = ISP_CMD | PrgCommand;
ISP_DATA = original_data;
ISPgoon();
ISP_IAP_disable();
EA =1;
}
#endif
原理图
