单片机温度控制系统程序详解 - 模块功能解析

该程序是一个基于单片机的温度控制系统,主要功能是读取温度传感器的温度值并显示在数码管上,同时可以通过按键进行温度设定和报警模式的切换。

程序代码:

#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(); //等待按键松开,避免重复切换
	}
}

程序模块解析:

  1. 引脚定义模块: 该模块定义了8个单片机引脚,分别连接到数码管和按键上。

    • K1-K4: 连接到四个按键,分别用于选择模式、加温度设定值、减温度设定值和选择报警模式
    • L1-L4: 连接到四个数码管,用于显示温度和设定值
    • L5: 连接到蜂鸣器,用于报警
    • buzzer: 蜂鸣器输出引脚
  2. 数字表定义模块: 该模块定义了一个包含0-9和一些特殊字符的表,用于数码管显示数字。

    • table: 存储每个数字和字符对应的数码管段码
  3. 变量定义模块: 该模块定义了一些全局变量,包括:

    • wendu: 存储温度值
    • yi, er, san, si, wu, liu, qi, ba: 存储显示在数码管上的数字
    • jia, jian: 标记加减按键是否按下
    • S1: 标记是否处于温度设定模式
    • S4: 标记是否处于报警模式开启状态
    • yuzhi: 存储温度设定值
  4. 温度读取函数 (Ds18b20): 该函数用于读取温度传感器的温度值。

    • 初始化 DS18B20 温度传感器
    • 发送读取温度命令 (0x44)
    • 延时等待温度转换完成
    • 读取温度值的低 8 位和高 8 位
    • 合并高低位,得到最终的温度值
  5. 数码管控制函数 (xianshi): 该函数用于控制数码管的显示。

    • 选择数码管位置 (add)
    • 发送对应的数字 (dat)
  6. 数码管显示函数 (display): 该函数用于数码管的显示。

    • 依次调用 xianshi 函数,设置每个数码管显示的数字
    • 使用 delayms 函数控制数码管的刷新频率
  7. 延时函数 (delayms): 该函数用于延时一段时间,实现程序中的延时功能。

  8. 按键扫描函数 (key): 该函数用于扫描按键的状态。

    • 检测每个按键是否按下
    • 设置相应的标志位 (jia, jian, S1, S4)
    • 等待按键松开,避免重复触发
  9. 主函数 (main): 主函数是程序的入口点。

    • 在一个无限循环中不断执行以下操作:
      • 读取温度值 (Ds18b20)
      • 扫描按键状态 (key)
      • 根据按键状态切换温度显示模式或温度设定模式 (S1)
      • 根据按键状态调整温度设定值 (yuzhi)
      • 根据报警模式状态控制蜂鸣器的开启和关闭 (S4, L5, buzzer)
      • 将温度值和设定值显示在数码管上 (display)

总结:

该程序通过多个模块协同工作,实现温度的读取、显示、设定和报警功能。每个模块都有明确的功能,代码结构清晰,易于理解和维护。


原文地址: https://www.cveoy.top/t/topic/o1Cf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录