找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3380|回复: 8
打印 上一主题 下一主题
收起左侧

C8051F410驱动DS18B20源码分享

[复制链接]
跳转到指定楼层
楼主
ID:56490 发表于 2018-10-13 13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//DS18B20驱动程序
//温度范围:-55-125摄氏度
//C8051F410,外部晶振(22.1184MHz),DS18B20上拉4.7K,1脚GND,2脚DQ,3脚VCC。
//功能:调用ds18b20_get_tem()程序,读取温度整数,小数值及符号位
//格式:温度整数为10进制1至125,温度小数为十进制0至9,符号为位状态0或1。
//变量:温度整数dswendu,温度小数dsxiao,符号DSWDFH。
#include "intrins.h" //_nop_();延时函数用  
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^5;
//#define DQHIN (P1MDOUT&=~0x20;P0 |= 0x01;)  
//#define DQ RC1
//#define DQH TRISC1=1;//DS18B20定义为高电平并设置为输入端
//#define DQL TRISC1=0;//DS18B20定义为低电平并设置为输出端
uchar  dswendu,dsxiao;
bit DSWDFH;
void delay_18b20(uint x) //18B20延时程序
{while(x--);}
void ds18b20_reset()//18B20复位程序
{//C8051F410,22.1184外部晶振
uchar st=1;//状态位置1
DQ=1;//总线高
while(st)
     {
      DQ=0;
      delay_18b20(600); //需要延时480us-960us
      DQ=1;
      delay_18b20(50); //需要延时15us-60us
      if(DQ==1)//等待时间约为240us-420us
       st=1;
      else
       st=0;        
     }
DQ=1;
delay_18b20(300);//100需要延时60us-240us

}
void ds18b20_write_byte(uchar dat)//18B20写一个字节
{
    unsigned char i=0;
for (i=8; i>0; i--)
    {
       DQ = 0;
       DQ = dat&0x01;
       delay_18b20(100);
       DQ = 1;
       dat>>=1;
    }
}
uchar ds18b20_read_byte()//18B20读一个字节
{
    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(80);
    }
     return(dat);
}
void ds18b20_get_tem()  //读出温度并转换成显示BCD码
{
uchar low,high,huhao;
uint dstemp,xs;
ds18b20_reset(); //复位
ds18b20_write_byte(0xCC);//跳过ROM
ds18b20_write_byte(0x44);//温度转换
ds18b20_reset();//18B20复位程序
ds18b20_write_byte(0xCC);//跳过ROM
ds18b20_write_byte(0xBE);//发送读取命令   
low=ds18b20_read_byte();  
high=ds18b20_read_byte();
huhao=high&0xf8;     
dstemp=high;
dstemp<<=8;   
dstemp=dstemp|low;
if(huhao==0xf8) //符号判断
      {
         dstemp=~dstemp+1;
            DSWDFH=1;
      }
    else DSWDFH=0;  
xs=(dstemp&0x0f)*625;
    dsxiao=xs/1000%10;//计算出小数位。
dswendu=dstemp>>4;
    dswendu=dswendu&0x7f;//计算出温度值
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-10-13 14:59 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

板凳
ID:56490 发表于 2018-10-13 21:44 | 只看该作者
版主给我了很大的动力啊!DS18B20单总线电路也没什么可画的,主要是程序运行时间。再者自已要搬砖也没太多时间。版主谅解!
回复

使用道具 举报

地板
ID:234560 发表于 2018-10-15 20:33 | 只看该作者
这种搞法业余玩玩还可以,复杂的项目里用不了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:56490 发表于 2018-10-26 19:41 | 只看该作者
请问如果专业的有什么区别?本人小白。谢谢!
回复

使用道具 举报

6#
ID:234560 发表于 2018-10-26 21:21 | 只看该作者
ch5320 发表于 2018-10-26 19:41
请问如果专业的有什么区别?本人小白。谢谢!

DS18B20是靠高低电平的不同时长区分0和1的,楼主里用了死循环的方式做延时,这样做在简单的系统里没问题。
但一个真正的项目中往往有很多中断需要处理,这样就有两个问题:
1. 如果延时期间允许中断,则在中断频繁时实际的延时就会比预计的长,导致0和1误判。
2. 如果延时期间不允许中断,则又会造成中断不能及时相应,可能会丢失重要的数据,或者使系统反应变得十分迟钝。
回复

使用道具 举报

7#
ID:56490 发表于 2018-10-28 11:02 | 只看该作者
九死还魂草 发表于 2018-10-26 21:21
DS18B20是靠高低电平的不同时长区分0和1的,楼主里用了死循环的方式做延时,这样做在简单的系统里没问题 ...

ds18b20这个延时的确是个问题,但做项目用到18B20一般都会单独设计芯片做采集。不会用主CPU来处理18B20,特别是多路采集。
回复

使用道具 举报

8#
ID:234560 发表于 2018-11-7 16:20 | 只看该作者
ch5320 发表于 2018-10-28 11:02
ds18b20这个延时的确是个问题,但做项目用到18B20一般都会单独设计芯片做采集。不会用主CPU来处理18B20, ...

一个18B20多少钱,一个MCU多少钱,再加一个芯片怎么也得几块钱吧,这样做成本上没有可行性,除非是垄断行业,感觉楼主没做过真正商用的项目,太想当然。
回复

使用道具 举报

9#
ID:56490 发表于 2018-11-10 12:04 | 只看该作者
的确是没做过大的商用项目,现在这点知识还做不了大的项目,经后要和各位高手好好学习。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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