读取DS18B20序列号.docx
- 文档编号:10483007
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:18
- 大小:17.53KB
读取DS18B20序列号.docx
《读取DS18B20序列号.docx》由会员分享,可在线阅读,更多相关《读取DS18B20序列号.docx(18页珍藏版)》请在冰豆网上搜索。
读取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);
}
}
/*******************************************************************/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 读取 DS18B20 序列号