C51单片机——温度传感器
实现效果如图:
main.c
#include<string.h>
#include"typedef.h"
#include"lcd1602.h"
#include"ds18b20.h"
uchar str1[]={"Test by Ds18b20."};
uchar str2[11]={"Temp: "};void main()
{uchar i;lcd1602_init();while(1){DS18B20_Read_Temperature();Temperature_Convert();lcd1602_write_cmd(0x80);for(i=0;i<strlen(str1);i++){lcd1602_write_dat(str1[i]);}lcd1602_write_cmd(0xC0);for(i=0;i<11;i++){lcd1602_write_dat(str2[i]);}}
}
lcd1602.c
#include<reg52.h>
#include"delay.h"
#include"typedef.h"
#include"lcd1602.h"
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^7;
sbit P07=P0^7;
bit lcd1602_read_status()
{uchar temp;RW=1;delay(2);RS=0;delay(2);EN=1;delay(2);temp=P0;delay(2);EN=0;delay(2);return (bit)(temp&0x80);
}void lcd1602_write_cmd(uchar cmd)
{while(lcd1602_read_status()!=0);RW=0;delay(2);RS=0;delay(2);EN=1;delay(2);P0=cmd;delay(2);EN=0;delay(2);
}void lcd1602_write_dat(uchar dat)
{while(lcd1602_read_status()!=0);RW=0;delay(2);RS=1;delay(2);EN=1;delay(2);P0=dat;delay(2);EN=0;delay(2);
}void lcd1602_init()
{lcd1602_write_cmd(0x38);lcd1602_write_cmd(0x0c);lcd1602_write_cmd(0x01);lcd1602_write_cmd(0x06);delay(200);
}
#include<reg52.h>
#include<INTRINS.H>
#include"typedef.h"
#include"delay.h"
#include"ds18b20.h"
sbit DQ=P3^7;
uint tvalue;
uchar tflag;
extern uchar str1[];
extern uchar str2[11];void DS18B20_Reset()
{DQ=1;_nop_();DQ=0;delay(90);DQ=1;while(DQ);while(!DQ);
}void DS18B20_Write_Byte(uchar dat)
{uchar i;for(i=0;i<8;i++){DQ=0;delay(1);DQ=(bit)(dat&0x01);delay(6);DQ=1;delay(1);dat=dat>>1;}
}
unsigned char DS18B20_Read_Byte()
{uchar i,temp=0;for(i=0;i<8;i++){temp=temp>>1;DQ=0;_nop_();_nop_();DQ=1;delay(2);if(DQ)temp=temp|0x80;delay(6);DQ=1;delay(1);}return temp;
}int DS18B20_Read_Temperature()
{uchar temp_low,temp_high;DS18B20_Reset();DS18B20_Write_Byte(0xcc);DS18B20_Write_Byte(0x44);while(!DQ);DS18B20_Reset();DS18B20_Write_Byte(0xcc);DS18B20_Write_Byte(0xbe);temp_low=DS18B20_Read_Byte();temp_high=DS18B20_Read_Byte();DS18B20_Reset();tvalue=temp_high;tvalue=(tvalue<<8)|temp_low;if(tvalue<=0x07ff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*0.625;return(tvalue);
}void Temperature_Convert()
{str2[6]=(uchar)(tvalue/1000+'0');str2[7]=(uchar)(tvalue%1000/100+'0');str2[8]=(uchar)(tvalue%100/10+'0');str2[9]='.';str2[10]=(uchar)(tvalue%10+'0');if(tflag==0)str2[5]='\0';elsestr2[5]='-';if(str2[6]=='\0'){str2[6]='\0';if(str2[7]=='0'){str2[7]='\0';}}
}
delay.c
#include"typedef.h"
void delay(uint x)
{while(--x);
}
typedef.h
#ifndef _TYPEDEF_H_
#define _TYPEDEF_H_#define uchar unsigned char#define uint unsigned int
#endif
delay.h
#ifndef _DELAY_H_
#define _DELAY_H_extern void delay(unsigned int x);
#endif
ds18b20.h
#ifndef _DS18B20_H_
#define _DS18B20_H_extern void DS18B20_Reset();extern void DS18B20_Write_Byte(uchar dat);extern unsigned char DS18B20_Read_Byte();extern int DS18B20_Read_Temperature();extern void Temperature_Convert();
#endif
lcd1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_extern bit lcd1602_read_status();extern void lcd1602_write_cmd(uchar cmd);extern void lcd1602_write_dat(uchar dat);extern void lcd1602_init();
#endif
> 单片机读DSI18B20所测得的温度流程
使用单片机读DS18B20所测得的温度的流程:
单片机先向DS18B20发出启动测量命令,DS18B20收到单片机向DS18B20此命令后启动温度测量,并将测量结果保存在RAM的第0、1字节:随后单片向DS18B20发出读命令,DS18B20收到此命令后将RAM的数据从Byte0字节开始逐字节送出,此时单片机接收到的前两个字节内容即为测量所得温度值。
启动温度测量可以细分为以下步骤。
(1)复位DS18B20。
(2)单片机向DS18B20发送ROM指令0x55,匹配每个DS18B20独有的64位序列号。不过如果总线上只有一个DS18B20,则不需匹配序列号,写代码时直接写ROM命令0xcc跳过。
(3)单片机向DS18B20发送RAM指令0x44,启动DS18B20进行温度测量。
(4)等待温度测量完成。
读温度步骤可以细分为以下步骤。
(1)复位DS18B20。
匹配每个DSI8B20独有的64位序列
(2)单片机向DS8B820发送ROM指s值配序列号,写代码时直接写ROM的令号。不过如果总线上只有一个DS820则不需匹配序列号,写代码时直接写ROM命令0xcc跳过。
(3)单片机向DS18B20发送读RAM指令0xBE,收到此命令后DS18B20将RAM中的数据从字节0~8,一个一个送出,如果在此过程中要停止读操作,必须对DS1820进行复位。
C51单片机——温度传感器相关推荐
- c51单片机万年历模拟,12864LCD屏显示实时温度与时间
前言 c51单片机万年历模拟期末作品,用到了温度传感模块及12864液晶显示模块及矩阵键盘模块及复位电路,电源模块,晶振模块,可在12864屏上显示实时温度与时间,本人自己做的期末作品,仅供同学们研究 ...
- 【C51开发应用】基于C51单片机开发的循迹灭火机器人
基于C51单片机开发的循迹灭火机器人 一.作品摘要 二.系统设计步骤 三.方案设计 3.1 小车主体设计 3.1.1 购买玩具小车进行改装 3.1.2 自己设计小车主体结构 3.2 电 ...
- 智能温度系统(C51+DS18B20温度传感器+LM016L显示屏)
单片机课程设计,C51+DS18B20温度传感器+LM016L显示屏 重点在于两个外设的时序控制 模块化的设计结构清晰明了 一.题目 温度测量系统的设计 二.要求 1.温度测量范围:-55℃ ~ 12 ...
- 二进制转十进制在c51单片机中的问题
提问:二进制转十进制在c51单片机中的问题在c51中,比如我unsigned int a,来获取当前温度传感器的值,此时我获得的是无符号的二进制,那么我要将次数据,发送给上位机(电脑),但是发送的时候 ...
- c语言编程流水灯与交通灯实验,C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟.doc...
C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟 学 号: 班 级: 自动化10班 姓 名: 张 指导老师: 胡 2012.12 单片机核心板实验要求 流水灯实验 实验目的: 简单I/O引 ...
- C51单片机学习思维导图
C51单片机学习总结: 图片链接 由于原稿丢失,只有图片链接
- C51单片机————总线与系统扩展
C51单片机----总线与系统扩展 Created with Raphaël 2.1.2张三张三李四李四四哥,IO口不够用怎么办?你可以进行系统扩展!什么鬼?那是什么东西?...看书去 1.引文 前面 ...
- C51单片机————串行接口
C51单片机----串行接口 Created with Raphaël 2.1.2张三张三李四李四嘿,四哥,我最近在学习串行接口?想了想!有我啥事嗯!牛逼我有点不懂?哪里不懂哇额! 都不懂... 1. ...
- C51单片机————汇编与C语言
C51单片机-----汇编与C语言 如有错误,请留言指正!!!
最新文章
- vue 源码学习(二) 实例初始化和挂载过程
- 算法习题---线性表之单链表逆序打印
- python2的idle打不开了
- SAP Spartacus config-initializer.service.ts get isStable属性失败的调试
- php中时差怎么改,我的PHP时差功能可以改进吗?
- win7 管理iphone日历_大师给你传授win7系统安装桌面日历的途径
- 软考计算机英语考题,《全国计算机软考网管英语试题及答案.doc
- python网络编程之黏包问题
- java输入年月输出日历_java输入年份打印该年份的年历
- java web 调度_javaweb车辆调度信息管理平台
- delphi acropdf打印多个pdf_将多个PDF文件整合成一个文件
- 接口测试基础——第6篇unittest模块(三)
- 最小生成树 无根树转有根树 树形动态规划
- 关于 Bandizip 每次解压都催你更新
- ESP32开发2——新建项目
- mtk智能机平台LCM,CTP的ESD防护处理
- OpenVPN 技术支持
- 【演武厅】表达式求值实例
- java使用循环输出等腰三角
- 阿里巴巴2016算法岗实习招聘(西安)在线笔试整理