搜索
bottom↓
回复: 3

读取DS18B20ROM 即ID的程序。。。大家分享下。。。。DQ为3.7

[复制链接]

出0入0汤圆

发表于 2011-11-22 09:04:33 | 显示全部楼层 |阅读模式
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS= P3^7; //根据实实际情况设定DS18B20端口
uchar code table[]={"0123456789ABCDEF"}; //用于1602显示
uchar sn[8]; //4个器件的序列号,先读出单个序列号后填上才可以读取温度
/**************************************/
/************1602部分******************/
sbit rs=P0^0;
sbit rw=P0^1;
sbit lcden=P0^2;
void delay1602(uint z)
{
uint x,y;
for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}
void write_com(uchar com)//写命令
{
rs=0;
lcden=0;
P2=com;
delay1602(5);
lcden=1;
delay1602(5);
lcden=0;
}
void write_date(uchar date)//写数据
{
rs=1;
lcden=0;
P2=date;
delay1602(5);
lcden=1;
delay1602(5);
lcden=0;
}
void init_lcd() //初始化
{
lcden=0;
rw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
/****************************************/
/*************DS18B20部分****************/
void delayb(uint count)      //延时
{
uint i;
while(count)
{
   i=200;
   while(i>0)i--;
   count--;
}
}
void dsreset()       //DS18B20初始化
{
uint i;               
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bit readbit()       // 读一位
{
uint i;
bit dat;
DS=0;i++;          //小延时一下
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar readbyte()   //读一个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
   j=readbit();
   dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);             //将一个字节数据返回
}
void writebyte(uchar dat) //写一个字节到DS18B20里
{                           
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
   testb=dat&0x01;
   dat=dat>>1;
   if(testb)     // 写1部分
   {
    DS=0;
    i++;i++;
    DS=1;
    i=8;while(i>0)i--;
   }
   else
   {
    DS=0;       //写0部分
    i=8;while(i>0)i--;
    DS=1;
    i++;i++;
   }
}
}
void rom() //读取序列号
{
uchar i;
dsreset(); //复位
delayb(1); //延时
writebyte(0x33); //发送读序列号子程序
for(i=0;i<8;i++) //因为是8个字节,所以要读取8次
{
   sn=readbyte(); //读取序列号
}
}
/*****************************************/
/************主程序及显示部分*************/
main()
{
uchar i,c,l,h;
init_lcd(); //初始化1602
while(1)
{
   rom();    //调用读序列号子程序
   delayb(100); //如果是不断地读取的话可以不延时
   for(i=0;i<8;i++) //因为是8个字节,所以要循环8次,每次显示一个字节
   {
    l=(sn&0xf0)>>4;   //获取低四位
    h=sn&0x0f;    //获取高四位
    write_com(0x80+c);   //显示位置
    write_date(table[l]); //显示低四位的16进制码
    write_date(table[h]); //显示高四位的16进制码
    c++;c++; //每显示一个字节,显示位置右移两位
   }
   while(1);
}
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-2-8 14:49:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-16 11:08:38 | 显示全部楼层
正需要,谢了

出0入0汤圆

发表于 2012-4-16 20:51:08 | 显示全部楼层
强!顶一下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 00:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表