DS18B20数字温度计C程序(能显示负温)

//***********DS18B20数字温度计C程序****************//

//*MCU: AT892051 //

//*MCU-crystal: 12M //

//*Version: 01 //

//*Last Updata: 2007-6-10 //

//*Author: zhaojun //

//*Description: //

//DS18B20的读写程序,数据脚P3.4 //

//温度传感器18B20汇编程序,采用器件默认的12位转化 //

//最大转化时间750微秒,显示温度-55到+125度,显示精度 //

//为0.1度,显示采用4位LED共阳显示测温值 //

//P1口为段码输入,P0~P3为位选 //

/***************************************************/

#include "reg51.h"

#include "intrins.h" //_nop_();延时函数用

#define Disdata P1 //段码输出口

#define discan P3 //扫描口

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P3^4; //温度输入口

sbit DIN=P1^7; //LED小数点控制

uint h;

uint temp;

//

//

//**************温度小数部分用查表法***********//

uchar code ditab[16]=

{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

//

uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};

//共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"

uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //列扫描控制字

uchar data temp_data[2]={0x00,0x00}; //读出温度暂放

uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用

//

//

//

/*****************11us延时函数*************************/

//

void delay(uint t)

{

for (;t>0;t--);

}

//

/****************显示扫描函数***************************/

scan()

{

char k;

for(k=0;k<4;k++) //4位LED扫描控制

{

Disdata=dis_7[display[k]]; //数据显示

if (k==1){DIN=0;} //小数点显示

discan=scan_con[k]; //位选

delay(300);

}

}

//

//

/****************DS18B20复位函数************************/

ow_reset(void)

{

char presence=1;

while(presence)

{

while(presence)

{

DQ=1;_nop_();_nop_();//从高拉倒低

DQ=0;

delay(50); //550 us

DQ=1;

delay(6); //66 us

presence=DQ; //presence=0 复位成功,继续下一步

}

delay(45); //延时500 us

presence=~DQ;

}

DQ=1; //拉高电平

}

//

//

/****************DS18B20写命令函数************************/

//向1-WIRE 总线上写1个字节

void write_byte(uchar val)

{

uchar i;

for(i=8;i>0;i--)

{

DQ=1;_nop_();_nop_(); //从高拉倒低

DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us

DQ=val&0x01; //最低位移出

delay(6); //66 us

val=val/2; //右移1位

}

DQ=1;

delay(1);

}

//

/****************DS18B20读1字节函数************************/

//从总线上取1个字节

uchar read_byte(void)

{

uchar i;

uchar value=0;

for(i=8;i>0;i--)

{

DQ=1;_nop_();_nop_();

value>>=1;

DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us

DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us

if(DQ)value|=0x80;

delay(6); //66 us

}

DQ=1;

return(value);

}

//

/****************读出温度函数************************/

//

read_temp()

{

ow_reset(); //总线复位

delay(200);

write_byte(0xcc); //发命令

write_byte(0x44); //发转换命令

ow_reset();

delay(1);

write_byte(0xcc); //发命令

write_byte(0xbe);

temp_data[0]=read_byte(); //读温度值的第字节

temp_data[1]=read_byte(); //读温度值的高字节

temp=temp_data[1];

temp<<=8;

temp=temp|temp_data[0]; // 两字节合成一个整型变量。

return temp; //返回温度值

}

//

/****************温度数据处理函数************************/

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩

//下的低字节的低半字节转化成十进制后,就是温度值的小数部分

/********************************************************/

work_temp(uint tem)

{

uchar n=0;

if(tem>6348) // 温度值正负判断

{tem=65536-tem;n=1;} // 负温度求补码,标志位置1

display[4]=tem&0x0f; // 取小数部分的值

display[0]=ditab[display[4]]; // 存入小数部分显示值

display[4]=tem>>4; // 取中间八位,即整数部分的值

display[3]=display[4]/100; // 取百位数据暂存

display[1]=display[4]%100; // 取后两位数据暂存

display[2]=display[1]/10; // 取十位数据暂存

display[1]=display[1]%10;

/******************符号位显示判断**************************/

if(!display[3])

{

display[3]=0x0a; //最高位为0时不显示

if(!display[2])

{

display[2]=0x0a; //次高位为0时不显示

}

}

if(n){display[3]=0x0b;} //负温度时最高位显示"-"

}

//

//

/****************主函数************************/

main()

{

Disdata=0xff; //初始化端口

discan=0xff;

for(h=0;h<4;h++) //开机显示"8888"

{display[h]=8;}

ow_reset(); //开机先转换一次

write_byte(0xcc); //Skip ROM

write_byte(0x44); //发转换命令

for(h=0;h<100;h++) //开机显示"8888"

{scan();}

while(1)

{

work_temp(read_temp()); //处理温度数据

scan(); //显示温度值

}

}

//

//***********************结束**************************//

