📄 ds18b20.c
字号:
#include <reg52.h>
#include <intrins.h>
#define jmp_rom 0xcc
#define tmp_start 0x44
#define tmp_ram_read 0xbe
#define nop _nop_()
#define BUSY 0x80
#define WRITE_DATA 0xff
#define delay_data 0xff
#define COMMAND 0x00
#define LCD_CLEAR 0x01
#define portdata P0
#define secondline 0xc0
unsigned char data ds18b20_read_data[9];
unsigned char data table[32] = "temperature 00.0designed by hwb ";
sbit data_pin = P3^7;
sbit RS = P2^7;
sbit RW = P2^6;
sbit E = P2^5;
sbit LED = P2 ^ 3;
bit zheng_fu_hao;
unsigned char lcd_busy(void)
{
unsigned char temp;
portdata = 0xff;
RS = 0;
RW = 1;
E = 1;
temp = portdata;
E = 0;
return (temp);
}
void lcd_command_writedata(unsigned char check,unsigned char dispdata)
{
if (check == COMMAND)
{
RS = 0;
}
else
{
RS = 1;
}
RW = 0;
portdata = dispdata;
E = 1;
E = 0;
while (lcd_busy() & BUSY);
}
void lcd_disp(unsigned char disp_data)
{
static unsigned char flag = 0;
if (!flag || disp_data == 255)
{
lcd_command_writedata(COMMAND,LCD_CLEAR);
flag = 0;
if (disp_data == 255)
{
return;
}
}
if (flag == 16)
{
lcd_command_writedata(COMMAND,secondline);
}
lcd_command_writedata(WRITE_DATA,disp_data);
while (lcd_busy() & BUSY);
flag++;
if (flag >= 32) flag = 0;
}
void lcd_init(void)
{
lcd_command_writedata(COMMAND,LCD_CLEAR);
lcd_command_writedata(COMMAND,0x38);
lcd_command_writedata(COMMAND,0x0e);
lcd_command_writedata(COMMAND,0x06);
}
void ds18b20_delay(unsigned char delay_time) /*计数一次6us,再加上函数调用和返回所花费的14us时间*/
{
while (delay_time--);
}
void delay_ms(unsigned int ms_delay_time) /*计数一次大约1ms*/
{
unsigned char i;
while (ms_delay_time--)
{
for (i = 0; i < 120; i ++)
{
}
}
}
bit ds18b20_rst(void)
{
bit ack = 1;
unsigned char loop_time = 10;
while ((loop_time --) && ack)
{
ds18b20_delay(10);
data_pin = 1;
nop;
nop;
data_pin = 0;
ds18b20_delay(100);
data_pin = 1;
ds18b20_delay(10);
ack = data_pin;
ds18b20_delay(70);
}
return (ack);
}
bit ds18b20_read_bit(void)
{
bit read_bit;
data_pin = 0;
nop;
nop;
data_pin = 1;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
read_bit = data_pin;
ds18b20_delay(7);
return (read_bit);
}
unsigned char ds18b20_read_byte(void)
{
unsigned char i;
unsigned char read_temp = 0;
for (i = 8; i > 0; i --)
{
if(ds18b20_read_bit())
{
read_temp = read_temp >> 1;
read_temp = read_temp | 0x80;
}
else
{
read_temp = read_temp >> 1;
}
}
return (read_temp);
}
void ds18b20_write_bit(bit write_data)
{
if (write_data)
{
data_pin = 0;
nop;
nop;
data_pin = 1;
ds18b20_delay(10);
}
else
{
data_pin = 0;
ds18b20_delay(10);
}
data_pin = 1;
nop;
nop;
}
void ds18b20_write_byte(unsigned char send_data)
{
unsigned char i;
for (i = 0; i < 8; i ++)
{
ds18b20_write_bit((bit)((send_data >> i) & 0x01));
}
}
unsigned int ds18b20_read_temperature(void)
{
unsigned char i;
unsigned int temperature;
zheng_fu_hao = 0;
if (!ds18b20_rst())
{
ds18b20_write_byte(jmp_rom);
ds18b20_write_byte(tmp_start);
}
delay_ms(1);
if (!ds18b20_rst())
{
ds18b20_write_byte(jmp_rom);
ds18b20_write_byte(tmp_ram_read);
for (i = 0; i < 9; i ++)
{
ds18b20_read_data[i] = ds18b20_read_byte();
}
}
temperature = (ds18b20_read_data[1] << 8) + ds18b20_read_data[0];
if ((ds18b20_read_data[1] & 0xf8) == 0xf8)
{
temperature = ~ temperature + 1;
zheng_fu_hao = 1;
}
return (temperature);
}
void tmp_disp(void)
{
unsigned long temperature_temp;
unsigned int tem_get;
unsigned char a,b,c,d;
unsigned char i;
tem_get = ds18b20_read_temperature();
temperature_temp =(unsigned long)((float)(tem_get)*(float)(0.0625)); /*温度计算*/
lcd_command_writedata(COMMAND,LCD_CLEAR);
/*if (!zheng_fu_hao) 判断温度正负值,判是否要显示负号
{
table[11] = 0xfe;
}
else
{
lcd_disp(0x83,0x2d);
} */
a = temperature_temp / 100; /*温度百位显示,为0时不显示*/
if (a != 0x00)
{
table[11] = a + 0x30;
}
else table[11] = 0xfe;
b = temperature_temp / 10 % 10; /*温度十位显示,当百位和十位同时为0时不显示*/
if (b != 0x00)
{
table[12] = b + 0x30;
}
else table[12] = 0xfe;
c = temperature_temp % 100 % 10;/*温度个位显示,无论其值为何值必须显示*/
table[13] = c + 0x30;
d = temperature_temp - a * 100 - b * 10 - c;
table[15] = d + 0x30;
for (i = 0 ; i < 32; i ++)
{
lcd_disp(table[i]);
}
delay_ms(100);
ds18b20_read_data[1] = 0;
ds18b20_read_data[0] = 0;
table[12] = 0x30;
table[13] = 0x30;
table[15] = 0x30;
}
void system_init(void)
{
EA = 0;
TH0 = 0x00;
TL0 = 0x00;
TMOD = 0x01;
TF0 = 0;
TR0 = 0;
ET0 = 1;
EA = 1;
}
void main(void)
{
delay_ms(10);
lcd_init();
system_init();
LED = 0;
TR0 = 1;
while (1)
{
PCON = 0x01;
}
}
void timer_interrupt(void) interrupt 1
{
TH0 = 0x00;
TL0 = 0x00;
tmp_disp();
TR0 = 0;
TR0 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -