数字温度计的c语言编程,DS18B20数字温度计C程序(能显示负温)
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程序(能显示负温)相关推荐
- 18b20温度计报警C语言,制作DS18B20数字温度计我还想具有报警功能
DS18B20引脚定义: (1)DQ为数字信号输入/输出端:(需要加个上拉电阻加到电源上) (2)GND为电源地: (3)VDD为外接供电电源输入端(在寄生电源接线方式时接地). 本人做过它的课程设计 ...
- c语言怎么把数字倒过来_c语言编程:实现数字的翻转
方法一:(易理解的) #include #include int main() { int n; scanf("%d",&n);//输入要翻转的数字 int result ...
- c语言编程题猜数字游戏6题,c语言编程—猜数字游戏.doc
c语言编程-猜数字游戏 计算机实习报告 面向过程编程 用C语言求解实际问题 一.问题描述 游戏类第15个任务--猜数字游戏 计算机从0-9这10个数字中任意选择n个不重复数字(n≤10)组成一个5位数 ...
- c语言求三门课总成绩,C语言编程,求高手 编写程序求某班20位学生三门课(英语,数学,语文)总成绩,并按照总成绩从大到小...
C语言编程,求高手 编写程序求某班20位学生三门课(英语,数学,语文)总成绩,并按照总成绩从大到小 关注:212 答案:3 mip版 解决时间 2021-01-17 10:35 提问者夜落花台 2 ...
- 数字温度计的c语言编程,基于DS18B20数字温度计的设计(全文完整版)
<基于DS18B20数字温度计的设计.doc>由会员分享,可免费在线阅读全文,更多与<基于DS18B20数字温度计的设计>相关文档资源请在帮帮文库(www.woc88.com) ...
- 离散卷积的c语言编程实验,数字信号处理实验一离散卷积c语言编程.ppt
数字信号处理实验一离散卷积c语言编程 实验一 离散卷积的C语言编程实验 DSP实验室 2005 实验性质 综合设计性实验 实验目的 1 了解和认识常用的各种信号: 2 掌握卷积的定义和计算方法: 3 ...
- 多功能数字钟软件C语言,多功能数字时钟
内容介绍 原文档由会员 你的样子 发布 多功能数字时钟 ①页数 19 ②字数 6932 ③摘要 摘 要: 随着电子技术的发展,在诸如计时.控制等领域,设计出应用具有时间设置(小时和分钟),闹钟时间设置 ...
- c语言编程入门题库,级程序设计基础题库(c语言)(..更新).doc
级程序设计基础题库(c语言)(..更新).doc 14级<程序设计基?础>题库100?道 1.总共抽10?道题,按题型:顺序(1道).分支(1道).单循环(2道).多循环(1道).数组(1 ...
- c语言经典编程案例猜数字,用c语言编程猜数字
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //NumberRiddle.c //这个程序还没有做完,用户输入检测部分没有做,不继续了.2009-12-22 //猜数字游戏 //游戏规则: //电脑 ...
最新文章
- java cst gmt_“CST”和“GMT”时间的区别?
- python代码模块与模块之间空1行_Day006|Python语法基础
- 怎么用计算机计算出选手最后得分,WPS技巧:TRIMMEAN函数计算选手得分
- OpenCV3学习(11.7) BRISK特征检测器及BRISK描述符
- HTTP协议详细介绍~超详细
- Visio 2003 Professional
- 合并两个有序数组的三种方法
- excel中实现多条件去重计数
- 如何使用http://paste.ubuntu.com/分享代码
- Pentest Wiki Part5 提权
- photoshop ps 瘦身方法 液化工具
- yarn 出现error An unexpected error occurred错误的解决办法
- 【完全背包】A005_LC_贴纸拼词(dp + 状态压缩)
- 算法设计与分析——算法基础初步了解
- 读懂2014年全球互联网广告新生态
- You probably need to get an updated matplotlibrc file from解决方法
- python实现查询qq是否在线
- 华为畅享z和畅享20pro有什么区别
- 如何在mac里安装vmware,在mac里安装虚拟机,如何注册vmware
- mahout java api_Mahout推荐算法API详解
热门文章
- 安卓手机APP压力monkey测试
- 《TensorFlow+Keras深度学习人工智能实践应用》林大贵著第六章第七章代码
- alter database datafile resize(+释放空间)
- 一篇NDSS的关于跨平面漏洞的论文分析
- Windows 获取已连接WIFI密码
- 【干货】7个面向产品经理的实用工具推荐
- 【Android 实现VideoView开始和播放时缓冲监听动画(监听播放状态)】
- 调制解调器是什么样子_什么是调制解调器?
- Python办公自动化实战 09 | Python-docx库:Python与Word的完美结合_ 如何在Word中生成表格?把Python办公自动化进行到底
- linux hba卡超时时间,如何设置QLogic HBA卡超时参数