日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

多路测温系统C51语言,51单片机多路DS18B20温度测量程序

發(fā)布時(shí)間:2023/12/14 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多路测温系统C51语言,51单片机多路DS18B20温度测量程序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

仿真圖:

仿真文件和完整源碼的下載地址:http://www.51hei.com/bbs/dpj-20600-1.html

源代碼:

#include#include#include #include #define uchar unsigned char

#define uint? unsigned int

sbit RS=? P2^0? ;???????//液晶顯示引腳定義

sbit RW=? P2^1? ;

sbit EN=? P2^2? ;

uint? t=0,dian=0;

uchar LCD_LINE_ONE[16]={"tp1:?????????? "};??//定義顯示屏幕

uchar LCD_LINE_TWO[16]={"tp2:?????????? "};

//uchar LCD_LINE_THR[16]={"??????????????? "};

int Tm;

int? fushu=0 ;

sbit DQ= P3^3;

static unsigned char get_serial[]={??? //獲取的八個(gè)DS18B20內(nèi)部RAM64位序列號(hào)

224, 0,0,0,? 184,? 197, 50, 40,

215, 0,0,0,? 184,? 197, 51, 40

//? 82, 0,0,0,? 184,? 197, 52, 40

// 101, 0,0,0,? 184,? 197,? 53,40,

//60, 0,0,0,? 184,? 197,? 54,40,

//11, 0,0,0,? 184,? 197,? 55,40,

//47, 0,0,0,? 184,? 197,? 56,40,

//185, 0,0,0,? 184,? 197,? 49,40,

};

void delay( ms )?????? //用于液晶顯示的延時(shí)函數(shù)

{

int i ;

while(ms--)

{

for(i=0 ;i<5 ;i++ )? ;

}

}

uchar Read_LCD_State()????? //讀取液晶顯示的狀態(tài)

{

uchar state;

RS=0;RW=1;EN=1;delay(1);

state=P0;

EN = 0;delay(1);

return state;

}

void LCD_Busy_Wait()???? //如果忙則等待函數(shù)

{

while((Read_LCD_State()&0x80)==0x80);

delay(5);

}

void Write_LCD_Zhilin(uchar zl)???? //液晶顯示寫指令函數(shù)

{

LCD_Busy_Wait();

RS=0;RW=0;

EN=0;

P0=zl;

EN=1;

delay(1);

EN=0;

}

void Write_LCD_shuju(uchar date)????? //液晶顯示寫數(shù)據(jù)函數(shù)

{

LCD_Busy_Wait();

RS=1;RW=0;

EN=0;

P0=date;

EN=1;

delay(1);

EN=0;

}

void LCD_INIT()????//液晶顯示初始化

{

Write_LCD_Zhilin(0x38);?? // 顯示模式設(shè)置

delay(1);

Write_LCD_Zhilin(0x01);?? // 顯示清屏

delay(1);

Write_LCD_Zhilin(0x06);?? // 光標(biāo)移動(dòng)設(shè)置

delay(1);

Write_LCD_Zhilin(0x0c);?? // 開及光標(biāo)設(shè)置

delay(1);

}

void Display_LCD_String(uchar p,uchar *s)??? //液晶顯示寫入函數(shù)

{

uchar i;

Write_LCD_Zhilin(p|0x80)?;??? //寫地址高位為一

//Write_LCD_Zhilin(0x40|0x80)?;

for(i=0;i<16;i++)

{

Write_LCD_shuju(s[i]);

delay(1);

}

}[page]

/***************************************************************************************/

void delays(int us)??????? //用于DS18B20的延時(shí)函數(shù)

{ int s;

for ( s=0; s

}

void rst(void)??????//DS18B20初始化

{

DQ = 1;

delays(2);

DQ = 0;

delays(30); //精確延時(shí) 480~960us

DQ = 1;

delays(8);

}

void write(unsigned char ku)??//DS18B20寫函數(shù)

{

int i=0;

for (i=0;i<8;i++)

{

DQ=0;

DQ =ku&0x01;

delays(3);

DQ=1;

ku>>=1;

}

}

void match_rom(unsigned char *rom)?? //DS18B20匹配ROM函數(shù)

{

unsigned char i;

rst();???????? //初始化

write(0x55);?????? //匹配ROM

for(i=8;i>0;i--)

{

write(*(rom+i-1));

}

}

unsigned int read(void)???? //DS18B20讀函數(shù),每次讀16位

{

int i=0;

unsigned int u=0;

for (i=0;i<16;i++)

{

DQ=0;

u>>=1;

DQ=1;

if(DQ) u|=0x8000;

delays(4);

}

return (u);

}

int? read0(unsigned char *seria)?//讀取對(duì)應(yīng)溫度值并轉(zhuǎn)換函數(shù)

{

int temperature ;

unsigned int tp;

unsigned int lsb;

rst();????? //初始化

write(0xCC);??? //跳過RAM

write(0x44);??? //溫度轉(zhuǎn)換

rst();????? //再次初始化

write(0xCC);

match_rom(seria);??? //匹配ROM函數(shù)調(diào)用

write(0xBE);? //讀取存儲(chǔ)器指令

tp=read();??? //讀取溫度值

if((tp&0xf800)==0xf800)??//判斷正負(fù)數(shù)

{

fushu=1 ;

tp=~tp+1 ;

lsb=(unsigned int)(tp*6.25);

dian=lsb%100;??? //取小數(shù)部分

temperature=lsb/100;

}

else

{

fushu=0;

lsb=(unsigned int)(tp*6.25);

dian=lsb%100;

temperature=lsb/100;

}

return(temperature);

}

/*****************************************************************************************/

void main()

{

uint i ;

LCD_INIT();

EA=0 ;?? //使用DS18B20禁止任何中斷

while(1)

{

for(i=0;i<2;i++)

{

Tm=read0(get_serial+i*8);

if(i==0)?????? //判斷是第幾個(gè)的數(shù)據(jù)

{

if(fushu==0)??????? //判斷是否加負(fù)號(hào)

sprintf(LCD_LINE_ONE+5," %d", Tm);

if(fushu==1)

sprintf(LCD_LINE_ONE+5,"-%d", Tm);

sprintf(LCD_LINE_ONE+10,".%d",dian);??//加入小數(shù)部分

Display_LCD_String(0x00,LCD_LINE_ONE);

}

if(i==1)

{

if(fushu==0)

sprintf(LCD_LINE_TWO+5," %d", Tm);

if(fushu==1)

sprintf(LCD_LINE_TWO+5,"-%d", Tm);

sprintf(LCD_LINE_TWO+10,".%d",dian);

Display_LCD_String(0x40,LCD_LINE_TWO);

}

}

}

}

總結(jié)

以上是生活随笔為你收集整理的多路测温系统C51语言,51单片机多路DS18B20温度测量程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。