📄 18b20.c
字号:
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^2;
sbit rs = P2^0;
sbit rw = P2^1;
sbit en = P2^2;
sbit psb = P2^3;
sbit ret = P2^5;
uchar command,data1,data2;
uchar com0;
uchar lcd_buf1,lcd_buf2;
uchar yy1,yy2,yy3,yy4,yy5;
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,//0--9
0x3a,0x2e,0x60,0x43,0x21};
//: //. // //C //!
void lcd_int(); //液晶初始化
void lcd_set(); //液晶复位
void display(); //显示程序
void write_command(uchar command); //写指令
void write_data(uchar data0); //写数据
void clear_lcd();
void dsiplay1();
//延时子程序
void delay(uint k)
{
while(k--);
}
//
//18b20复位
void b20_reset(void)
{
uchar presence=0;
DQ=1;
delay(8);
DQ = 0; //拉低总线
delay(100); // 保持 480us
DQ = 1; // 释放总线
delay(14); // 等待回复
presence = DQ; // 读取信号
delay(20); // 等待结束信号
}
//从 1-wire 总线上读取一个字节
uchar read_byte(void)
{
uchar i;
uchar value=0;
for (i=8;i>0;i--)
{
DQ = 0;
value>>=1;
DQ = 1;
if(DQ)
value|=0x80;
delay(4);
}
return(value);
}
//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
uchar i;
for (i=8; i>0; i--) // 一次写一位
{
DQ = 0; //
DQ = val&0x01;
delay(5); //
DQ = 1;
val=val>>1;
}
delay(4);
}
//读取和显示温度
void Read_Temperature(void)
{
float z,m;
uint h,tt,j;
uint c[2];
b20_reset(); //18b20复位
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 转换温度
b20_reset(); //18b20再次复位
write_byte(0xCC); //Skip ROM
write_byte(0xbe); // 读取寄存器
c[1]=read_byte();//读出温度低8位
c[0]=read_byte();//读出温度高8位
j=c[0];
j<<=8;
j=j|c[1];
z=j*0.0625; //温度之和
h=z; //得高位温度值
yy1=h/10;//显示温度十位数
yy2=h%10;//显示温度个位数
yy3=11;//小数点
m=z-h; //得小数部分
m=m*100; //乘以100的并没有得到整数
tt=m; //再次取整
yy4=tt/10; //显示温度十分位
yy5=tt%10; //显示百分位
}
// 液晶复位
void lcd_int(void)
{
ret=0;
delay(1200); //
ret=1;
_nop_();
psb=1;
_nop_();
}
//液晶初始化
void lcd_set(void)
{
command=0x34; //扩充指令
write_command(command);
command=0x30; //基本指令
write_command(command);
command=0x01; //清屏
write_command(command);
command=0x06; //DDRM的地址计数器(AC)加一
write_command(command);
command=0x0c; //光标反白,显示打开
write_command(command);
}
/// 写指令
void write_command(uchar command)
{
delay(10000);
rs=0;
rw=0;
P0=command;
en=1;
_nop_();
_nop_();
en=0;
}
//写数据
void write_data(uchar dat)
{
delay(10000);
rs=1;
rw=0;
P0=dat;
en=1;
_nop_();
_nop_();
en=0;
}
//显示
void display(void)
{
write_command(0x92);
write_data(table[yy1]); // 后送高位 显示温度的十位
write_data(table[yy2]); // 先送低位 显示温度的个位
write_data(table[yy3]); // 显示小数点
write_data(table[yy4]); // 显示温度的十分位
write_data(table[yy5]); // 显示温度的百分位
write_data(table[12]); // 显示 °
write_data(table[13]); // 显示C
write_data(table[14]); // 显示!
}
void display1()
{
write_command(0x82);
write_data(0xBD); //今
write_data(0xF1);
write_data(0xCC); //天
write_data(0xEC);
write_data(0xC6); //气
write_data(0xF8);
write_data(0xCE); //温
write_data(0xC2);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: main
// 函数功能: 主函数
//--------------------------------------------------------------------------------------------------
void main(void)
{
lcd_int();
lcd_set();
while(1)
{
Read_Temperature();
display1();
display();
}
}
/*******************清屏程序*********************/
/*
void clear_lcd(void)
{
write_command(0x01);
write_command(0x34);
write_command(0x30);
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -