单片机温度控制系统程序详解 - 模块功能解析
单片机温度控制系统程序详解 - 模块功能解析
该程序是一个基于单片机的温度控制系统,主要功能是读取温度传感器的温度值并显示在数码管上,同时可以通过按键进行温度设定和报警模式的切换。
程序代码:
#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(); //等待按键松开,避免重复切换
}
}
程序模块解析:
-
引脚定义模块: 该模块定义了8个单片机引脚,分别连接到数码管和按键上。
- K1-K4: 连接到四个按键,分别用于选择模式、加温度设定值、减温度设定值和选择报警模式
- L1-L4: 连接到四个数码管,用于显示温度和设定值
- L5: 连接到蜂鸣器,用于报警
- buzzer: 蜂鸣器输出引脚
-
数字表定义模块: 该模块定义了一个包含0-9和一些特殊字符的表,用于数码管显示数字。
- table: 存储每个数字和字符对应的数码管段码
-
变量定义模块: 该模块定义了一些全局变量,包括:
- wendu: 存储温度值
- yi, er, san, si, wu, liu, qi, ba: 存储显示在数码管上的数字
- jia, jian: 标记加减按键是否按下
- S1: 标记是否处于温度设定模式
- S4: 标记是否处于报警模式开启状态
- yuzhi: 存储温度设定值
-
温度读取函数 (Ds18b20): 该函数用于读取温度传感器的温度值。
- 初始化 DS18B20 温度传感器
- 发送读取温度命令 (0x44)
- 延时等待温度转换完成
- 读取温度值的低 8 位和高 8 位
- 合并高低位,得到最终的温度值
-
数码管控制函数 (xianshi): 该函数用于控制数码管的显示。
- 选择数码管位置 (add)
- 发送对应的数字 (dat)
-
数码管显示函数 (display): 该函数用于数码管的显示。
- 依次调用 xianshi 函数,设置每个数码管显示的数字
- 使用 delayms 函数控制数码管的刷新频率
-
延时函数 (delayms): 该函数用于延时一段时间,实现程序中的延时功能。
-
按键扫描函数 (key): 该函数用于扫描按键的状态。
- 检测每个按键是否按下
- 设置相应的标志位 (jia, jian, S1, S4)
- 等待按键松开,避免重复触发
-
主函数 (main): 主函数是程序的入口点。
- 在一个无限循环中不断执行以下操作:
- 读取温度值 (Ds18b20)
- 扫描按键状态 (key)
- 根据按键状态切换温度显示模式或温度设定模式 (S1)
- 根据按键状态调整温度设定值 (yuzhi)
- 根据报警模式状态控制蜂鸣器的开启和关闭 (S4, L5, buzzer)
- 将温度值和设定值显示在数码管上 (display)
- 在一个无限循环中不断执行以下操作:
总结:
该程序通过多个模块协同工作,实现温度的读取、显示、设定和报警功能。每个模块都有明确的功能,代码结构清晰,易于理解和维护。
原文地址: https://www.cveoy.top/t/topic/o1Cf 著作权归作者所有。请勿转载和采集!