51单片机多点温度采集系统程序清单.docx

上传人:牧羊曲112 文档编号:3059742 上传时间:2023-03-10 格式:DOCX 页数:8 大小:38.85KB
返回 下载 相关 举报
51单片机多点温度采集系统程序清单.docx_第1页
第1页 / 共8页
51单片机多点温度采集系统程序清单.docx_第2页
第2页 / 共8页
51单片机多点温度采集系统程序清单.docx_第3页
第3页 / 共8页
51单片机多点温度采集系统程序清单.docx_第4页
第4页 / 共8页
51单片机多点温度采集系统程序清单.docx_第5页
第5页 / 共8页
亲,该文档总共8页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《51单片机多点温度采集系统程序清单.docx》由会员分享,可在线阅读,更多相关《51单片机多点温度采集系统程序清单.docx(8页珍藏版)》请在三一办公上搜索。

1、51单片机多点温度采集系统程序清单#include #include #define DATA P1 /1602驱动端口 /ROM操作命令 #define READ_ROM 0x33 /读ROM #define SKIP_ROM 0xCC /跳过ROM #define MATCH_ROM ROM #define SEARCH_ROM ROM #define ALARM_SEARCH 搜索 /存储器操作命令 #define ANEW_MOVE 调出E2数据 #define READ_POWER 源 #define TEMP_SWITCH 温度变换 #define READ_MEMORY 存存储器

2、 #define COPY_MEMORY 暂存存储器 #define WRITE_MEMORY 存存储器 /数据存储结构 typedef struct tagTempData unsigned char btThird; unsigned char btSecond; 数据 unsigned char btFirst; unsigned char btDecimal; 点后一位数据 unsigned char btNegative; 数 TEMPDATA; TEMPDATA m_TempData; 0x55 0xF0 0xEC 0xB4 0x44 0xBE 0x48 0x4E /匹配 /搜索

3、/告警 /重新 /读电 /启动 /读暂 /复制 /写暂/百位数据 /十位/个位数据 /小数/是否为负 0xB8 /引脚定义 sbit sbit RS= sbit RW= sbit E= P20; P21; P22; DQ = P27; /数据线端口 /DS18B20序列号,通过调用GetROMSequence函数在P1口读出(读8次) const unsigned char code ROMData18 = 0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7; /U1 const unsigned char code ROMData28 = 0x28,

4、 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E; /U2 const unsigned char code ROMData38 = 0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9; /U3 const unsigned char code ROMData48 = 0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0; /U4 const unsigned char code ROMData58 = 0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x

5、00, 0x52; /U5 const unsigned char code ROMData68 = 0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65; /U6 const unsigned char code ROMData78 = 0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C; /U7 const unsigned char code ROMData88 = 0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B; /U8 /判断忙指令 void Busy DA

6、TA = 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);

7、/初始化 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 (bIsNumb

8、er) 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+; /列数加一 /延时1

9、6us子函数 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

10、 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; DQ = 1; /延时480us Delay60us; if(!DQ) DQ = 1; Delay240us; break; /延时60us /收到ds18b20的应答信号 /延时240us /写一个字节(从低位开始写) void WriteByte(unsigned char btData) unsigned char

11、 i, btBuffer; for (i = 0; i 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 = 1; DQ = 0; _nop_; _nop_; DQ = 1; Delay16us; if (DQ) btDest |= 0x80; Delay60us; return btDest; /序列号匹

12、配 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 =

13、ReadByte; */ /读取温度值 TEMPDATA ReadTemperature TEMPDATA TempData; unsigned int iTempDataH; unsigned char btDot, iTempDataL; static unsigned char i = 0; TempData.btNegative = 0; i+; if (i = 9) i = 1; Initialization; WriteByte(SKIP_ROM); WriteByte(TEMP_SWITCH); Delay500ms; Delay500ms; Initialization; /为

14、0温度为正 /跳过ROM匹配 /启动转换 /调用一次就行 /多个芯片的时候用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

15、: MatchROM(ROMData6); break; /匹配6 case 7 : MatchROM(ROMData7); break; /匹配7 case 8 : MatchROM(ROMData8); break; /匹配8 /跳过ROM匹配(单个芯片时用/读数据 /WriteByte(SKIP_ROM); 这句换掉上面的switch) WriteByte(READ_MEMORY); iTempDataL = ReadByte; iTempDataH = ReadByte; iTempDataH = 4; /得到整数部分 btDot *= 5; /btDot*10/16得到转换后的小数数

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.btNega

17、tive) DisplayOne(1, 6, -, 0); else DisplayOne(1, 6, m_TempData.btThird, 1); DisplayOne(1, 7, m_TempData.btSecond, 1); DisplayOne(1, 8, m_TempData.btFirst, 1); DisplayOne(1, 10, m_TempData.btDecimal, 1); void main /GetROMSequence; Clear; Init; DisplayString(0, 0, Temperature); DisplayOne(1, 9, ., 0); while (1) DataProcess;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号