“蓝桥杯”第六届省赛----“简易温度采集与控制装置”

功能简述

模拟“温度采集与控制装置”用于实现温度的实时监测与控制。单片机采集 DS18B20 温度传感器的输出信号,并送到数码管进行显示;通过传感器得到的温度数据将与用户设定 温度上限、下限值做比较,再由单片机启动控制或报警电路。系统硬件部分主要由单片机最 小系统、数码管显示、DS18B20 温度传感器、矩阵键盘等模块组成。系统组成框图如图 1 所示:

单总线驱动程序、CT107D 单片机考试平台电路原理图以及本题所涉及到的芯片数据手 册,可参考计算机上的电子文档。程序流程图及相关工程文件请以考生号命名,并保存在计 算机上的考生文件夹中(文件夹名为考生准考证号,文件夹位于 Windows 桌面上)。

设计任务及要求

1. 温度检测 温度检测采用 DS18B20 温度传感器,数据经过单片机处理后,与用户设定的温度 上限(TMAX)和温度下限(TMIN)比较,确定当前温度所处的区间,数码管温度显 示格式如图 2 所示:

关于温度区间的说明: 

当前温度TMAX 可设定的最大温度区间:0℃~99℃

2. 用户输入-3X4 矩阵键盘 通过矩阵键盘设定系统的工作参数,各个按键的功能定义如图 3 所示:

“设置”按键按下后,进入工作参数设定界面,如图 4 所示,依次按下设定的数值, 再次按下“设置”按键,保存当前输入的数据,并退出工作参数设定界面。

以设定 TMAX 为 35 摄氏度,TMIN为 25 摄氏度为例说明参数设定过程:按下“设置” 按键,然后依次按下数字按键“3” “5” “2” “5”如图 5 所示,再次按下“设 置”按键,完成参数设定,并退出参数设定界面。在输入过程中,按下“清除”按 键,将清除当前输入数据,若设定工作参数错误,如 TMAX

<TMIN,L2常亮,修正错误并保存参数后,L2熄灭

3. 执行机构

执行机构由指示灯 L1 和继电器组成,用于报警和连接外部高低温执行机构。

3.1 实时温度处在温度区间 0,继电器关闭,指示灯 L1 以 0.8 秒为间隔闪烁;

3.2 实时温度处在温度区间 1,继电器关闭,指示灯 L1 以 0.4 秒为间隔闪烁;

3.3 实时温度处在温度区间 2,继电器打开,指示灯 L1 以 0.2 秒为间隔闪烁。

4. 初始化状态说明

系统默认的温度上限(TMAX)为 30℃,温度下限(TMIN)为 20℃,可以通过矩阵键盘 修改。

代码参考如下

#include "reg52.h"
#include "intrins.h"
#include "onewire.h"
#define TSMG 500
sfr P4 = 0xc0;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr AUXR = 0x8e;
sfr IE2 = 0xaf;
sbit h1 = P3^0;
sbit h2 = P3^1;
sbit h3 = P3^2;
sbit h4 = P3^3;
sbit s1 = P4^4;
sbit s2 = P4^2;
sbit s3 = P3^5;
sbit s4 = P3^4;
void DisplaySMG_Info();
code unsigned char Seg_Table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8,
	                              0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86,0x8e };
