📄 ds18b20.txt
字号:
DS18b20测温及12864液晶显示加入收藏
网站地图
网站搜索
繁體
首页 业界新闻 嵌入式编程 PC编程 DSP ARM 单片机 自动控制 测量检验 进入技术论坛
软硬件开发网 论坛 C++,VC,VB,DSP,ARM,MCU → 嵌入式编程
阅读新闻
DS18b20测温及12864液晶显示
[日期:2007-07-17]来源: 作者:[字体:大 中 小]
#i nclude<reg51.h>
#i nclude<math.h>
#i nclude<intrins.h>
/************定义端口****************/
sbit DA=P2^7; /*DS18B20的数据端口*/
sbit RS=P2^3;
sbit RW=P2^2;
sbit E=P2^1;
sbit PSB=P2^0;
/*************定义变量****************/
unsigned char temp1,temp2; /*温度的小数部分和整数部分*/
unsigned int temp; /*温度*/
float tempdecimal; /*温度小数部分用小数表示*/
unsigned char data i; /*用于循环的变量*/
/*******DS18B20函数原型说明*************/
bit reset(void);
void DSinit(void);
void DSWrite(unsigned char val);
unsigned char DSRead(void);
void DSTrans(void);
/***********LCD函数原型说明************/
void LCDinit();
void LCDDispTemp();
void LCDwritedata(unsigned char da);
void LCDwritecmd(unsigned char cmd);
void LCDwait();
void LCDlocate(unsigned char pox,unsigned char poy);
void delay400ms();
void delay1s();
void delay100us();
void delay15(unsigned char count);
void delayms(unsigned char k);
/*****************主函数*****************/
void main(void)
{
LCDinit();
delay400ms();
LCDwritedata(0x36);
DSinit();
while(1)
{
DSTrans();
tempdecimal=temp1*0.0625;
//LCDDispTemp();
}
}
/*************DS18B20初始化***********/
bit reset(void)
{
bit ack;
DA=1;
_nop_();
DA=0;
delay15(32);
DA=1;
delay15(4);
ack=DA;
delay15(16);
return(ack);
}
/************写到DS18B20一个字节*********/
void DSWrite(unsigned char val)
{
unsigned char i;
bit vb;
for(i=0;i<8;i++)
{
vb=val&0x01;
DA=0;
delay15(1);
DA=vb;
delay15(2);
DA=1;
val>>=1;
}
}
/***********从DS18B20读一个字节************/
unsigned char DSRead(void)
{
unsigned char i,dat;
dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
DA=1;
DA=0;
_nop_();
_nop_();
DA=1;
delay15(1);
if(DA)dat|=0x80;
delay15(4);
}
return(dat);
}
/******************DS18B20初始化***************/
void DSinit(void)
{
bit flag;
do{ flag=reset();}while(flag);
DSWrite(0xcc);
DSWrite(0x4e);
DSWrite(0x64);
DSWrite(0x00);
DSWrite(0x7f);
}
/***********DS18B20测量温度************/
void DSTrans(void)
{
unsigned char a,b;
bit flag;
do{ flag=reset();}while(flag);
DSWrite(0xcc);
DSWrite(0x44);
delay1s();
do{ flag=reset();}while(flag);
DSWrite(0xcc);
DSWrite(0xbe);
a=DSRead();
b=DSRead();
DSRead();
DSRead();
DSRead();
DSRead();
DSRead();
DSRead();
DSRead();
temp=b;
temp=temp<<8;
temp|=a;
if((temp&0x0800)==0x0800)
{
temp|=0xf000;
temp=~temp+1;
}
temp1=temp&0x000f;
temp=temp>>4;
temp2=temp;
//LCDwritedata(0x42);
//LCDlocate(2,2);
//LCDwritedata(temp1);
//LCDwritedata(temp2);
//while(1);
}
/**********LCD初始化************/
void LCDinit()
{
PSB=0;
delay400ms();
PSB=1;
delay400ms();
LCDwritecmd(0x30);
delay100us();
LCDwritecmd(0x0c);
delay100us();
LCDwritecmd(0x01);
delay100us();
LCDwritecmd(0x06);
delay100us();
}
/*************向LCD写一个字节数据*************/
void LCDwritedata(unsigned char da)
{
LCDwait();
RS=1;
RW=0;
P0=da;
E=1;
E=0;
}
/*************向LCD写一个字节命令*************/
void LCDwritecmd(unsigned char cmd)
{
LCDwait();
RS=0;
RW=0;
P0=cmd;
E=1;
E=0;
}
/*************等待LCD空闲****************/
void LCDwait()
{
RS=0;
RW=1;
P0=0XFF;
E=1;
while(P0&0x80);
E=0;
}
/**************LCD显示定位****************/
void LCDlocate(unsigned char pox,unsigned char poy)
{ unsigned char data pos;
if(pox&0x01)
{
pos=poy|0x80;
if(pox&0x02) pos+=0x07;
else pos-=0x01;
}
else {
pos=poy|0x90;
if(pox&0x02) pos-=0x01;
else pos+=poy|0x07;
}
LCDwritecmd(pos);
}
/**************LCD显示温度****************/
void LCDDispTemp(void)
{
unsigned int a;
unsigned char num1[3],num2[4];
//temp1=0x0f;
//temp2=12;
//tempdecimal=0.856;
for(i=2;i>=0;i--)
{
num1=0x30+temp2%10;
temp2=temp2/10;
if(!i) break;
}
a=tempdecimal*10000;
for(i=3;i>=0;i--)
{
num2=0x30+a%10;
a/=10;
if(!i) break;
}
for(i=0;i<=2;i++)
if(num1!=0x30) break;
LCDlocate(2,2);
if(i==3) LCDwritedata(0x30);
else for(;i<=2;i++) LCDwritedata(num1);
LCDwritedata(0x2e);
for(i=0;i<4;i++) LCDwritedata(num2);
}
/***************延时函数******************/
void delay400ms()
{
unsigned int data j;
for(i=5;i>0;i--)
for(j=7269;j>0;j--);
}
void delay1s()
{
unsigned int data j;
for(i=100;i>0;i--)
for(j=1000;j>0;j--);
}
void delay100us()
{
for(i=10;i>0;i--);
}
void delayms(unsigned char k)
{
unsigned int data j;
for(i=0;i<j;i++)
for(j=0;j<100;j++)
}
void delay15(unsigned char count)
{
while(count)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
count--;
}
}
阅读: 次
录入:admin
【 评论 】 【 推荐 】 【 打印 】
上一篇:《Windows CE 开发初步》
下一篇:
相关新闻
本文评论 全部评论
发表评论
点评: 字数
姓名:
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
网站简介 - 广告服务 - 网站地图 - 帮助信息 - 联系方式
Copyright © allnode.com Powered by
陕ICP备05009440号
本站法律顾问:李朝阳律师
iwms 4.5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -