【小蜜蜂蓝桥杯笔记】DS18B20温度传感器的使用

news/2024/11/30 14:30:54/

蓝桥杯v20原理图

DS18B20

/***********蓝桥杯onewire驱动************/
#include "onewire.h"//单总线内部延时函数
void Delay_OneWire(unsigned int t)  
{unsigned char i;while(t--){for(i=0;i<12;i++);//此处应该修改延时长度}
}//单总线写操作
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}//单总线读操作
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;Delay_OneWire(1);//此处应加一小延时if(DQ){dat |= 0x80;}	    Delay_OneWire(5);}return dat;
}//DS18B20初始化
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ;     Delay_OneWire(5);return initflag;
}
/**********自定义部分**********/
char rd_temperature(void){//读取整数unsigned char low,high;char temp;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay_OneWire(200);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xBE);	low = Read_DS18B20();high = Read_DS18B20();init_ds18b20();temp=high;temp<<=4;temp=temp | (low>>4);return temp;
}
  • onewire.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H#include "stc15f2k60s2.h"sbit DQ = P1^4;  
//读取温度
char rd_temperature(void);  #endif
  • main.c
#include "stc15f2k60s2.h"
#include "onewire.h"
//缩写
typedef unsigned char uchar;
typedef unsigned int uint;
//数码管部分
code uchar smg_dm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uchar smg_num[]={10,10,10,10,10,10,10,10};
uchar com=0;
//全局变量
uchar temp_c=0;
bit temp_flag = 0;
char temp;
//函数声明
void hc138(uchar n){//38译码器if(n==0) P2=P2&0x1f|0x00;if(n==4) P2=P2&0x1f|0x80;if(n==5) P2=P2&0x1f|0xa0;if(n==6) P2=P2&0x1f|0xc0;if(n==7) P2=P2&0x1f|0xe0;
}
void init(){//初始化hc138(5);P0=0x00;hc138(4);P0=0xff;hc138(0);
}
void dsp(){//数码管显示P0=0xff;//消隐hc138(6);P0=0x01<<com;hc138(7);P0=smg_dm[smg_num[com]];(com==7)?(com=0):(com++);
}
void Timer0Init(void)		//1毫秒@12.000MHz
{AUXR |= 0x80;		//定时器时钟1T模式TMOD &= 0xF0;		//设置定时器模式TL0 = 0x20;		//设置定时初始值TH0 = 0xD1;		//设置定时初始值TF0 = 0;		//清除TF0标志TR0 = 1;	//定时器0开始计时EA = 1;   //总中断使能onET0 = 1;	//定时器0中断使能on
}
void Timer0ser() interrupt 1{temp_c++;if(temp_c==50){temp_c=0;temp_flag=1;}dsp();
}
//主函数
void main(){init();temp = rd_temperature();Timer0Init();while(1){if(temp_flag){temp_flag=0;temp = rd_temperature();}if(temp>=10){smg_num[6] = temp/10;smg_num[7] = temp%10;		}else{smg_num[6]=10;smg_num[7] = temp%10;}}
}

http://www.ppmy.cn/news/368126.html

相关文章

第六章volatile详解

文章目录 volatile修饰的变量有2大特点volatile的内存语义 内存屏障是什么内存屏障分类粗分两种细分四种 什么叫保证有序性happens-before之volatile变量规则JMM就将内存屏障插入策略分为4种规则 volatile特性如何保证可见性说明例子volatile变量的读写过程 为何没有原子性例子…

51单片机DS18B20测温数码管显示例程(Proteus仿真+程序)

编号&#xff1a;19 51单片机DS18B20测温数码管显示例程 功能描述&#xff1a; 本设计由STM32单片机DS18B20温度传感器四段数码管显示模块组成。 1、主控制器是51单片机 2、DS18B20温度传感器采集温度&#xff0c;精度0.1摄氏度 3、数码管显示温度&#xff0c;由三极管驱动。…

【001】基于51单片机的DS18B20温度检测与报警装置的proteus仿真设计

一、设计资料内容&#xff08;私信获取&#xff09; 1. 包含proteus仿真一份&#xff1b; 2. keil源代码一份&#xff1b; 3. 包含基于51单片机的DS18B20温度监测与报警的proteus仿真设计课程报告一份&#xff1b; 4. 包含基于51单片机的DS18B20温度监测与报警的proteus仿真设…

基于51单片机数字温度报警器_DS18B20可调上下限

51单片机数字温度报警器_DS18B20可调上下限 &#xff08;仿真程序原理图&#xff09; 原理图&#xff1a;Altium Designer 仿真版本&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0009 目录标题 51单片机…

76-C语言-输入班级学生的姓名和三科成绩,按总分排名

问题: 输入50分学生的姓名和三科成绩,按降序输出名字和总分,成绩相同的并列排名、 思路: 因为要学生排名,且一个学生有姓名,成绩,以及总分,所以弄一个学生的结构体。有多少学生,就输入该结构体的数组。一个for循环,给每个学生赋值。排序——降序,用冒泡排序…

打印杨辉三角

这个公式&#xff0c;不好算&#xff0c;我觉得还是杨辉三角算起来方便&#xff1a;c#代码如下&#xff1a; double 打印杨辉三角(int n)//n必须是偶数&#xff0c;展开项是n1&#xff0c;中间项是n/2,此处返回中间项的概率202306131722 { //for (int i 0…

【探索 Kubernetes|容器基础进阶篇 系列 4】理解现代云原生时代的引擎

文章目录 系列文章目录&#x1f479; 关于作者一、前言|回顾二、静态和动态视图三、爆火的容器编排工具 Kubernetes 的诞生四、Kubernetes 要解决的问题是什么&#xff1f;五、理解 Kubernetes 全局架构图Master&#xff08;控制节点&#xff09;Node&#xff08;计算节点&…

九号电动车OTA功能

前言&#xff1a;九号电动车相加入了物联网的功能&#xff0c;而车接入网络会有一个好处就是类似于手机系统更新一样可以给车更新系统。OTA&#xff0c;全称是Over-the-AirTechnology&#xff0c;字面意思就是空中升级&#xff0c;是指终端设备通过无线网络下载远程服务器上的升…