本帖最后由 Lxy18 于 2021-10-31 23:51 编辑
认真学习了DS18B20的手册,发现DS18B20单总线实现多路采集,需要读取ROM指令,通过ROM指令读取指定的DS18B20温度。操作相当麻烦,参考了CSDN的例子,最后还是没搞出来 。后来就想能不能把8个DS18B20连接到8个IO口上,然后就是分别读取8个IO口的温度数据,这样的话就需要8个驱动程,理论可行,需要的程序相当多,所以这样也不可行。然后就想,如果用一个驱动程序,在函数中改变总线变量定义的IO口,也就是改变变量的地址,查找很多资料后,发现这根本不可能。 最后,就想有没有一种芯片可以一个IO口选通8个口,经过一番努力之后,果然有,74HC4051,8通道模拟多路选择器/多路分配器,带有3个数字选择端(S0至S2),1个低有效使能端(E),8个独立输入/输出端(Y0至Y7)和1个公共输入/输出端(Z)。 然后就是画仿真,写程序了。经过测试后非常好用,程序也非常简单。
主程序如下,只实现了基本的8路温度采集,温度报警、串口什么的都没加。
- /******************************************************************************
- 单片机八路温度采集系统
- *******************************************************************************/
- #include <reg52.h>
- #include "delay.h"
- #include "lcd1602.h"
- #include "DS18B20.h"
- #define uchar unsigned char //对数据类型定义
- #define uint unsigned int
- /****************************端口定义******************************************/
- /*----74HC4051端口定义------------*/
- sbit HC4051_A=P2^0;
- sbit HC4051_B=P2^1;
- sbit HC4051_C=P2^2;
-
- /****************************定义变量******************************************/
- float Temp[8]; //温度变量
- uchar Temp_Str[3]; //数组变量存放温度数据
- /*****************************************************************************/
- /***************************函数声明******************************************/
- void HC4051_CH(uchar ch);//HC4051通道选择函数
- /******************************************************************************
- * 函 数 名 : 主函数
- * 函数功能 :
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- uchar i;
- Lcd1602_Init(); //1602初始化
- Lcd1602_Write_Cmd(0x01); //清屏
- for(i=0;i<8;i++) //8个温度传感器初始化
- {
- HC4051_CH(i); //选择通道
- DS18B20_Init(); //温度传感器初始化
- }
- while(1)
- {
- for(i=0;i<8;i++) //读取8路温度传感器温度值
- {
- HC4051_CH(i); //选择通道
- Temp[i]=DS18B20_ReadTemp(); //读取温度值
- if(Temp[i]>0) //正温度
- {
- Temp_Str[0]=(int)Temp[i]/100+48; //提取温度百、十、个位
- Temp_Str[1]=((int)Temp[i]%100)/10+48;
- Temp_Str[2]=(int)Temp[i]%10+48;
- }
- else //负温度
- {
- Temp[i]=-Temp[i]; //将负数转换为正数
- Temp_Str[0]='-'; //显示“—”号
- Temp_Str[1]=((int)Temp[i]%100)/10+48; //提取温度个、十位
- Temp_Str[2]=(int)Temp[i]%10+48;
- Temp[i]=-Temp[i]; //将温度恢复
- }
- LcdShowStr(0+4*(i%4),i/4,Temp_Str);//将温度显示在LCD上
- }
- Delay_Ms(30);
- }
- }
- /******************************************************************************
- * 函 数 名 : HC4051_CH(uchar ch)
- * 函数功能 : HC4051通道选择函数
- * 输 入 : ch:选择的通道
- * 输 出 : 无
- *******************************************************************************/
- void HC4051_CH(uchar ch)
- {
- HC4051_A=ch%2;
- HC4051_B=(ch%4)/2;
- HC4051_C=ch/4;
- }
复制代码
|