一开始的测温仪只精确到个位数,现在修改代码使得温度精确到小数点后一位,并且增加矫正按钮。代码如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data = P1 ^ 6;
uchar rec_dat[9];
sbit lcdrs = P2 ^ 0;
sbit lcdrw = P2 ^ 1;
sbit lcden = P2 ^ 2;
sbit addr=P2^4;
sbit reducer=P2^5;
sbit addt=P2^6;
sbit reducet=P2^7;
int ET = 0, ER = 0;
uchar R_H, R_L, T_H, T_L, RH, RL, TH, TL;
void delay(uint n)
{
uint x, y;
for (x = n; x > 0; x--)
for (y = 110; y > 0; y--)
;
}
void write_com(uchar com)
{
lcdrs = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void write_dat(uchar dat)
{
lcdrs = 1;
P0 = dat;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void init_lcd()
{
lcden = 0;
lcdrw = 0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void DHT11_delay_us(uchar n)
{
while (--n)
;
}
void DHT11_delay_ms(uint z)
{
uint i, j;
for (i = z; i > 0; i--)
for (j = 110; j > 0; j--)
;
}
void DHT11_start()
{
Data = 1;
DHT11_delay_us(2);
Data = 0;
DHT11_delay_ms(30);
Data = 1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte()
{
uchar i, dat = 0;
for (i = 0; i < 8; i++)
{
while (!Data)
;
DHT11_delay_us(8);
dat <<= 1;
if (Data == 1)
dat += 1;
while (Data)
;
}
return dat;
}
void DHT11_receive()
{
uchar revise;
DHT11_start();
if (Data == 0)
{
while (Data == 0)
;
DHT11_delay_us(40);
R_H = DHT11_rec_byte();
R_L = DHT11_rec_byte();
T_H = DHT11_rec_byte();
T_L = DHT11_rec_byte();
revise = DHT11_rec_byte();
DHT11_delay_us(25);
if ((R_H + R_L + T_H + T_L) == revise)
{
RH = R_H;
RL = R_L;
TH = T_H;
TL = T_L;
}
rec_dat[0]='0'+((RH+ER)/10);
rec_dat[1]='0'+((RH+ER)%10);
rec_dat[2]='.';
rec_dat[3]='0'+(RL/10);
rec_dat[4]='%';
rec_dat[5]=' ';
rec_dat[6]='0'+((TH+ET)/10);
rec_dat[7]='0'+((TH+ET)%10);
rec_dat[8]='.';
rec_dat[9]='0'+(TL/10);
}
}
void main()
{
uchar i;
init_lcd();
while (1)
{
if (addr == 0)
{
delay(30);
ER += 1;
}
if (reducer == 0)
{
delay(30);
ER -= 1;
}
if (addt == 0)
{
delay(30);
ET += 1;
}
if (reducet == 0)
{
delay(30);
ET -= 1;
}
DHT11_delay_ms(100);
DHT11_receive();
write_com(0x80);
for(i=0;i<=9;i++)
write_dat(rec_dat[i]);
write_dat(0xdf);
write_dat('C');
}
}
运行结果如图: