单片机控制DS18B20自制简易电子温度计(测试通过)(二)
二、软件部分
#include <reg51.h>
#include <intrins.h>
// 此表为 LED 的字模(共阴极) 0 1 2 3 4 5 6 7 8 9 灭 a b c d e f
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char flag,xiao=0;
unsigned char wendu[2];
sbit DQ=P3^7;
/******************************************************
DS18B20初始化 温度计函数
***********************************************************/
unsigned char INI() //温度计复位
{unsigned char flag,time;
DQ = 1; //先将数据线拉高
for(time=0;time<2;time++); //延时6+2微秒
DQ = 0; //再将数据线从高拉低,要求保持480~960us
for(time=0;time<240;time++); //延时720+2微秒
DQ = 1; //释放数据线
for(time=0;time<12;time++); //延时36+2us
flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(time=0;time<200;time++) ; //延时足够长时间,必须大于480-(36+2) us
return (flag); //返回检测成功标志
}
/******************************************************
DS18B20写一个字节 温度计函数
***********************************************************/
void DS_WRITE_BYTE(unsigned char command)//写入一个字节
{unsigned char time;
unsigned char i=0;
for (i=0; i<8; i++)
{
DQ =1; // 设置初始状态
_nop_(); //等待一个机器周期
DQ=0; //将数据线从高拉低时即启动写时序
_nop_();//拉低DQ至少1us
DQ=command&0x01; //先送低位
for(time=0;time<10;time++) ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1; //释放数据线
for(time=0;time<10;time++);//延时30+2us,写一位至少60us
command=command>>1; //将command中的各二进制位数据右移1位
}
for(time=0;time<4;time++); //稍作延时
}
****************************************************************************************************************
详情请咨询: http://shop108408772.taobao.com/
**************************************************************************************************************
/******************************************************
DS18B20读一个字节 温度计函数
***********************************************************/
unsigned char DS_READ_BYTE()//读入一个字节
{unsigned char i,temp=0,time;
for(i=0;i<=7;i++)
{ DQ =1; // 设置初始状态
_nop_();
temp=temp>>1;
DQ=0; //拉低DQ至少1us
_nop_();
_nop_();
DQ=1; //释放总线
for(time=0;time<2;time++) ;//延时6+2us
if(DQ==1)temp=temp|0x80; //从拉低DQ开始,在15us之内完成数据采样
for(time=0;time<17;time++); //延时51+2us,每读1位至少用60us
}
return temp;
}
/******************************************************
使用中断定时读取数据 温度计函数
***********************************************************/
void timer0() interrupt 1 //使用中断定时读取温度数据
{TL0=0;
TH0=0;
flag=flag+1;
if(flag==16)
{unsigned char time; //中断服务程序
INI();
DS_WRITE_BYTE(0xCC); //跳过读ROM指令
DS_WRITE_BYTE(0x44); //转换温度
for(time=0;time<100;time++); //等待转换完毕
INI();
DS_WRITE_BYTE(0xCC); //跳过读ROM指令
DS_WRITE_BYTE(0xBE); //转换温度
wendu[0]=DS_READ_BYTE(); //低字节
wendu[1]=DS_READ_BYTE(); //高字节
INI();//终止接收数据
flag=0;
}
}
****************************************************************************************************************
详情请咨询: http://shop108408772.taobao.com/
**************************************************************************************************************
/******************************************************
LED动态显示 显示函数
***********************************************************/
void display(unsigned char number,unsigned char shuzi) //动态显示
{unsigned char temp,i;
temp=number<<2;
P2=temp&0x1c;
if(number==1)P1=(LED7Code[shuzi])|0x80;
else
P1=(LED7Code[shuzi])&0x7f;
for(i=0;i<=100;i++);
}
/******************************************************
主函数
***********************************************************/
void main() //使用动态显示将温度显示在LED上
{ unsigned char i;
unsigned char shijian[8]={8,8,0,10,10,10,10,10};
unsigned char temperature;
TMOD=1; //定时器0模式为1,使用的是16位计数器
EA=1; //总中断开启
ET0=1; //定时器中断打开
TR0=1; //定时器开始计数
do{
temperature=(wendu[0]>>4)|((wendu[1]<<4)&0x7f); //将温度整数部分组装好
if(wendu[0]&0x08)xiao=1; //精确到0.5摄氏度
else xiao=0;
shijian[0]=temperature/10; //获取十位
shijian[1]=temperature%10; //获取个位
if(xiao==1)shijian[2]=5; //小数部分
else shijian[2]=0;
//shijian[0]=wendu[0]/100; //测试使用
//shijian[1]=(wendu[0]%100)/10;
//shijian[2]=(wendu[0]%100)%10;
//P0=~wendu[1];
for(i=0;i<=7;i++) //将读到的数据送到LED显示
{display(i,shijian[i]);
}
}while(1);
}
****************************************************************************************************************
详情请咨询: http://shop108408772.taobao.com/
**************************************************************************************************************
三、调试中遇到的问题
1>延时函数使用如下方式:
unsigned char i;
for(i=0;i<n;i++); //本句实现延时 3*n+2 us,我通过断点调试验证(晶振为12MHZ)
2>查看具体延时时间工具的使用
通过在keil中设置好晶振,在要测试处设置断点,在下一行设置断点,开启调试,使用快捷键F5进行查看时间。使用后断点处运行时间减去该断点处时间即为实际该句运行时间。
3>注意找写1与写0时序的共同部分时序,按此缩减程序
四、测试结果
****************************************************************************************************************
详情请咨询: http://shop108408772.taobao.com/
**************************************************************************************************************
单片机控制DS18B20自制简易电子温度计(测试通过)(二)相关推荐
- 单片机控制DS18B20自制简易电子温度计(测试通过)(一)
花了一天多时间弄电子温度计,关键问题还是出现在延时不准确,导致不能正常工作.没有严格按照时序中要求的时序,也让我吃了不少苦头.在这里,简单向大家介绍下常用的温度芯片DS18B20. 一.硬件部分 1& ...
- 单片机18b20c语言程序,AVR单片机控制DS18B20的示例C程序
原标题:AVR单片机控制DS18B20的示例C程序 #include #include #include #include unsigned char data_H, data_L,wendu; un ...
- 使用STM8单片机+NTC热敏电阻自制简易温度巡检仪
最近在测试设备的时候需要监测设备的温度,平常测试时都是通过红外热成像仪测试,然后手动记录数据.这样测试的话工作量比较大,需要几分钟就记录一次数据.于是想着能不能用单片机做一个测试温度的装置,用电脑 ...
- arduino uno r3单片机封装图_单片机控制的OLED简易电子表原型
在多年以前,我刚开始学单片机的时候,就想着要用51单片机加上0.96英寸的OLED DIY一个电子表,但是可惜当时水平有限,没能实现.现在我早已玩转了STM32,准备向ARM9进发,突然想到了当年的想 ...
- 单片机控制雷达测距模块HC-SR04测量距离(通过测试)
雷达测距模块在小车防撞中应用比较不错,在这篇文章中简单介绍下雷达测距模块HC-SR04的使用. 一.硬件介绍 引脚四个,分别为VCC.TRIG.ECHO.GND 单片机控制引脚TRIG:用于给出促发测 ...
- 51单片机温度传感器DS18B20
51单片机温度传感器DS18B20 实现功能 插上DS18B20温度传感器,数码管显示检测的温度值 单片机型号:STC89C52 DS18B20介绍 1.DS18B20简介 DS18B20 是由 DA ...
- 【Proteus仿真】数字温度计,利用 Mega16 控制 DS18B20 ,若温度达到设定阈值,即可报警提醒(用串口控制停止报警、用键盘输入改变报警阈值)
(代码在文末) 工程文件和代码下载链接如下(求求下载前点个赞支持一下吧QAQ,博主自己做出来这个也hin累的) 链接: https://pan.baidu.com/s/1-aRZjyRZodzLcw8 ...
- 51单片机控制SG90舵机、MG90S舵机
舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化.也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应 ...
- 基于51单片机的DS18B20温度控制加热降温系统设计
基于51单片机的DS18B20温度控制加热降温系统设计 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 概述 7.3 国内外研究 ...
最新文章
- (一)win7下cocos2d-x 21 + vs2010
- 2006关注IT技术
- 【Java集合系列四】HashSet和LinkedHashSet解析
- 专家:中国房地产泡沫崩溃时间就是今明二年
- how is SAP OData metadata read from CDS view via SADL
- 前端学习(3348):数组方法的运用和数值
- 【Codeforces - 864D】Make a Permutation!(贪心,字典序)
- Spring Jpa 返回自定义实体
- SpringBoot系列九:SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)
- 生成下面的模块时,启用了优化或没有调试信息
- 软键盘遮挡住popupWindow问题
- C++引用(作为函数参数和返回值)
- java中的jQuery与Ajax的应用,菜鸟教程
- 零基础入门学习的UG模具设计技巧
- 执行throw后 后面代码还会执行吗?
- linux usb lpt,Linux安装Composer
- api系列聚美优品的知识点
- 3ds Max发生闪退怎么办?
- spring beancopier Cannot invoke “Object.getClass()“ because “cause“ is null异常处理
- RNN代码简单实现(周杰伦歌词示例)