读取DS18B20序列号.docx

上传人:b****8 文档编号:10483007 上传时间:2023-02-13 格式:DOCX 页数:18 大小:17.53KB
下载 相关 举报
读取DS18B20序列号.docx_第1页
第1页 / 共18页
读取DS18B20序列号.docx_第2页
第2页 / 共18页
读取DS18B20序列号.docx_第3页
第3页 / 共18页
读取DS18B20序列号.docx_第4页
第4页 / 共18页
读取DS18B20序列号.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

读取DS18B20序列号.docx

《读取DS18B20序列号.docx》由会员分享,可在线阅读,更多相关《读取DS18B20序列号.docx(18页珍藏版)》请在冰豆网上搜索。

读取DS18B20序列号.docx

读取DS18B20序列号

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

/**/

/*TX-51STAR单片机开发系统演示程序-DS18B20-64位序列码读取程序*/

/**

*LCD1602显示*

**

*工作芯片:

STC89C516晶振频率:

11.0592MHz*

**

*版本:

V1.0(2009/1/2)*

*作者:

郭天祥(Email:

txmcu.)*

*:

.tx-power.(天祥电子)*

*:

txmcu.*

**

*【】Copyright(C)天祥电子.tx-power.AllRightsReserved*

*【声明】此程序仅用于学习与参考,引用请注明和作者信息!

*

**

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

/*读取DS18B20的64位序列码并显示在1602液晶上,如果读取正确结果,则在

液晶第一行显示DS18B20OK,第二行显示序列码,如果读取失败,则在液晶上

显示DS18B20ERR0RPLEASECHECK,用户可通过更改18B20接口自己外接。

*/

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P2^2;//定义DS18B20端口DQ

sbitBEEP=P2^3;//蜂鸣器驱动线

bitpresence;

sbitLCD_RS=P3^5;

//sbitLCD_RW=P2^1;

sbitLCD_EN=P3^4;

ucharcodecdis1[]={"DS18B20OK"};

ucharcodecdis2[]={""};

ucharcodecdis3[]={"DS18B20ERR0R"};

ucharcodecdis4[]={"PLEASECHECK"};

unsignedchardatadisplay[2]={0x00,0x00};

unsignedchardataRomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

unsignedcharTemp;

unsignedcharcrc;

voidbeep();

#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};

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

voiddelay1(intms)

