|
本系统可由用户根据需要自由设置大小风档的切换温度值TH,TL,硬件上设计了3个按键,按下一次设置键K1,进入温度上限设置,此时按下“加”键K2,加一,按下“减”键K3,减一。再按一次设置键K1进入温度下限设置状态,此时按下“加”键K2,加一,按下“减”键K3,减一。再按一次设置键K1退出下限温度设置状态,恢复到当前温度显示状态。 注:温度上下限以及当前温度显示格式为H-XX L-XXD-XX. XX为温度值;D为档位值。
单片机源程序如下:
- /**************************************************************************************
- * DS18B20温度传感器实验 *
- 实现现象:下载程序后,在温度传感器接口处,按照丝印方向插好温度传感器,数码管就会显示
- 检测的温度值,
- 注意事项:
- ***************************************************************************************/
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- #include"temp.h"
- #include<intrins.h>
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- char i;
- sbit dj=P1^0;//电机
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit key1=P3^1;//设置温度
- sbit key2=P3^0;//温度加
- sbit key3=P3^2;//温度减
- u8 wen_du;//温度变量
- u8 shang,xia; //对比温度暂存变量
- u16 dang;//档位显示
- u16 flag;
- u16 d1,d2,d3;//显示温度暂存变量
- u8 DisplayData[8];
- u8 code smgduan[22]={0x3F,0x06,0x5B,0x4F,0x66,
- 0x6D,0x7D,0x07,0x7F,0x6F,
- 0x77,0x7C,0x39,0x5E,0x79,0x71,
- 0x40,0x38,0x76,0x00,0xff,0x37};
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函数名 :DigDisplay()
- * 函数功能 :数码管显示函数
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<4;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(3):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(2):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(1):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(0):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- }
- Ds18b20ReadTemp();
- P0=smgduan[DisplayData[i]];//发送数据
- delay(100); //间隔一段时间扫描
- P0=0x00;//消隐
- }
- }
- /*******************************************************************************
- * 函 数 名 : Delay1ms
- * 函数功能 : 延时函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Delay1ms(uint y)
- {
- uint x;
- for( ; y>0; y--)
- {
- for(x=110; x>0; x--);
- }
- }
- /*******************************************************************************
- * 函 数 名 : Ds18b20Init
- * 函数功能 : 初始化
- * 输 入 : 无
- * 输 出 : 初始化成功返回1,失败返回0
- *******************************************************************************/
- uchar Ds18b20Init()
- {
- uchar i;
- DSPORT = 0; //将总线拉低480us~960us
- i = 70;
- while(i--);//延时642us
- DSPORT = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
- i = 0;
- while(DSPORT) //等待DS18B20拉低总线
- {
- Delay1ms(1);
- i++;
- if(i>5)//等待>5MS
- {
- return 0;//初始化失败
- }
-
- }
- return 1;//初始化成功
- }
- /*******************************************************************************
- * 函 数 名 : Ds18b20WriteByte
- * 函数功能 : 向18B20写入一个字节
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Ds18b20WriteByte(uchar dat)
- {
- uint i, j;
- for(j=0; j<8; j++)
- {
- DSPORT = 0; //每写入一位数据之前先把总线拉低1us
- i++;
- DSPORT = dat & 0x01; //然后写入一个数据,从最低位开始
- i=6;
- while(i--); //延时68us,持续时间最少60us
- DSPORT = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
- dat >>= 1;
- }
- }
- /*******************************************************************************
- * 函 数 名 : Ds18b20ReadByte
- * 函数功能 : 读取一个字节
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- uchar Ds18b20ReadByte()
- {
- uchar byte, bi;
- uint i, j;
- for(j=8; j>0; j--)
- {
- DSPORT = 0;//先将总线拉低1us
- i++;
- DSPORT = 1;//然后释放总线
- i++;
- i++;//延时6us等待数据稳定
- bi = DSPORT; //读取数据,从最低位开始读取
- /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
- byte = (byte >> 1) | (bi << 7);
- i = 4; //读取完之后等待48us再接着读取下一个数
- while(i--);
- }
- return byte;
- }
- /*******************************************************************************
- * 函 数 名 : Ds18b20ChangTemp
- * 函数功能 : 让18b20开始转换温度
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Ds18b20ChangTemp()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳过ROM操作命令
- Ds18b20WriteByte(0x44); //温度转换命令
- //Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
-
- }
- /*******************************************************************************
- * 函 数 名 : Ds18b20ReadTempCom
- * 函数功能 : 发送读取温度命令
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Ds18b20ReadTempCom()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳过ROM操作命令
- Ds18b20WriteByte(0xbe); //发送读取温度命令
- }
- /*******************************************************************************
- * 函 数 名 : Ds18b20ReadTemp
- * 函数功能 : 读取温度
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- int Ds18b20ReadTemp()
- {
- int temp = 0;
- uchar tmh, tml;
- Ds18b20ChangTemp(); //先写入转换命令
- Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令
- tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节
- tmh = Ds18b20ReadByte();//再读高字节
- wen_du=((tmh*256+tml)>>4);
- temp = tmh;
- temp <<= 8;
- temp |= tml;
- return temp;
- }
- void zi_keyscan() //自动模式按键扫描函数
- {
- if(key1==0) //设置键按下
- {
- delay(30); //延时去抖
- if(key1==0)flag=1; //再次判断按键,按下的话进入设置状态
- while(key1==0);//???? //按键释放
- }
- //显示上限温度H
- while(flag==1) //进入设置按键上限状态
- {
- d1=18;d2=shang/10;d3=shang%10; //显示字母H 和上线温度值
- DisplayData[0]=d1; //调用显示函数
- DisplayData[1]=16;
- DisplayData[2]=d2;
- DisplayData[3]=d3;
- DigDisplay();
- if(key1==0) //判断设置键是否按下
- {
- delay(30); //延时去抖
- if(key1==0)flag=2; //按键按下,进入设置下限模式
- while(key1==0);//松手检测
- }
- if(key2==0) //加键按下
- {
- delay(30); //延时去抖
- if(key2==0) //加键按下
- {
- shang+=1; //上限加5
- if(shang>=40)shang=40; //上线最大加到100
- }while(key2==0);//松手检测
- }
- if(key3==0) //减键按下
- {
- delay(30); //延时去抖
- if(key3==0) //减键按下
- {
- shang-=1; //上限减1
- if(shang<=15)shang=15; //上限最小减到10
- }while(key3==0);//松手检测
- }
- }
- //显示下限温度L
- while(flag==2) //设置下限
- {
- d1=17;d2=xia/10;d3=xia%10; //显示字母L 显示下限温度值
- DisplayData[0]=d1; //调用显示函数
- DisplayData[1]=16;
- DisplayData[2]=d2;
- DisplayData[3]=d3;
- DigDisplay();
- if(key1==0)
- {
- delay(30);
- if(key1==0)flag=0;
- while(key1==0);
- }
- if(key2==0)
- {
- delay(30);
- if(key2==0)
- {
- xia+=1;
- if(xia>=40)xia=40;
- }while(key2==0);//????
- }
- if(key3==0)
- {
- delay(30);
- if(key3==0)
- {
- xia-=1;
- if(xia<=15)xia=15;
- }while(key3==0);//????
- }
- }
- }
- void zi_dong() //传感器采集温度以及挡位显示
- {
- u16 i;
- d1=dang;d2=wen_du/10;d3=wen_du%10; //显示档位,显示当前温度值
- zi_keyscan(); //按键扫描函数
- DisplayData[0]=d1; //调用显示函数
- DisplayData[1]=16;
- DisplayData[2]=d2;
- DisplayData[3]=d3;
- DigDisplay(); //调用显示函数
- if(wen_du<xia){dj=0;dang=0;} //低于下限 显示为0 电机停止
- if((wen_du>=xia)&&(wen_du<=shang))//温度大于下限,小于上限 1档
- {
- dang=1;
- for(i=0;i<2;i++){dj=0;DigDisplay();zi_keyscan();} //PWM通过延时降低风扇转速
- for(i=0;i<4;i++){dj=1;DigDisplay();zi_keyscan();}
- }
- if(wen_du>shang){dj=1;dang=2;}//高温全速
- }
- void main() //主函数
- {
- u16 j;
- dj=0; //电机开
- shang=30;
- xia=20; //初始上下限值
- for(j=0;j<80;j++) //现读取温度值,防止开机显示85
- Ds18b20ReadTemp();
- while(1) //进入while循环
- {
- Ds18b20ReadTemp(); //读取温度值
- for(j=0;j<100;j++)zi_dong();//自动温控模式
- }
- }
复制代码
所有资料51hei提供下载:
|
评分
-
查看全部评分
|