文档介绍:梧州学院单片机课程设计报告题目: 温度传感器院(系): 信息与电子信息工程专业班级: 12 物联网工程班学生姓名: 谢晋峰学号: 201200210026 DS18B20 温度传感器一、目的通过 DS18B20 温度传感器及时采集当前周边环境的温度值, 并在数码管上显示。二、所需器材一个单片机, 一个三八译码器和 6个8 位数码管, 一个 Ds18b2 0 温度传感器。三、内容与步骤系统原理框架图开始主函数温度数值转换 18B20 采集温度数码管显示主函数流程图入口 M ain() LcdDisplay() T 1 Ds18b20ReadTemp() T emp<0 DisplayData[0]=0x 40 T em=~(temp-1) T p=tem DisplayData[0]= 0x00 T p=temp T emp=tp**1 00+ T FT mp=tp** 100+ 开始 LcdDisplay() 函数流程图 Ds18b20ReadTemp() 函数流程图 X X: DisplayData[1] = DIG_CODE[temp / 10000]; DisplayData[2] = DIG_CODE[temp % 10000 / 1000]; DisplayData[3] = DIG_CODE[temp % 1000 / 100] | 0x80; DisplayData[4] = DIG_CODE[temp % 100 / 10]; DisplayData[5] = DIG_CODE[temp % 10]; DigDisplay(); DigDisplay() 结束(一)本设计内容分为两大部分: 1. DS18B20 模块。 DS18B20 感受到当前的温度值并将其转化为数字信号存储在 ROM 中,然后单片机读取 18B20 中的温度信号。 2. 数码管显示模块。单片机将获取的温度信息按符号为、百位、十位、个位、十分位、百分位,分割,并保存在六个不同的变量中, 然后让 DS138 译码器逐位控制数码管显示对应的数值。(二)步骤如下: 1. 初始化 DS18B20 2. 单片机向 DS18B20 写入跳过 ROM 命令,温度转化命令,温度寄存器命令 3. 单片机读取 18B20 两个温度寄存器中的温度值 4. 单片机将获取的温度值的符号、百位、十位、个位、十分位、百分位分别存在数组的对应元素中 5. 通过 38 译码器动态扫描选定 6 个数码管, 对应显示温度符号、百位、十位、个位、十分位、百分位的数值(三) 本设计中 18B20 温度传感器的时序图如下: 四、代码#include<> #define uchar unsigned char #define uint unsigned int /* 在开头声明全局函数,待会就可以直接调用*/ void Delay1ms(uint ); uchar Ds18b20Init(); void Ds18b20WriteByte(); uchar Ds18b20ReadByte(); void Ds18b20ChangTemp(); void (); int Ds18b20ReadTemp(); sbit DSPORT=P3^7; // 声明 18B20 使用的引脚 void Delay1ms(uint y) // 延时函数{ uint x; for( ; y>0; y--) { for(x=110; x>0; x--); }} uchar Ds18b20Init() //18B20 的初始化{ uchar i; DSPORT = 0; // 拉低总线 i= 70; while(i--); // 延时 680 微秒以上 DSPORT = 1; // 释放总线 i= 0; while(DSPORT); // 一直等待 18B20 响应} void Ds18b20WriteByte(uchar dat) /*向 18B2 0 中写一个字节的数, 从低位开始*/ { uchar i, j; for(j=0; j<8; j++) { DSPORT = 0; i++; DSPORT = dat & 0x01; //与1 相与的数等于其本身 i=6; while(i--); DSPORT = 1; dat >>= 1; }} //从 18B20 中读取一个字节的数 uchar Ds18b20ReadByte() { uchar byte, bi; uchar i, j; for(j=8; j>0; j--) { DSPORT = 0; // 将总线拉低 1 微秒以上