{

unsignedchary;

while(ms--)

{

for(y=0;y<250;y++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

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

/**/

/*检查LCD忙状态*/

/*lcd_busy为1时,忙,等待。

lcd-busy为0时,闲,可写指令与数据。

*/

/**/

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

bitlcd_busy()

{

bitresult;

LCD_RS=0;

//LCD_RW=1;

LCD_EN=1;

delayNOP();

result=(bit)(P0&0x80);

LCD_EN=0;

return(result);

}

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

/**/

/*写指令数据到LCD*/

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。

*/

/**/

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

voidlcd_wcmd(ucharcmd)

{

//while(lcd_busy());

LCD_RS=0;

//LCD_RW=0;

LCD_EN=0;

_nop_();

_nop_();

P0=cmd;

delayNOP();

LCD_EN=1;

delayNOP();

LCD_EN=0;

delay1(5);

}

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

/**/

/*写显示数据到LCD*/

/*RS=H,RW=L,E=高脉冲,D0-D7=数据。

*/

/**/

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

voidlcd_wdat(uchardat)

{

//while(lcd_busy());

LCD_RS=1;

//LCD_RW=0;

LCD_EN=0;

P0=dat;

delayNOP();

LCD_EN=1;

delayNOP();

LCD_EN=0;

delay1(5);

}

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

/**/

/*LCD初始化设定*/

/**/

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

voidlcd_init()

{

delay1(15);

lcd_wcmd(0x01);//清除LCD的显示容

lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x0c);//显示开,关光标

delay1(5);

lcd_wcmd(0x06);//移动光标

delay1(5);

lcd_wcmd(0x01);//清除LCD的显示容

delay1(5);

}

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

/**/

/*设定显示位置*/

/**/

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

voidlcd_pos(ucharpos)

{

lcd_wcmd(pos|0x80);//数据指针=80+地址变量

}

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

/**/

/*us级延时函数*/

/**/

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

voidDelay(unsignedintnum)

{

while(--num);

}

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

/**/

/*初始化ds1820*/

/**/

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

Init_DS18B20(void)

{

DQ=1;//DQ复位

Delay(8);//稍做延时

DQ=0;//将DQ拉低

Delay(90);//精确延时大于480us

DQ=1;//拉高总线

Delay(8);

presence=DQ;//读取存在信号

Delay(100);

DQ=1;

return(presence);//返回信号,0=presence,1=nopresence

}

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

/**/

/*读一位(bit)*/

/**/

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

ucharread_bit(void)

{

unsignedchari;

DQ=0;//将DQ拉低开始读时间隙

DQ=1;//thenreturnhigh

for(i=0;i<3;i++);//延时15μs

return(DQ);//返回DQ线上的电平值

}

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

/**/

/*读一个字节*/

/**/

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

ReadOneChar(void)

{

unsignedchari=0;

unsignedchardat=0;

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

//{

//read_bit();

//DQ=0;//给脉冲信号

//dat>>=1;

//DQ=1;//给脉冲信号

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

{//读取字节,每次读取一个字节

if(read_bit())dat|=0x01<

//if(DQ)

//dat|=0x80;

Delay(4);

}

return(dat);

}

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

/**/

/*写一位*/

/**/

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

voidwrite_bit(charbitval){

DQ=0;//将DQ拉低开始写时间隙

if(bitval==1)DQ=1;//如果写1,DQ返回高电平

Delay(5);//在时间隙保持电平值,

DQ=1;//Delay函数每次循环延时16μs,因此delay(5)=104μs

}

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

/**/

/*写一个字节*/

/**/

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

WriteOneChar(unsignedchardat)

{

unsignedchari=0;

unsignedchartemp;

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

//{

for(i=0;i<8;i++)//写入字节,每次写入一位

{

//DQ=0;

//DQ=dat&0x01;

//Delay(5);

//DQ=1;

temp=dat>>i;

temp&=0x01;

write_bit(temp);

//dat>>=1;

}

Delay(5);

}

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

/**/

/*读取64位序列码*/

/**/

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

Read_RomCord(void)

{

unsignedcharj;

Init_DS18B20();

WriteOneChar(0x33);//读序列码的操作

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

{

RomCode[j]=ReadOneChar();

}

}

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

/**/

/*DS18B20的CRC8校验程序*/

/**/

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

ucharCRC8()

{

uchari,x;ucharcrcbuff;

crc=0;

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

{

crcbuff=RomCode[x];

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

{

if(((crc^crcbuff)&0x01)==0)

crc>>=1;

else{

crc^=0x18;//CRC=X8+X5+X4+1

crc>>=1;

crc|=0x80;

}

crcbuff>>=1;

}

}

returncrc;

}

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

/**/

/*数据转换与显示*/

/**/

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

Disp_RomCode()

{

ucharj;

ucharH_num=0x40;//LCD第二行初始位置

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

{

Temp=RomCode[j];

display[0]=((Temp&0xf0)>>4);

if(display[0]>9)

{display[0]=display[0]+0x37;}

else{display[0]=display[0]+0x30;}

lcd_pos(H_num);

lcd_wdat(display[0]);//高位数显示

H_num++;

display[1]=(Temp&0x0f);

if(display[1]>9)

{display[1]=display[1]+0x37;}

else{display[1]=display[1]+0x30;}

lcd_pos(H_num);

lcd_wdat(display[1]);//低位数显示

H_num++;

}

}

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

/**/

/*蜂鸣器响一声*/

/**/

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

voidbeep()

{

unsignedchary;

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

{

Delay(60);

BEEP=!

BEEP;//BEEP取反

}

BEEP=1;//关闭蜂鸣器

Delay(40000);

}

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

/**/

/*DS18B20OK显示菜单*/

/**/

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

voidOk_Menu()

{

ucharm;

lcd_init();//初始化LCD

lcd_pos(0);//设置显示位置为第一行的第1个字符

m=0;

while(cdis1[m]!

='\0')

{//显示字符

lcd_wdat(cdis1[m]);

m++;

}

lcd_pos(0x40);//设置显示位置为第二行第1个字符

m=0;

while(cdis2[m]!

='\0')

{

lcd_wdat(cdis2[m]);//显示字符

m++;

}

}

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

/**/

/*DS18B20ERROR显示菜单*/

/**/

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

voidError_Menu()

{

ucharm;

lcd_init();//初始化LCD

lcd_pos(0);//设置显示位置为第一行的第1个字符

m=0;

while(cdis3[m]!

='\0')

{//显示字符

lcd_wdat(cdis3[m]);

m++;

}

lcd_pos(0x40);//设置显示位置为第二行第1个字符

m=0;

while(cdis4[m]!

='\0')

{

lcd_wdat(cdis4[m]);//显示字符

m++;

}

}

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

/**/

/*主函数*/

/**/

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

voidmain()

{

P0=0xff;

P2=0xff;

while

(1)

{

Ok_Menu();

Read_RomCord();//读取64位序列码

CRC8();//CRC效验

if(crc==0)//CRC效验正确

{

Disp_RomCode();//显示64位序列码

beep();

}

while(!

presence)

{

Init_DS18B20();

delay1(1000);

}

Error_Menu();

do

{

Init_DS18B20();

beep();

}

while(presence);

}

}

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1