数字温度计的c语言编程,DS18B20数字温度计C程序(能显示负温)相关推荐

  1. 18b20温度计报警C语言,制作DS18B20数字温度计我还想具有报警功能

    DS18B20引脚定义: (1)DQ为数字信号输入/输出端:(需要加个上拉电阻加到电源上) (2)GND为电源地: (3)VDD为外接供电电源输入端(在寄生电源接线方式时接地). 本人做过它的课程设计 ...

  2. c语言怎么把数字倒过来_c语言编程:实现数字的翻转

    方法一:(易理解的) #include #include int main() { int n; scanf("%d",&n);//输入要翻转的数字 int result ...

  3. c语言编程题猜数字游戏6题,c语言编程—猜数字游戏.doc

    c语言编程-猜数字游戏 计算机实习报告 面向过程编程 用C语言求解实际问题 一.问题描述 游戏类第15个任务--猜数字游戏 计算机从0-9这10个数字中任意选择n个不重复数字(n≤10)组成一个5位数 ...

  4. c语言求三门课总成绩,C语言编程,求高手 编写程序求某班20位学生三门课(英语,数学,语文)总成绩,并按照总成绩从大到小...

    C语言编程,求高手 编写程序求某班20位学生三门课(英语,数学,语文)总成绩,并按照总成绩从大到小 关注:212  答案:3  mip版 解决时间 2021-01-17 10:35 提问者夜落花台 2 ...

  5. 数字温度计的c语言编程,基于DS18B20数字温度计的设计(全文完整版)

    <基于DS18B20数字温度计的设计.doc>由会员分享,可免费在线阅读全文,更多与<基于DS18B20数字温度计的设计>相关文档资源请在帮帮文库(www.woc88.com) ...

  6. 离散卷积的c语言编程实验,数字信号处理实验一离散卷积c语言编程.ppt

    数字信号处理实验一离散卷积c语言编程 实验一 离散卷积的C语言编程实验 DSP实验室 2005 实验性质 综合设计性实验 实验目的 1 了解和认识常用的各种信号: 2 掌握卷积的定义和计算方法: 3 ...

  7. 多功能数字钟软件C语言,多功能数字时钟

    内容介绍 原文档由会员 你的样子 发布 多功能数字时钟 ①页数 19 ②字数 6932 ③摘要 摘 要: 随着电子技术的发展,在诸如计时.控制等领域,设计出应用具有时间设置(小时和分钟),闹钟时间设置 ...

  8. c语言编程入门题库,级程序设计基础题库(c语言)(..更新).doc

    级程序设计基础题库(c语言)(..更新).doc 14级<程序设计基?础>题库100?道 1.总共抽10?道题,按题型:顺序(1道).分支(1道).单循环(2道).多循环(1道).数组(1 ...

  9. c语言经典编程案例猜数字,用c语言编程猜数字

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //NumberRiddle.c //这个程序还没有做完,用户输入检测部分没有做,不继续了.2009-12-22 //猜数字游戏 //游戏规则: //电脑 ...

最新文章

  1. java cst gmt_“CST”和“GMT”时间的区别?
  2. python代码模块与模块之间空1行_Day006|Python语法基础
  3. 怎么用计算机计算出选手最后得分,WPS技巧:TRIMMEAN函数计算选手得分
  4. OpenCV3学习(11.7) BRISK特征检测器及BRISK描述符
  5. HTTP协议详细介绍~超详细
  6. Visio 2003 Professional
  7. 合并两个有序数组的三种方法
  8. excel中实现多条件去重计数
  9. 如何使用http://paste.ubuntu.com/分享代码
  10. Pentest Wiki Part5 提权
  11. photoshop ps 瘦身方法 液化工具
  12. yarn 出现error An unexpected error occurred错误的解决办法
  13. 【完全背包】A005_LC_贴纸拼词(dp + 状态压缩)
  14. 算法设计与分析——算法基础初步了解
  15. 读懂2014年全球互联网广告新生态
  16. You probably need to get an updated matplotlibrc file from解决方法
  17. python实现查询qq是否在线
  18. 华为畅享z和畅享20pro有什么区别
  19. 如何在mac里安装vmware,在mac里安装虚拟机,如何注册vmware
  20. mahout java api_Mahout推荐算法API详解

热门文章

  1. 安卓手机APP压力monkey测试
  2. 《TensorFlow+Keras深度学习人工智能实践应用》林大贵著第六章第七章代码
  3. alter database datafile resize(+释放空间)
  4. 一篇NDSS的关于跨平面漏洞的论文分析
  5. Windows 获取已连接WIFI密码
  6. 【干货】7个面向产品经理的实用工具推荐
  7. 【Android 实现VideoView开始和播放时缓冲监听动画(监听播放状态)】
  8. 调制解调器是什么样子_什么是调制解调器?
  9. Python办公自动化实战 09 | Python-docx库:Python与Word的完美结合_ 如何在Word中生成表格?把Python办公自动化进行到底
  10. linux hba卡超时时间,如何设置QLogic HBA卡超时参数