爱易族 - DS18B20
type: channel
link: http://www.yizu.org/tag/DS18B20/
items: STC8G1K08A+DS18B20测温系统

STC8G1K08A+DS18B20测温系统
type: item
date: 2022-07-31T19:14:00+08:00
description: 关于驱动DS18B20，关键是时序，延时要准确，随便网上抄了个代码（https://blog.csdn.net/Ele_PPP/article/details/88712895），改了下撸了一个温度计。之前1个STC8G1K08A片子有问题，搞了好几天没成，换了一个片子立马好了。又撸了一个外壳，看起来有点像样了。外观如下。代码是11.0592MHz时钟频率下的，屏幕采用0.91寸OLED，分辨率128*32。Keil C51编译。main.c#include <STC8G.H> #include <intrins.h> #include "oled.h" #include "stdio.h" #include "string.h" sbit DS18B20_DQ = P5^4; //DS18B20 IO设置 unsigned char flag_temper = 0; //定义变量 void Delay_1ms(unsigned int ms); unsigned int Get_temp(void); void main() { unsigned int temp; char str[10]; unsigned int temp1; unsigned int temp2; unsigned int theLocation; P3M0=0; P3M1=0; P5M0=0; P5M1=0; OLED_Init(); //初始化OLED OLED_Clear(); OLED_On(); Delay_1ms(2000); OLED_Clear(); Delay_1ms(1000); while (1) { OLED_ShowCHinese(0, 0, 0); //温 OLED_ShowCHinese(16, 0, 1); //度 OLED_ShowCHinese(32, 0, 2); //计 //OLED_ShowString(56, 0, "YIZU.ORG"); temp = Get_temp(); temp1=temp/10; temp2=temp-temp1*10; if(flag_temper==1){ sprintf(str, "Temp:-%d.%d", temp1,temp2); } else{ sprintf(str, "Temp:%d.%d", temp1,temp2); } OLED_ShowString(0, 2, str); theLocation=strlen(str)*8; OLED_ShowCHinese(theLocation+2, 2, 3); //℃ Delay_1ms(500); } } //**************************************************** //DS18B20延时函数 //**************************************************** void delay2us(void) { unsigned char i; _nop_(); i = 5; while (--i); } void delay10us(void) { unsigned char i; i = 35; while (--i); } void delay60us(void) { unsigned char i; _nop_(); i = 219; while (--i); } void delay500us(void) { unsigned char i, j; _nop_(); _nop_(); i = 8; j = 43; do { while (--j); } while (--i); } void Delay_1ms(unsigned int ms) //@11.0592MHz { unsigned char i, j; while (--ms) { _nop_(); i = 11; j = 190; do { while (--j) ; } while (--i); } } //**************************************************** //DS18B20初始化 //**************************************************** bit DS18B20_Init() { bit Flag_exist = 1; //初始化结果标志 DS18B20_DQ = 1; //单片机管脚电平拉高，以释放总线 delay2us(); //延时>1us，执行2us DS18B20_DQ = 0; //单片机电平拉低以启动DS18B20初始化 delay5…