登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机论坛
›
51单片机论坛
›
DS18B20 全部程序
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版
DS18B20 全部程序
[复制链接]
5483
3
smiles***
新手上路
发表于 2010-5-28 08:30:48
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
这是我DS18B20的全部程序在实验板上用1602显示,不过它的测温感觉一直有问题(温度不变,一直是27.93)希望有高手指导一下
#include <AT89X52.H>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define LEN 60
#define M 16
#define BUSY (DQ==0)
///////////////config set source////////////////////////////////
#define HIGH 0x10
#define LOW 0x10
#define CON_9 0x1f
#define CON_10 0x3f
#define CON_11 0x5f
#define CON_12 0x7f
/**************************************************************/
////////////////////////////define the ROM//////////////////////
#define Read_ROM 0x33
#define Match_ROM 0x55
#define Skip_ROM 0xcc
#define Search_ROM 0xf0
#define Al
ARM
_Search 0xec
/****************************************************************/
//////////////memory command functions/////////////////////////
#define Write_Scratchpad 0x4e
#define Read_Scratchpad 0xbe
#define Copy_Scratchpad 0x48
#define Convert_T 0x44
#define Reacll_E2E 0xb8
#define Read_Power_Supply 0xb4
/********************************************************************/
/////define the port////////////////////////////////////////////////
#define DATA P0
sbit lcd_rs=P1^0;
sbit lcd_rw=P1^1;
sbit lcd_en=P1^2;
sbit DQ=P3^5;
//uint a0,b0;
//define the variance/////////////////////////////////////////
uchar LCD[LEN]={" the temp is ?!!!.!!she shi du. "};
uchar flag;
uchar fuhao[10]={'0','1','2','3','4','5','6','7','8','9'};
//define the DS18B20 han-shu/////////////////////////////////
void delay_L(uint t);
void delay_T(uchar t);
void DS18_config();
void DS18_reset();
void DS18_check();
bit DS18_rd_bit();
uint DS18_rd_byte();
void DS18_wr_byte(uchar dat);
void DS18_ini();
void DS18_temp();
uint DS18_get_int();
uint DS18_get_dec();
/*******************************************************************/
////////////////////define the LCD han-shu//////////////////////////////
void lcd_ini();
void lcd_dat(uchar a);
void lcd_com(uchar a);
void lcd_busy();
void lcd_disp();
/***********************************************************************/
////////////////////main han-shu/////////////////////////////////////////
void main()
{
// uchar i;
DS18_ini();
lcd_com(0x01);
P0=0xff;
P3=0xff;
while(1)
{
// i=5;
DS18_temp();
//while(i--)
lcd_disp();
}
}
/******************************************************************/
//////////////////DS18B20 start/////////////////////////////////////
void delay_L(uint t)
{
while(t--);
}
/**********************************************************************/
void delay_T(uchar t)
{
while(t--);
}
/********************************************************************/
/*void DS18_config()
{
DS18_ini();
DS18_wr_byte(0xcc); //skip rom
DS18_wr_byte(0x4e); //write scratchpad
DS18_wr_byte(HIGH); //上限
DS18_wr_byte(LOW); //下限
DS18_wr_byte(0x7f); //set 11 bit (0.125)
DS18_ini();
DS18_wr_byte(0xcc); //skip rom
DS18_wr_byte(0x48); //保存设定值
DS18_ini();
DS18_wr_byte(0xcc); //skip rom
DS18_wr_byte(0xb8); //回调设定值
}*/
/************************************************************************/
void DS18_ini()
{
DS18_reset();
DS18_check();
DS18_wr_byte(Skip_ROM); //skip rom
DS18_wr_byte(Write_Scratchpad);
DS18_wr_byte(HIGH); //上限
DS18_wr_byte(LOW); //下限
DS18_wr_byte(CON_12);
DS18_reset();
DS18_check();
_nop_();_nop_();_nop_();
DS18_wr_byte(0xcc);
//_nop_();
DS18_wr_byte(Convert_T);
delay_L(3000);
DS18_reset();
DS18_check();
}
bit DS18_rd_bit()
{
bit dat;
DQ=0;
_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();
dat=DQ;
delay_L(500);
return dat;
}
uint DS18_rd_byte()
{
uchar idata dat=0;
uchar idata j;
uchar idata i;
for(i=0;i<8;i++)
{
j=DS18_rd_bit();
dat=(j<<i)|dat;
}
return dat;
}
void DS18_wr_byte(uchar dat)
{
uchar idata i;
uchar t;
for(i=0;i<8;i++)
{
t=dat&0x01;
if(t)
{
DQ=0;
_nop_();_nop_();
DQ=1;
delay_T(70);
}
else
{
DQ=0;
delay_T(60);
DQ=1;
_nop_();_nop_();
}
dat=dat>>1;
}
}
uint DS18_get_int()
{
uint idata a,b;
uint idata dat;
uint idata yy;
uchar idata i;
DS18_reset();
DS18_check();
_nop_();
DS18_wr_byte(Skip_ROM);
DS18_wr_byte(Convert_T);
while(BUSY);
DS18_reset();
DS18_check();
_nop_();
__nop_();
DS18_wr_byte(Skip_ROM);
DS18_wr_byte(Read_Scratchpad);
a=DS18_rd_byte();
b=DS18_rd_byte();
i=b;
i=i&0xf000;
yy=b<<8;
yy=yy+a;
if(i==0)
{
flag=0;
yy=yy>>4;
yy=yy&0x007f;
dat=yy;
}
else
{
flag=1;
yy=~yy;
yy++;
yy=yy<<5;
yy=yy>>9;
yy=yy&0x00ff;
dat=yy;
}
delay_T(1);
return dat;
}
uint DS18_get_dec()
{
uint a,b;
uint dat;
uint i;
uint yy;
DS18_reset();
DS18_check();
DS18_wr_byte(Skip_ROM);
DS18_wr_byte(Convert_T);
while(BUSY);
_nop_();
DS18_wr_byte(Skip_ROM);
DS18_wr_byte(Read_Scratchpad);
a=DS18_rd_byte();
b=DS18_rd_byte();
// a0=a;b0=b;
yy=b<<8|a;
i=b;
i=i&0xf000;
if(i==0)
{
flag=0;
a=a&0x000f;
dat=a;
}
else
{
flag=1;
yy=~yy;
yy++;
yy=yy&0x000f;
dat=yy;
}
delay_L(10);
return dat;
}
void DS18_reset()
{
DQ=0;
delay_L(240);
delay_L(240);
DQ=1;
}
void DS18_check()
{
while(DQ);
while(~DQ);
delay_L(1000);
}
void DS18_temp()
{
uint idata tempH,tempL;
uint idata t;
DS18_reset();
DS18_check();
_nop_();
_nop_();
tempH=DS18_get_int();
tempL=DS18_get_dec();
/* LCD[29]=fuhao[a0/100];
LCD[30]=fuhao[(a0/10)%10];
LCD[31]=fuhao[(a0)%10];
LCD[32]=fuhao[b0/100];
LCD[33]=fuhao[(b0/10)%10];
LCD[34]=fuhao[b0%10];
*/
if(flag==0)
LCD[28]='+';
else
LCD[28]='-';
t=(uint)(tempH/1000);/////////////////////////ririririririiririiriiririiriri
LCD[29]=fuhao[t];
t=(tempH%100);
t=t/10;
LCD[30]=fuhao[t];
t=tempH%10;
LCD[31]=fuhao[t];
t=(uint)((uint)tempL*625)/1000;
LCD[33]=fuhao[t];
t=(uint)(tempL*625/100);
t=t%10;
LCD[34]=fuhao[t];
}
/***********************************************************************************************************/
/**********************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
void lcd_ini()
{
lcd_com(0x38);
lcd_com(0x0c);
lcd_com(0x03);
// lcd_com(0x01);
}
void lcd_com(uchar a)
{
lcd_busy();
lcd_en=0;
delay_T(1);
lcd_en=1;
lcd_rw=0;
lcd_rs=0;
DATA=a;
delay_T(20);
lcd_en=0;
delay_T(10);
}
void lcd_dat(uchar a)
{
lcd_busy();
lcd_en=0;
delay_T(5);
lcd_en=1;
lcd_rw=0;
lcd_rs=1;
DATA=a;
delay_T(20);
lcd_en=0;
}
void lcd_busy()
{
uchar busy;
do
{
lcd_en=0;
delay_T(10);
lcd_en=1;
lcd_rw=1;
lcd_rs=0;
busy=DATA;
delay_T(100);
lcd_en=0;
}while(busy&&0x80==1);
}
void lcd_disp()
{
uchar i,j;
uchar *p=LCD+16;
uchar *q=LCD+32;
lcd_ini();
for(i=0;i<=M;i++)
{
lcd_com(0x80);
for(j=0;j<M;j++)
{
lcd_dat(p[j]);
delay_L(1000);
}
lcd_com(0xc0);
for(j=0;j<M;j++)
{
lcd_dat(q[j]);
delay_L(1000);
}
p--;
q--;
}
delay_L(60000);
}
的
举报
回复
3 个评论
ad***
管理员
发表于 2010-5-28 08:55:03
|
显示全部楼层
回复
1#
smiles_happy
程序一会帮你看下,先给你个思路,你那个27.93是否是液晶的初始温度,如果不是液晶的初始温度就说明显示数据的变量被改变了,这个有可能就是采集了一次,至于为什么会采集只采集一次你可以仔细看看你的采集函数又没有什么BUG。好了先说这么多一会帮你看看怎么回事。还有楼主最好进行程序的模块化 这样一大陀 以后修改调试都很麻烦的
楼主请看这里
while(BUSY);
DS18_reset();
DS18_check();
_nop_();
__nop_();
DS18_wr_byte(Skip_ROM);
红色字体那个多了个下划线把
举报
回复
支持
反对
smiles***
新手上路
发表于 2010-5-28 22:50:25
|
显示全部楼层
回复
2#
admin
非常感谢,再次编译时warning没有了,但写入单片机时还是不行
还有就是我刚接触单片机对应模块化编程没有概念。希望指教——
举报
回复
支持
反对
smiles***
新手上路
发表于 2010-5-28 23:20:03
|
显示全部楼层
回复
3#
smiles_happy
不好意思————我用的是51实验板,没有用仿真。
举报
回复
支持
反对
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
工控仪表液晶驱动VK0192 LQFP44/点阵LCD液
产品品牌:永嘉微电/VINKA 产品型号:VK0192 封装形式:LQFP44 概述 VK0192是一
不用电池收音机中锗三极管的替代
图中的检波二极管已找到贴片器件,图中的锗三极管能否使用贴片替换?
小封装液晶驱动VK1088B QFN32L点阵LCD液晶
产品品牌:永嘉微电/VINKA 产品型号:VK1088B 封装形式:QFN32L 概述 VK1088B是
LCD液晶驱动/点阵段码屏驱动芯片VK1072D SS
产品品牌:永嘉微电/VINKA 产品型号:VK1072D 封装形式:SSOP28 概述 VK1072D
VK1072C SOP28/3线串行接口LCD液晶显示驱动
产品品牌:永嘉微电/VINKA 产品型号:VK1072C 封装形式:SOP28 概述 VK1072C是
更多
精华推荐
51单片机的智能反汇编工具
工控仪表液晶驱动VK0192 LQFP44/点阵LCD液
不用电池收音机中锗三极管的替代
小封装液晶驱动VK1088B QFN32L点阵LCD液晶
LCD液晶驱动/点阵段码屏驱动芯片VK1072D SS
VK1072C SOP28/3线串行接口LCD液晶显示驱动
AP8100 外围简单的 BOOST 升压恒压控制驱动
AP510X 单路低压差线性恒流芯片 LED手电筒
更多
社区学堂
工控仪表液晶驱动VK0192 LQFP44/点阵LC
不用电池收音机中锗三极管的替代
工控仪表液晶驱动VK0192 LQFP44/点阵LCD液
产品品牌:永嘉微电/VINKA 产品型号:VK0192 封装形式:LQFP44 概述 VK0192是一
不用电池收音机中锗三极管的替代
图中的检波二极管已找到贴片器件,图中的锗三极管能否使用贴片替换?
小封装液晶驱动VK1088B QFN32L点阵LCD液晶
产品品牌:永嘉微电/VINKA 产品型号:VK1088B 封装形式:QFN32L 概述 VK1088B是
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表