基于单片机的温度监测和控制系统设计
#include 'main.h' #include 'onewire.h' //u8为unsigned int //u16为unsigned char
//定义8个单片机引脚,分别连接到数码管和按键上 sbit K1=P1^4; sbit K4=P1^5; sbit K2=P1^6; sbit K3=P1^7; sbit L1=P2^0; sbit L2=P2^1; sbit L3=P2^2; sbit L4=P2^3; sbit L5=P2^4;//开关蜂鸣器 sbit buzzer=P1^1;
//定义数码管显示的数字表,包括0-9和一些特殊字符 u8 table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6}; u8 dat[4]; u8 wendu=0; //存储温度值 u8 yi,er,san,si,wu,liu,qi,ba; //显示的数字 bit jia=0,jian=0,S1=0,S4=0; //按键状态和加减状态 u8 yuzhi=25; //温度设定值
u8 Ds18b20(); //读取温度函数 void display(); //数码管显示函数 void key(); //按键扫描函数
void main() { while(1) { wendu=Ds18b20(); //读取温度值 key();//扫描按键状态 if(S1==0)//温度显示模式 { L1=0;L2=1;L3=1;L4=1;//控制数码管显示位置 yi=wendu/10;er=wendu%10;//拆分温度值 san=12;si=10;wu=10;//显示符号和空位 liu=11;qi=yuzhi/10;ba=yuzhi%10;//拆分设定温度值 }
else if(S1==1) //温度设定模式
{
L1=1;L2=0;L3=1;L4=1;//控制数码管显示位置
if(jia==1)//加按钮按下,设定值加1
{
jia=0;
if(yuzhi<50)
yuzhi++;
}
if(jian==1)//减按钮按下,设定值减1
{
jian=0;if(yuzhi>0)yuzhi--;
}
yi=10;er=10;san=10;si=10;wu=10;//全部显示空位
liu=10;qi=yuzhi/10;ba=yuzhi%10;//显示设定温度值
}
if(S4==0)//报警模式开启
{
L5=0;//开启蜂鸣器
if(yuzhi<=wendu)//温度大于等于阈值,蜂鸣器响
{
buzzer=1;
}
else if(yuzhi>wendu)//温度小于阈值,蜂鸣器停止
{
;buzzer=0;
}
}
else if(S4==1) //报警模式关闭
{
L5=1;//关闭蜂鸣器
if(yuzhi<wendu)//温度小于阈值,蜂鸣器停止
{
L1&=1;L2&=1;L3=0;L4=1;buzzer=0;
}
else if(yuzhi>=wendu)//温度大于等于阈值,蜂鸣器停止
{
L1&=1;L2&=1;L3=1;L4=0;buzzer=0;
}
}
display();//数码管显示
}
}
void delayms(u16 z)//延时函数 { u16 i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); }
void xianshi(u8 add,u8 dat)//数码管控制函数 { P3=0x01<<add;//选择数码管 P0=dat;//显示数字 } void display() //数码管显示函数 { xianshi(0,table[yi]); delayms(3); xianshi(1,table[er]); delayms(3); xianshi(2,table[san]); delayms(3); xianshi(3,table[si]); delayms(3); xianshi(4,table[wu]); delayms(3); xianshi(5,table[liu]); delayms(3); xianshi(6,table[qi]); delayms(3); xianshi(7,table[ba]); delayms(3); }
u8 Ds18b20()//读取温度函数 { u8 low,high,temp; init_ds18b20();//初始化DS18B20 Write_DS18B20(0xcc);//0xcc控制ds18b20,直接跳过一些其他命令(精度命令等) Write_DS18B20(0x44);//0x44控制ds18b20只读一次温度大小 Delay_OneWire(100);//延时等待温度转换完成
init_ds18b20();
Write_DS18B20(0xcc);//0xcc控制ds18b20,直接跳过一些其他命令(精度命令等)
Write_DS18B20(0xbe);//0xbe,单片机准备读取自己内部的寄存器里面的数据
Delay_OneWire(100);
low=Read_DS18B20();//ds18b20内部数据一共16位,高四位表示符号(正负),低四位表示小数部分
high=Read_DS18B20();//读取高8位
temp=high<<4|low>>4;//合并高低位
return temp;
}
void key()//按键扫描函数 { if(K1==0) //选择模式按键按下 { delayms(2); if(K1==0) { if(S1==0)S1=1;//从温度显示模式切换到温度设定模式 else if(S1==1)S1=0;//从温度设定模式切换到温度显示模式 } while(!K1)display(); //等待按键松开,避免重复切换 } if(K2==0)//加温度设定值按键按下 { delayms(2); if(K2==0)jia=1; //标记加按钮按下 while(!K2)display(); //等待按键松开,避免重复加 } if(K3==0)//减温度设定值按键按下 { delayms(2); if(K3==0)jian=1;//标记减按钮按下 while(!K3)display();//等待按键松开,避免重复减 } if(K4==0)//选择温度报警模式按键按下 { delayms(2); if(K4==0) { if(S4==0)S4=1;//从温度报警模式开启切换到温度报警模式关闭 else if(S4==1)S4=0; //从温度报警模式关闭切换到温度报警模式开启 } while(!K4)display(); //等待按键松开,避免重复切换 }
原文地址: https://www.cveoy.top/t/topic/o1Ey 著作权归作者所有。请勿转载和采集!