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 #endifdelay.h
#ifndef _DELAY_H_ #define _DELAY_H_extern void delay(unsigned int x); #endifds18b20.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(); #endiflcd1602.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单片机——温度传感器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginix配置某个域名跳转到另一个域名
- 下一篇: (附源码)springboot+mysq