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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ds18b20c语言显示小数位,DS18B20多点测温(读序列,匹配序列,51单片机C程序,1602显示)...

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ds18b20c语言显示小数位,DS18B20多点测温(读序列,匹配序列,51单片机C程序,1602显示)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

DS18B20多點測溫(讀序列,匹配序列,51 C程序,1602顯示)

程序一:單個讀序列號。程序二,匹配并且讀兩個DS18B20,當然,讀多個與讀兩個基本原理一樣,只要加上其序列號等即可。本程序所有顯示都是用LCD1602顯示。

程序一:度序列號,并用1602顯示,1602從左到右分別是低到高位。

#include

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P3^7;//ds18b20與單片機連接口

sbit RS=P2^4;

sbit RW=P2^5;

sbit EN=P2^6;

uchar fCode[8];//序列號

/*************************lcd1602程序**************************/

void delay1ms(unsigned int ms)//延時1毫秒(不夠精確的)

{unsigned int i,j;

for(i=0;i

for(j=0;j<100;j++);

}

void wr_com(unsigned char com)??//寫指令

{ delay1ms(1);

RS=0;

RW=0;

EN=0;

P0=com;

delay1ms(1);

EN=1;

delay1ms(1);

EN=0;

}

void wr_dat(unsigned char dat)??//寫數據

{ delay1ms(1);;

RS=1;

RW=0;

EN=0;

P0=dat;

delay1ms(1);

EN=1;

delay1ms(1);

EN=0;

}

void lcd_init()//初始化設置//

{delay1ms(15);

wr_com(0x38);delay1ms(5);

wr_com(0x08);delay1ms(5);

wr_com(0x01);delay1ms(5);

wr_com(0x06);delay1ms(5);

wr_com(0x0c);delay1ms(5);

}

/******************************ds1820 *********************/

void delay_18B20(unsigned int i)//延時1微秒

{

while(i--);

}

void ds1820rst() //ds1820復位

{ uchar x=0;

DQ = 1;? ?? ?? ? //DQ復位,總線拉高

delay_18B20(4); //延時

DQ = 0;? ?? ?? ? //DQ拉低

delay_18B20(100); //精確延時大于480us

DQ = 1;? ?? ?? ? //拉高

delay_18B20(40);

}

uchar ds1820rd()??//讀數據

{ uchar i=0;

uchar dat = 0;

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

{? ?DQ = 0; //給脈沖信號

dat>>=1;

DQ = 1; //給脈沖信號

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

void ds1820wr(uchar wdata)//寫數據

{uchar i=0;

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

{ DQ = 0;

DQ = wdata&0x01;

delay_18B20(10);

DQ = 1;

wdata>>=1;

}

}

void DispCode()//把序列號顯示出來

{

unsigned char i,temp;

ds1820rst();

ds1820wr(0x33);//讀序列號

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

{

fCode[ i]=ds1820rd();//64位

}

wr_com(0x80+0x40);

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

{

temp = fCode[ i]>>4; //顯示高四位

if (temp<10)

wr_dat(temp + 0x30);//轉化為0~9的字符顯示

else

wr_dat(temp + 0x37);//將值轉化為大寫字母顯示

temp = fCode[ i]&0x0f;//顯示低四位

if (temp<10)

wr_dat(temp+ 0x30);

else

wr_dat(temp + 0x37);

}

}

/********************主程序***********************************/

void main()

{

init_init();//初始化顯示

DispCode();? ?? ?? ? //系列號顯示

delay1ms(1000);

while(1);

}

程序二:匹配序列號,并讀溫度。

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit RS=P2^4;

sbit RW=P2^5;

sbit EN=P2^6;

sbit DQ=P3^7;

uchar code str1[]={0x28,0x08,0xA7,0xBA,0x02,0x00,0x00,0x18};? ?? ???//ROM 1

uchar code str2[]={0x28,0x0C,0xBA,0xBA,0x02,0x00,0x00,0x54};? ?? ???//ROM2

uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};? ?? ???// 攝氏溫度符號

uchar data disdata[5];

uint tvalue;//溫度值

uchar tflag;//溫度正負標志

/*************************lcd1602程序**************************/

void delay1ms(uint ms)//延時1毫秒(不夠精確的)

{??uint i,j;

for(i=0;i

for(j=0;j<100;j++);

}

void wr_com(uchar com)??//寫指令

{ delay1ms(1);

RS=0;

RW=0;

EN=0;

P0=com;

delay1ms(1);

EN=1;

delay1ms(1);

EN=0;

}

void wr_dat(uchar dat)//寫數據//

{ delay1ms(1);;

RS=1;

RW=0;

EN=0;

P0=dat;

delay1ms(1);

EN=1;

delay1ms(1);

EN=0;

}

void wr_new()? ?? ?? ?? ?? ?? ? //寫新字符

{

uchar i;

wr_com(0x40);

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

{

wr_dat(table[ i]);

}

}

void lcd_init()//初始化設置//

{? ?? ???delay1ms(15);

wr_com(0x38);delay1ms(5);

wr_com(0x08);delay1ms(5);

wr_com(0x01);delay1ms(5);

wr_com(0x06);delay1ms(5);

wr_com(0x0c);delay1ms(5);

wr_new();

wr_com(0x80);

wr_dat('A');

wr_com(0x81);

wr_dat(':');

wr_com(0x89);

wr_dat(0x00);

wr_com(0x8a);

wr_dat('C');

wr_com(0xc9);

wr_dat(0x00);? ?? ?? ?? ?? ?? ?? ?? ?//攝氏溫度字符

wr_com(0xca);

wr_dat('C');

wr_com(0xc0);

wr_dat('B');

wr_com(0xc1);

wr_dat(':');

}

/******************************ds1820程序***************************************/

void delay_18B20(uint i)//延時1微秒

{

while(i--);

}

void ds1820rst()/*ds1820復位*/

{? ?uchar x=0;

DQ = 1;? ?? ?? ? //DQ復位

delay_18B20(4); //延時

DQ = 0;? ?? ?? ? //DQ拉低

delay_18B20(100); //精確延時大于480us

DQ = 1;? ?? ?? ? //拉高

delay_18B20(40);

}

uchar ds1820rd()/*讀數據*/

{ uchar i=0;

uchar dat = 0;

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

{? ?DQ = 0; //給脈沖信號

dat>>=1;

DQ = 1; //給脈沖信號

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

void ds1820wr(uchar dat)/*寫數據*/

{? ?? ?? ?uchar i=0;

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

{ DQ = 0;

DQ = dat&0x01;

delay_18B20(10);

DQ = 1;

dat>>=1;

}

}

void b20_Matchrom(uchar a)? ?? ?? ?//匹配ROM

{

char j;

ds1820wr(0x55);? ?? ?? ???//發送匹配ROM命令

if(a==1)

{

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

ds1820wr(str1[j]);? ?? ?? ?? ?? ? //發送18B20的序列號,先發送低字節

}

if(a==2)

{

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

ds1820wr(str2[j]);? ?? ?? ?? ?? ? //發送18B20的序列號,先發送低字節

}

}

read_temp(uchar z)/*讀取溫度值并轉換*/

{? ?? ???uchar a,b;

float tt;

ds1820rst();

ds1820wr(0xcc);? ?? ?? ?? ?? ?? ?? ?? ?//讀序列號

ds1820rst();

if(z==1)

{

b20_Matchrom(1);? ?? ?? ?? ?? ???//匹配ROM 1

}

if(z==2)

{

b20_Matchrom(2);? ?? ?? ?? ?? ???//匹配ROM? ?? ?? ?2

}

ds1820wr(0x44);//啟動溫度轉換

delay1ms(5);

ds1820rst();

ds1820wr(0xcc);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//讀序列號

ds1820rst();

if(z==1)

{

b20_Matchrom(1);? ?? ?? ?? ?? ?? ?? ?? ?? ? //匹配ROM 1

}

if(z==2)

{

b20_Matchrom(2);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//匹配ROM? ?? ?? ?2

}

ds1820wr(0xbe);//讀取溫度

a=ds1820rd();

b=ds1820rd();

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

if(tvalue<0x0fff)

tflag=0;

else

{? ?? ???tvalue=~tvalue+1;

tflag=1;

}

tt=tvalue*0.0625;

tvalue=tt*10;

return(tvalue);

}

/*****************顯示函數******************************/

void ds1820disp(uchar z)//溫度值顯示

{? ? uchar flagdat;

disdata[0]=tvalue/1000+0x30;//百位數

disdata[1]=tvalue%1000/100+0x30;//十位數

disdata[2]=tvalue%100/10+0x30;//個位數

disdata[3]=tvalue%10+0x30;//小數位

if(tflag==0)

flagdat=0x20;//正溫度不顯示符號

else

flagdat=0x2d;//負溫度顯示負號:-

if(disdata[0]==0x30)

{disdata[0]=0x20;//如果百位為0,不顯示

if(disdata[1]==0x30)

{disdata[1]=0x20;//如果百位為0,十位為0也不顯示

}

}

if(z==1)

{

wr_com(0x82);

wr_dat(flagdat);//顯示符號位

wr_com(0x83);

wr_dat(disdata[0]);//顯示百位

wr_com(0x84);

wr_dat(disdata[1]);//顯示十位

wr_com(0x85);

wr_dat(disdata[2]);//顯示個位

wr_com(0x86);

wr_dat(0x2e);//顯示小數點

wr_com(0x87);

wr_dat(disdata[3]);//顯示小數位

}

if(z==2)

{

wr_com(0xc2);

wr_dat(flagdat);//顯示符號位

wr_com(0xc3);

wr_dat(disdata[0]);//顯示百位

wr_com(0xc4);

wr_dat(disdata[1]);//顯示十位

wr_com(0xc5);

wr_dat(disdata[2]);//顯示個位

wr_com(0xc6);

wr_dat(0x2e);//顯示小數點

wr_com(0xc7);

wr_dat(disdata[3]);//顯示小數位

}

}

/********************主程序***********************************/

void main()

{

lcd_init();//初始化顯示

while(1)

{

read_temp(1);//讀取溫度

ds1820disp(1);//顯示

read_temp(2);//讀取溫度

ds1820disp(2);//顯示

//? ?? ?? ?? ?? ? delay1ms(10000);

}

}

總結

以上是生活随笔為你收集整理的ds18b20c语言显示小数位,DS18B20多点测温(读序列,匹配序列,51单片机C程序,1602显示)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。