unsigned char temp_value = 0;
unsigned char mystr[4]={3,0,2,0};
unsigned stat_set = 0;
unsigned char UI = 0;
unsigned char value_4 = 0;
unsigned char level = 0;
unsigned char stat_led = 0xff;
unsigned char count_08s = 0;
unsigned char count_04s = 0;
unsigned char count_02s = 0;
unsigned char stat_jdq = 0x00;
unsigned char stat_shan = 0;
void Delay20ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 1;
	j = 234;
	k = 113;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void Init_timer2()//10ms
{
	AUXR &= 0xfb;
	T2L = 0xf0;
	T2H = 0xd8;
	AUXR |= 0x10;
	EA = 1;
	IE2 |= 0x04;
}
void Sevice_timer2() interrupt 12
{
	DisplaySMG_Info();
	if(level == 0)
	{
		count_08s++;
		if(count_08s == 80)
		{
			count_08s = 0;
			if(stat_shan == 0)
			{
				stat_shan = 1;
			}
			else
			{
				stat_shan = 0;
			}
		}
	}
	else if(level == 1)
	{
		count_04s++;
		if(count_04s == 40)
		{
			count_04s = 0;
			if(stat_shan == 0)
			{
				stat_shan = 1;
			}
			else
			{
				stat_shan = 0;
			}
		}
	}
	if(level == 2)
	{
		count_02s++;
		if(count_02s == 20)
		{
			count_02s = 0;
			if(stat_shan == 0)
			{
				stat_shan = 1;
			}
			else
			{
				stat_shan = 0;
			}
		}
	}
}
void Init_mytemp()
{
	unsigned char LSB,MSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	do{
		init_ds18b20();
		Write_DS18B20(0xcc);
		Write_DS18B20(0xbe);
		LSB = Read_DS18B20();
		MSB = Read_DS18B20();
		MSB = (MSB << 4) | (LSB >> 4);
	}while(MSB == 85);
}
void read_mytemp()
{
	unsigned char LSB,MSB;
	unsigned int temp;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	temp = MSB << 8;
	temp = temp | LSB;
	if((temp & 0xf800) == 0x0000)
	{
		temp_value = temp * 0.0625;
	}
}
void SelectHC573(unsigned char channel,unsigned char dat)
{
	P2 = (P2 & 0x1f) | 0x00;
	P0 = dat;
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
		case 0:
			P2 = (P2 & 0x1f) | 0x00;
		break;
	}
	P2 = (P2 & 0x1f) | 0x00;
}
void DelaySMG(unsigned int t)
{
	while(t--);
}
void DisplaySMG_Bit(unsigned char pos,unsigned char value)
{
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,value);
	DelaySMG(TSMG);
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,0xff);
}
void DisplaySMG_All(unsigned char value)
{
	SelectHC573(6,0xff);
	SelectHC573(7,value);
}
void DisplaySMG_Info()
{
	if(UI == 0)
	{
		DisplaySMG_Bit(0,0xbf);
		DisplaySMG_Bit(1,Seg_Table[level]);
		DisplaySMG_Bit(2,0xbf);
		DisplaySMG_Bit(6,Seg_Table[temp_value / 10]);
		DisplaySMG_Bit(7,Seg_Table[temp_value % 10]);
	}
	else if(UI == 1)
	{
		DisplaySMG_Bit(0,0xbf);
		DisplaySMG_Bit(1,Seg_Table[mystr[0]]);
		DisplaySMG_Bit(2,Seg_Table[mystr[1]]);
		DisplaySMG_Bit(5,0xbf);
		DisplaySMG_Bit(6,Seg_Table[mystr[2]]);
		DisplaySMG_Bit(7,Seg_Table[mystr[3]]);
	}
	
}
void scan_key()
{
	s1 = 0;
	s2 = s3 = s4 = h1 = h2 = h3 = h4 = 1;
	if(h1 == 0)//s7
	{
		Delay20ms();
		if(h1 == 0)
		{
			if(stat_set == 1)
			{
				if(value_4 != 4)
				{
					mystr[value_4++] = 0;
				}
			}
			while(h1 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	else if(h2 == 0)//s6
	{
		Delay20ms();
		if(h2 == 0)
		{
			if(stat_set == 1)
			{
				if(value_4 != 4)
				{
					mystr[value_4++] = 3;
				}
			}
			while(h2 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	else if(h3 == 0)//s5
	{
		Delay20ms();
		if(h3 == 0)
		{
			if(stat_set == 1)
			{
				if(value_4 != 4)
				{
					mystr[value_4++] = 6;
				}
			}
		
		while(h3 == 0)
		{
			
			DisplaySMG_Info();
		}
		}
	}
	else if(h4 == 0)//s4
	{
		Delay20ms();
		if(h4 == 0)
		{
			if(stat_set == 1)
			{
				if(value_4 != 4)
				{
					mystr[value_4++] = 9;
				}
			}
			while(h4 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	
	s2 = 0;
	s1 = s3 = s4 = h1 = h2 = h3 = h4 = 1;
	if(h1 == 0)//s11
	{
		Delay20ms();
		if(h1 == 0)
		{
			if(stat_set == 1)
			{
				if(value_4 != 4)
				{
					mystr[value_4++] = 1;
				}
			}
			while(h1 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	else if(h2 == 0)//s10
	{
		Delay20ms();
		if(h2 == 0)
		{
			if(stat_set == 1)
			{
				if(value_4 != 4)
				{
					mystr[value_4++] = 4;
				}
			}
			while(h2 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	else if(h3 == 0)//s9
	{
		Delay20ms();
		if(h3 == 0)
		{
			if(stat_set == 1)
			{
				if(value_4 != 4)
				{
					mystr[value_4++] = 7;
				}
			}
		
		while(h3 == 0)
		{
			
			DisplaySMG_Info();
		}
		}
	}
	else if(h4 == 0)//s8
	{
		Delay20ms();
		if(h4 == 0)
		{
			UI = 1;
		    stat_set++;
		    if(stat_set == 2)
			{
				stat_set = 0;
				UI = 0;
				value_4 = 0;
			}
			while(h4 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	
	s3 = 0;
	s2 = s1 = s4 = h1 = h2 = h3 = h4 = 1;
	if(h1 == 0)//s15
	{
		Delay20ms();
		if(h1 == 0)
		{
			if(stat_set == 1)
			{
				if(value_4 != 4)
				{
					mystr[value_4++] = 2;
				}
			}
			while(h1 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	else if(h2 == 0)//s14
	{
		Delay20ms();
		if(h2 == 0)
		{
			if(stat_set == 1)
			{
				if(value_4 != 4)
				{
					mystr[value_4++] = 5;
				}
			}
			while(h2 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	else if(h3 == 0)//s13
	{
		Delay20ms();
		if(h3 == 0)
		{
			if(stat_set == 1)
			{
				if(value_4 != 4)
				{
					mystr[value_4++] = 8;
				}
			}
		
		while(h3 == 0)
		{
			DisplaySMG_Info();
			
		}
		}
	}
	else if(h4 == 0)//s12
	{
		Delay20ms();
		if(h4 == 0)
		{
			value_4 = 0;
			mystr[0] = 0;
			mystr[1] = 0;
			mystr[2] = 0;
			mystr[3] = 0;
			while(h4 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
}
void led_control()
{
	if((mystr[0]*10+mystr[1]) < (mystr[2]*10+mystr[3]))
	{
		stat_led &= 0xfd;
		SelectHC573(4,stat_led);
	}
	else
	{
		stat_led |= 0x02;
		SelectHC573(4,stat_led);
	}
	if(stat_shan == 0)
	{
		stat_led &= 0xfe;
		SelectHC573(4,stat_led);
	}
	else
	{
		stat_led |= 0x01;
		SelectHC573(4,stat_led);
	}
}
void temp_level()
{
	if(temp_value < (mystr[2]*10+mystr[3]))
	{
		level = 0;
		stat_jdq &= 0xef;
		SelectHC573(5,stat_jdq);
	}
	else if(((mystr[2]*10+mystr[3]) <= temp_value) && (temp_value <= (mystr[0]*10+mystr[1])))
	{
		level = 1;
		stat_jdq &= 0xef;
		SelectHC573(5,stat_jdq);
	}
	else if(temp_value > (mystr[0]*10+mystr[1]))
	{
		level = 2;
		stat_jdq |= 0x10;
		SelectHC573(5,stat_jdq);
	}
}
void main()
{
	Init_mytemp();
	Init_timer2();
	SelectHC573(5,0x00);
	SelectHC573(4,0xff);
	DisplaySMG_All(0xff);
	while(1)
	{
		read_mytemp();
		scan_key();
		led_control();
		temp_level();
	}
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-05 15:56:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-05 15:56:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-05 15:56:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-05 15:56:05       20 阅读

热门阅读

  1. Android studio gradle 8.0引用libs目录下的aar库

    2024-04-05 15:56:05       14 阅读
  2. Istio-learning-note-About-Gateway API(一)

    2024-04-05 15:56:05       14 阅读
  3. 线程和进程的区别?

    2024-04-05 15:56:05       13 阅读
  4. Linux升级openssl至openssl-1.1.1版本

    2024-04-05 15:56:05       14 阅读
  5. 如何在运行时或以编程方式生成testng.xml

    2024-04-05 15:56:05       13 阅读
  6. Spirngboot JWT快速配置和使用

    2024-04-05 15:56:05       18 阅读
  7. 有关在运行时生成testng.xml的更多信息

    2024-04-05 15:56:05       18 阅读
  8. zookeeper之基本命令

    2024-04-05 15:56:05       17 阅读
  9. 蒟蒻求助帖

    2024-04-05 15:56:05       16 阅读
  10. 微信小程序 ---- 慕尚花坊 订单列表

    2024-04-05 15:56:05       17 阅读
  11. Android 关机充电动画卡住无反应,也不灭屏

    2024-04-05 15:56:05       19 阅读
  12. 【递推与递归】python例题详解

    2024-04-05 15:56:05       15 阅读