采用51单片机8路温度采集
完整代码和仿真文件:
8路温度采集,串口发送温度数据.zip
(169.7 KB, 售价: 1 E币)
部分代码
- /序列号匹配
- void MatchROM(const unsigned char *pMatchData)
- {
- unsigned char i;
- Initialization();
- WriteByte(0x55);
- 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();
- }*/
- //读取温度值
- bit ReadTemperature(TEMPDATA * pTempData)
- {
- unsigned int iTempDataH;
- unsigned char btDot, iTempDataL;
- static unsigned char i = 0;
- pTempData->btNegative = 0; //为0温度为正
- i++;
- if (i == 9) i = 1;
- Initialization();
- WriteByte(0xCC); //跳过ROM匹配
- WriteByte(0x44); //启动转换
- Delay1ms(65);
- //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(0xBE); //读数据
- iTempDataL = ReadByte();
- iTempDataH = ReadByte();
- iTempDataH <<= 8;
- iTempDataH |= iTempDataL;
- if (iTempDataH & 0x8000)
- {
- pTempData->btNegative = 1;
- iTempDataH = ~iTempDataH + 1; //负数求补
- }
- //为了省去浮点运算带来的开销,而采用整数和小数部分分开处理的方法(没有四舍五入)
- btDot = (unsigned char)(iTempDataH & 0x000F); //得到小数部分
- iTempDataH >>= 4; //得到整数部分
- btDot *= 5; //btDot*10/16得到转换后的小数数据
- btDot >>= 3;
- //数据处理
- pTempData->btThird = (unsigned char)iTempDataH / 100;
- pTempData->btSecond = (unsigned char)iTempDataH % 100 / 10;
- pTempData->btFirst = (unsigned char)iTempDataH % 10;
- pTempData->btDecimal = btDot;
- return 1;
- }
- //数据显示处理子程序
- void DataProcess()
- {
- ReadTemperature(&m_TempData);
- if (m_TempData.btNegative) 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 tempdatalist()
- { u8 i;
- for(i=0;i<8;i++)
- {
- ReadTemperature(&m_TempData);
- if (m_TempData.btNegative)
- { DisplayOne(1, 6, '-', 0);
- zhenfu[i]='-';
- temp[i]=( m_TempData.btThird*1000+m_TempData.btSecond*100+m_TempData.btFirst*10+m_TempData.btDecimal);
- }
- else {
- DisplayOne(1, 6, m_TempData.btThird, 1);
- zhenfu[i]='+';
- DisplayOne(1, 7, m_TempData.btSecond, 1);
- DisplayOne(1, 8, m_TempData.btFirst, 1);
- DisplayOne(1, 10, m_TempData.btDecimal, 1);
- temp[i]=( m_TempData.btThird*1000+m_TempData.btSecond*100+m_TempData.btFirst*10+m_TempData.btDecimal);
- Delay1ms(1000);
- }
- }
- for(i=0;i<8;i++)
- {
- UART_SendOneByte(zhenfu[i]);
- UART_SendNum(temp[i]);
- UART_SendString(":");
- }
- UART_SendString("\r\n");
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|