读取DS18b20序列号程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/***************2010.11.24 调试成功********************/ #include<at89x52.h>
#include <LCD12864.h>
#define uint unsigned int
#define uchar unsigned char
uchar ID[8];///定义一个数组来存放序列号
uchar sn1,sn2,sn3,sn4,sn5,sn6,sn7,sn8;
sbit DQ = P1^1; //定义ds18b20 DQ引脚为P1.1
/**************延时********/
void delay_18B20(unsigned int i)
{
while(i--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;
delay_18B20(4);
DQ = 0;
delay_18B20(100);
DQ=1;
delay_18B20(40);
}
/***********ds18b20读一个字节**************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(10);
DQ = 1;
dat>>=1;
}
}
void b20_Readrom() //read the serial 读取温度传感器的序列号子函数{
Init_DS18B20();
delay_18B20(1);
WriteOneChar(0x33);
sn1=ReadOneChar();
ID[7]=sn1;
sn2=ReadOneChar();
ID[6]=sn2;
sn3=ReadOneChar();
ID[5]=sn3;
sn4=ReadOneChar();
ID[4]=sn4;
sn5=ReadOneChar();
ID[3]=sn5;
sn6=ReadOneChar();
ID[2]=sn6;
sn7=ReadOneChar();
ID[1]=sn7;
sn8=ReadOneChar();
ID[0]=sn8;
}
/*********************显示子程序***************************/ void Lcd_Display()//显示函数
{
uchar i,h,l;
lcm_w_word(0x80);
for(i=0;i<8;i++)
{
l=ID[i]&0x0f; //取低4位
h=ID[i]&0xf0; //取高4位*/
h>>=4;
if((h>=0x00)&&(h<=0x09))
lcm_w_test(1,h+0x30);//取ASCII码
else
lcm_w_test(1,h+0x37);//取ASCII码
if((l>=0x00)&&(l<=0x09))
lcm_w_test(1,l+0x30);//取ASCII码
else
lcm_w_test(1,l+0x37);//取ASCII码
}
}
void main()
{
lcm_init();//初始化液晶显示器
lcm_clr(); //清屏
while(1)
{b20_Readrom();//读取序列号
Lcd_Display();//在12864上显示序列号
delay_18B20(6000);
}
}
/*******************************以上是.c文件************************/
/*******************以下是头文件**************************************/
#include<at89x52.h>
#include <string.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/************************函数声明*************************************/
void lcm_w_word(unsigned char *str) ; //写字符
void lcm_w_test(bit start,unsigned char ddata); //(0,指令)(1,数据)
void lcm_w_byte(unsigned char bbyte); //写一个字节给lcm
void delaynms(unsigned int di); //延时
void lcm_init(void); //lcm初始化
void lcm_clr(void); //清屏
/*************************************************************************/
//12864液晶引脚定义
sbit SID = P3^6; //数据
sbit SCLK = P3^7; //时钟
/**************************延时*********************
void DelayMs(void)
{
uchar TempCyc;
for(TempCyc=100;TempCyc>1;TempCyc--)
{;}
}
**/
/***********************延时(LCM占用)***************************************/ void delaynms(unsigned int di)
{
unsigned int da,db;
for(da=0;da<di;da++);
for(db=0;db<10;db++);
}
/***********************初始化LCM**************************************/
void lcm_init(void)
{
delaynms(100); //启动等待,等LCM讲入工作状态
lcm_w_test(0,0x30); //8 位介面,基本指令集
lcm_w_test(0,0x0c); //显示打开,光标关,反白关
lcm_w_test(0,0x01); //清屏,将DDRAM的地址计数器归零
delaynms(100); //启动等待,等LCM讲入工作状态
/******************写指令或数据(0,指令)(1,数据)*****************************************/
void lcm_w_test(bit start, unsigned char ddata)
{
unsigned char start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //0:写指令
else
start_data=0xfa; //1:写数据
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
lcm_w_byte(start_data); //发送起始信号
delaynms(5); //延时是必须的
lcm_w_byte(Hdata); //发送高四位
delaynms(5); //延时是必须的
lcm_w_byte(Ldata); //发送低四位
delaynms(5); //延时是必须的
}
/*********************发送一个字节(底层函数)****************************************/
void lcm_w_byte(unsigned char bbyte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SID=bbyte&0x80; //取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1; //左移
}
}
/***********************清屏函数******************************************/ void lcm_clr(void)
{
lcm_w_test(0,0x01);
delaynms(40); //启动等待,等LCM讲入工作状态
}
/*****************************************************************************/
void lcm_w_word(unsigned char *str)
{
while(*str != '\0')
{
lcm_w_test(1,*str++);
}
*str = 0;
}
/***********************输出一个字的不显示数据。
*****************/ void Show_pass(uchar addr)
{
lcm_w_test(0,addr); //不显示
lcm_w_word(" ");
}。