?? 18b20.c
字號:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LCD_EN=P3^4;
sbit LCD_RS=P3^5;
bit flag;
sbit DQ=P2^2;
uchar tab[]={" wendu "};
void delayms(uint z)
{
uint x,y;
for(x=0;x<=110;x++)
for(y=0;y<=z;y++);
}
delayus(uint z)
{while(z--){}}
/***************溫度18B20***********************************/
//功能:讀18B20讀一個字節
uchar b20_read_byte(void)
{
uchar i=0;
uchar dat = 0;
for(i=8;i>0;i--)
{ DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delayus(4);
}
return(dat);
}
//功能:寫18B20一個字節
void b20_write_byte(uchar dat)
{ uchar i=0;
for(i=8; i>0; i--)
{ DQ = 0;
DQ = dat&0x01;
delayus(4);
DQ = 1;
dat>>=1;
}
}
//功能:初始化18B20
void b20_init(void)
{ uchar x=0;
DQ = 1; //DQ復位
delayus(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delayus(80); //精確延時 大于 480us
DQ = 1; //拉高總線
delayus(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delayus(20);
}
//功能:讀取18B20的溫度值
uint b20_read(void)
{
uchar a=0;
uchar b=0;
uint t=0;
uint t1=0;
float tt=0;
b20_init();
b20_write_byte(0xcc); // 跳過讀序號列號的操作
b20_write_byte(0x44); // 啟動溫度轉換
b20_init();
b20_write_byte(0xcc); //跳過讀序號列號的操作
b20_write_byte(0xbe); //讀取溫度寄存器
a=b20_read_byte(); //讀低8位
b=b20_read_byte(); //讀高8位
t=b;
if((t&0xf8)==0xf8)
{
flag=1;
b=~b;
a=~a+1;
}
else
flag=0;
b=(b&0x07)<<4;
a=(a&0xf0)>>4;
b=b|a;
return(b);
}
/***************液晶1062**************************************/
void LCD_write_com(uchar com)
{
P0=com; //寫入命令
LCD_RS=0;
delayms(5);
LCD_EN=1;
delayms(5);
LCD_EN=0;
}
void LCD_write_data(uchar date)
{
P0=date; //寫入數據
LCD_RS=1;
delayms(5);
LCD_EN=1;
delayms(5);
LCD_EN=0;
}
void LCD_init()
{
uchar i;
LCD_write_com(0x38);//顯示16*2接口
LCD_write_com(0x01);//清屏
LCD_write_com(0x0c);//00001DCB,D開顯示C顯示光標B光標閃爍
LCD_write_com(0x06);//000001NS,N1指針、光標加一,N0指針、光標減一。S1整屏左移N1/右移N0,S0整屏不移動
LCD_write_com(0x80);
for(i=0;i<16;i++)
{
LCD_write_data(tab[i]);
delayms(5);
}
}
void LCD_sfm(uchar date)
{
uchar shi,ge,i=4;
shi=date/10;
ge=date%10;
LCD_write_com(0x80+12);
if(flag==1)
LCD_write_data(0x20+13);
else
LCD_write_data(0x20+11);
LCD_write_data(0x30+shi);
LCD_write_data(0x30+ge);
}
/********************主函數********************************************************/
main()
{
uint a;
b20_init();
LCD_init();
while(1)
{
a=b20_read();
LCD_sfm(a);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -