#include

#include

#define                DATA        P1      //1602驱动端口

//ROM操作命令

#define                 READ_ROM                       0x33                    //读ROM

#define                 SKIP_ROM                       0xCC                    //跳过ROM

#define                 MATCH_ROM               0x55                    //匹配ROM

#define                 SEARCH_ROM              0xF0                    //搜索ROM

#define                 ALARM_SEARCH            0xEC                    //告警搜索

//存储器操作命令

#define                 ANEW_MOVE                     0xB8                    //重新调出E^2数据

#define                 READ_POWER              0xB4                    //读电源

#define                 TEMP_SWITCH             0x44                    //启动温度变换

#define                 READ_MEMORY             0xBE                    //读暂存存储器

#define                 COPY_MEMORY             0x48                    //复制暂存存储器

#define                 WRITE_MEMORY            0x4E                    //写暂存存储器

//数据存储结构

typedef struct tagTempData

{

unsigned char                                         btThird;                                                        //百位数据

unsigned char                                         btSecond;                                                        //十位数据

unsigned char                                         btFirst;                                                        //个位数据

unsigned char                                         btDecimal;                                                        //小数点后一位数据

unsigned char                                        btNegative;                                                        //是否为负数

}TEMPDATA;

TEMPDATA m_TempData;

//引脚定义

sbit                                                         DQ = P2^7;                                                        //数据线端口

sbit                 RS=                P2^0;

sbit                 RW=                P2^1;

sbit                 E=                P2^2;

//DS18B20序列号,通过调用GetROMSequence()函数在P1口读出(读8次)

const unsigned char code ROMData1[8] = {0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7};        //U1

const unsigned char code ROMData2[8] = {0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E};        //U2

const unsigned char code ROMData3[8] = {0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9};        //U3

const unsigned char code ROMData4[8] = {0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0};        //U4

const unsigned char code ROMData5[8] = {0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52};        //U5

const unsigned char code ROMData6[8] = {0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65};        //U6

const unsigned char code ROMData7[8] = {0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C};        //U7

const unsigned char code ROMData8[8] = {0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B};        //U8

//判断忙指令

void Busy()

{

DATA = 0xff;

RS = 0;

RW = 1;

while(DATA & 0x80)

{

E = 0;

E = 1;

}

E = 0;

}

//写指令程序

void WriteCommand(unsigned char btCommand)

{

Busy();

RS = 0;

RW = 0;

E = 1;

DATA = btCommand;

E = 0;

}

//写数据程序

void WriteData(unsigned char btData)

{

Busy();

RS = 1;

RW = 0;

E = 1;

DATA = btData;

E = 0;

}

//清屏显示

void Clear()

{

WriteCommand(1);

}

//初始化

void Init()

{

WriteCommand(0x0c);        //开显示,无光标显示

WriteCommand(0x06);        //文字不动,光标自动右移

WriteCommand(0x38);        //设置显示模式:8位2行5x7点阵

}

//显示单个字符

void DisplayOne(bit bRow, unsigned char btColumn, unsigned char btData, bit bIsNumber)

{

if (bRow)                 WriteCommand(0xc0 + btColumn);

else                      WriteCommand(0x80 + btColumn);

if (bIsNumber)         WriteData(btData + 0x30);

else                   WriteData(btData);

}

//显示字符串函数

void DisplayString(bit bRow, unsigned char btColumn, unsigned char *pData)

{

while (*pData != '\0')

{

if (bRow) WriteCommand(0xc0 + btColumn);        //显示在第1行

else            WriteCommand(0x80 + btColumn);        //显示在第0行

WriteData(*(pData++));                                                //要显示的数据

btColumn++;                                                                        //列数加一

}

}

//延时16us子函数

void Delay16us()

{

unsigned char a;

for (a = 0; a < 4; a++);

}

//延时60us子函数

void Delay60us()

{

unsigned char a;

for (a = 0; a < 18; a++);

}

//延时480us子函数

void Delay480us()

{

unsigned char a;

for (a = 0; a < 158; a++);

}

//延时240us子函数

void Delay240us()

{

unsigned char a;

for (a = 0; a < 78; a++);

}

//延时500ms子函数

void Delay500ms()

{

unsigned char a, b, c;

for (a = 0; a < 250; a++)

for (b = 0; b < 3; b++)

for (c = 0; c < 220; c++);

}

//芯片初始化

void Initialization()

{

while(1)

{

DQ = 0;

Delay480us();                         //延时480us

DQ = 1;

Delay60us();                        //延时60us

if(!DQ)                                  //收到ds18b20的应答信号

{

DQ = 1;

Delay240us();                //延时240us

break;

}

}

}

//写一个字节(从低位开始写)

void WriteByte(unsigned char btData)

{

unsigned char i, btBuffer;

for (i = 0; i < 8; i++)

{

btBuffer = btData >> i;

if (btBuffer & 1)

{

DQ = 0;

_nop_();

_nop_();

DQ = 1;

Delay60us();

}

else

{

DQ = 0;

Delay60us();

DQ = 1;

}

}

}

//读一个字节(从低位开始读)

unsigned char ReadByte()

{

unsigned char i, btDest;

for (i = 0; i < 8; i++)

{

btDest >>= 1;

DQ = 0;

_nop_();

_nop_();

DQ = 1;

Delay16us();

if (DQ) btDest |= 0x80;

Delay60us();

}

return btDest;

}

//序列号匹配

void MatchROM(const unsigned char *pMatchData)

{

unsigned char i;

Initialization();

WriteByte(MATCH_ROM);

for (i = 0; i < 8; i++) WriteByte(*(pMatchData + i));

}

//得到64位ROM序列(在P1口显示,必须与Proteus联调且在单步调试下才能得到)

/*void GetROMSequence()

{

unsigned char i;

Initialization();

WriteByte(READ_ROM);

for (i = 0; i < 8; i++)

P1 = ReadByte();

}*/

//读取温度值

TEMPDATA ReadTemperature()

{

TEMPDATA TempData;

unsigned int iTempDataH;

unsigned char btDot, iTempDataL;

static unsigned char i = 0;

TempData.btNegative = 0;                                                //为0温度为正

i++;

if (i == 9) i = 1;

Initialization();

WriteByte(SKIP_ROM);                                                        //跳过ROM匹配

WriteByte(TEMP_SWITCH);                                                        //启动转换

Delay500ms();                                                                          //调用一次就行

Delay500ms();

Initialization();

//多个芯片的时候用MatchROM(ROMData)换掉WriteByte(SKIP_ROM)

switch (i)

{

case 1 : MatchROM(ROMData1); break;                        //匹配1

case 2 : MatchROM(ROMData2); break;                        //匹配2

case 3 : MatchROM(ROMData3); break;                        //匹配3

case 4 : MatchROM(ROMData4); break;                        //匹配4

case 5 : MatchROM(ROMData5); break;                        //匹配5

case 6 : MatchROM(ROMData6); break;                        //匹配6

case 7 : MatchROM(ROMData7); break;                        //匹配7

case 8 : MatchROM(ROMData8); break;                        //匹配8

}

//WriteByte(SKIP_ROM);                                                        //跳过ROM匹配(单个芯片时用这句换掉上面的switch)

WriteByte(READ_MEMORY);                                                        //读数据

iTempDataL = ReadByte();

iTempDataH = ReadByte();

iTempDataH <<= 8;

iTempDataH |= iTempDataL;

if (iTempDataH & 0x8000)

{

TempData.btNegative = 1;

iTempDataH = ~iTempDataH + 1;                                //负数求补

}

//为了省去浮点运算带来的开销,而采用整数和小数部分分开处理的方法(没有四舍五入)

btDot = (unsigned char)(iTempDataH & 0x000F);        //得到小数部分

iTempDataH >>= 4;                                                                //得到整数部分

btDot *= 5;                                                                         //btDot*10/16得到转换后的小数数据

btDot >>= 3;

//数据处理

TempData.btThird   = (unsigned char)iTempDataH / 100;

TempData.btSecond  = (unsigned char)iTempDataH % 100 / 10;

TempData.btFirst   = (unsigned char)iTempDataH % 10;

TempData.btDecimal = btDot;

return TempData;

}

//数据处理子程序

void DataProcess()

{

m_TempData = ReadTemperature();

if (m_TempData.btNegative) DisplayOne(1, 6, '-', 0);

else DisplayOne(1, 6, m_TempData.btThird, 1);

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

多点温度采集系统设计c语言,单片机多点(八路)DS18B20温度采集系统仿真与源码...相关推荐

  1. 基于51单片机的简易数字计算器Proteus仿真(源码+仿真+全套资料)

     资料编号:115 全套资料齐全,功能说明: 该计算器系统51 系列的单片机进行的数字计算器系统设计,可以完成计算器的键盘输入, 进行加. 减.乘.除的简单四则运算,并在 LCD屏幕上相应的显示结果. ...

  2. 基于stm32单片机的智能鱼缸设计(实物+原理图+源码)

    资料编号:059     功能如下: 1.采用stm32单片机作为控制CPU,OLED显示万年历和温度 2.智能加热.加氧.加二氧化碳 3.采用智能自动开灯 具体功能请看下方演示视频 59-基于stm ...

  3. C语言期末大作业-学生成绩管理系统(完整源码+设计报告)

    C语言-学生成绩管理系统 一.学生成绩管理系统源码(完整) 二.程序设计报告 1.课程设计目的 2.课程设计任务与要求: 4.课程设计成果(运行截图) 5.课程设计心得 一.学生成绩管理系统源码(完整 ...

  4. C语言打印字符串的所有排列组合(附完整源码)

    C语言打印字符串的所有排列组合 字符串的所有排列问题 C语言打印字符串的所有排列组合的完整源码(定义,实现,main函数测试) 字符串的所有排列问题 示例:ABC的排列是ABC,ACB,BCA,BAC ...

  5. 基于stm32单片机的空气质量检测仿真(仿真+源码+全套资料)

    资料编号:072 可以通过STM32的ADC检测当前的空气质量,LCD1602显示,并且可以自动控制风扇排气,也可以设置为手动排气.包含全套资料,下面是视频演示: 72-基于stm32单片机的空气质量 ...

  6. 国际多语言出海商城返佣产品自动匹配订单源码

    国际多语言出海商城返佣产品自动匹配订单源码 8国多语言出海拼单商城 此网站是很多巴西客户定制的原型,已投放运营符合当地本地化 多语言商城返利返佣投资理财派单自带余额宝, 采取全新支付端口,后台语音提醒 ...

  7. C语言——史上最全通讯录讲解(附源码)

    C语言--史上最全通讯录讲解(附源码) 一.开始界面的打印 二.对六大板块进行定义操作 三.对联系人进行初始化 四.对通讯录进行初始化 4.1动态版本 4.2静态版本 五.通讯录六大功能的具体实现 5 ...

  8. C语言实现的一个小学生算数自测系统源码分享

    C语言实现的一个小学生算数自测系统源码分享 #include <stdio.h> //标准输入输出 #include <stdlib.h> //用于对程序进行退出操作 #inc ...

  9. 基于51单片机的自动售货机Proteus仿真(源码+仿真+设计报告)

    资料编号:137 视频讲解: 137-基于51单片机的自动售货机Proteus仿真(源码+仿真+设计报告) 功能介绍: 基本原理:通过矩阵键盘来选择货物的种类与数量过后自动售货机提示投币.自动售货机的 ...

最新文章

  1. RDKit | 基于神经网络的溶解度预测和回归分析
  2. 从GNOME切换到KDE了
  3. 使用phpMyAdmin时出现PHP 5.3+is required的解决方案
  4. Spring思维导图(MVC篇)
  5. 122. Leetcode 647. 回文子串 (动态规划-子序列问题)
  6. 全球及中国汽车紧急呼叫终端行业运营模式及未来投资方向建议报告2022版
  7. [云炬创业基础笔记]第二章创业者测试8
  8. linux清空redis命令,使用Linux管道批量删除Redis的key
  9. 手机上python编程工具3和3h有区别吗_Python3.5内置模块之time与datetime模块用法实例分析...
  10. Oracle 11g 频繁遭遇 CheckPoint incomplete问题分析(直播预告)
  11. 机器人动力学与控制_大负载协作机器人难关怎么攻克?3大技术细节解析!
  12. python如何删除对象属性_如何销毁python中属性中的对象?
  13. 膨胀、腐蚀、开、闭运算——数字图像处理中的形态学
  14. MATLAB与高等数学--dsolve命令
  15. 泛微OA-流程存储数据说明(表单主表+明细表)
  16. 高通---IGV:从安装到使用
  17. 容斥原理和概率与数学期望
  18. 可ping通外网,浏览器却访问不了外部网络
  19. 你已经是智能机器人,该上岗新基建了
  20. 微生物16S测序数据的正确打开方式

热门文章

  1. HTTP 请求工具类-RestTemplate
  2. Linux多线程矩阵,操作系统实验(进程)多线程实现矩阵乘法
  3. WINS服务器工作原理
  4. 一些有趣的B+树优化实验
  5. HVM,Hexagon处理器的虚拟器解决方案
  6. Linux下安装rdesktop远程windows
  7. 【oracle工具报错】plsqldev客户端中的PL/SQL美化器文件的规则不能用的郁闷事(因注释放错位置)
  8. 20种拉新方式!——平台运营入门(一)
  9. 大揭秘:绝人生死之力量的“禅定”是什么?
  10. Docker换源-阿里源,中科大源,网易源