蓝桥杯之单片机学习(二十二)——模拟智能灌溉(附题目和完整代码)

蓝桥杯之单片机学习(二十二)——模拟智能灌溉(附题目和完整代码),第1张

文章目录

  • 一、题目要求


  • 二、代码展示


一、题目要求


二、代码展示

#include 
#include "iic.h"
#include "ds1302.h"

#define uchar unsigned char
#define uint unsigned int

//模式参数:0为自动、1为手动(默认为0)
uchar Mode_Check = 0;

//警告参数:1为打开、0为关闭(默认为1)
uchar Warning = 0;

//湿度参数
uchar shidu;

//时间数组
uchar shijian[] = {0, 30, 8, 0, 0, 0, 0};

//湿度阈值初始值
uchar shidu_yuzhi = 50;

//重置模式参数:1为开,0为退出
Reset_Check = 0;

uchar code SMG_duanma[18] = 
	{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
	 0x88,0x80,0xc6,0xc0,0x86,0x8e,
	 0xbf,0x7f};//分别是0-9(对应下标),A-F,“-”,“.”

//分别是“0.-9.”
uchar code SMG_Dot_AC[10] = 
	 {0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};

//系统初始化
void Initsys();
//配置HC138
void SelectHC138(uchar channel);
//在pos位码上,显示value段码
void DisplaySMG_Bit(uchar pos, uchar value);
//数码管8位码显示
void SMG_Display();
//数码管的延时
void Delay_one_ms_SMG();
//独立按键(BTN)
void Alone_Key_S6_S4();
//按键消抖延时
void Delay_five_ms_Key();
//模式检查
void Alone_Key_Mode_Check();
//自动模式
void Mode_0();
//手动模式
void Mode_1();
//Rb2电压读取
uchar AD_read(uchar add);
//读取阈值
uchar EEPROM_read(uchar add);
//写入阈值
void EEPROM_write(uchar add, uchar dat);
//初始化时间
void Init_DS1302();
//读出时间
void Read_DS1302();
//正常数码管显示
void Mode_SMG_Display();
//EEPROM延时5ms
void Delay_five_ms_EEPROM();
//湿度阈值的显示
void Reset_shidu_yuzhi_Display();
//重置阈值模式
void Mode_Reset_shidu_yuzhi();
//自动模式下,检查阈值
void Check_shidu();
//警报功能
void Mode_1_Warning();

void main()
{
	Initsys();
	Init_DS1302();
	while(1)
	{
		Alone_Key_Mode_Check();
		if(Mode_Check == 0)
		{
			Mode_0();
		}
		else if(Mode_Check != 0)
		{
			Mode_1();
		}
	}
}

//自动模式
void Mode_0()
{
	SelectHC138(4);
	P0 = 0XFE;
	while(1)
	{
		Check_shidu();
		Alone_Key_S6_S4();
		Alone_Key_Mode_Check();
		Mode_SMG_Display();
		if(Mode_Check != 0)
		{
			break;
		}
	}
}

//自动模式下,检查阈值
void Check_shidu()
{
	Read_DS1302();
	shidu = (uchar)(AD_read(0X03) * 0.39f);
	if(shidu < shidu_yuzhi)
	{
		SelectHC138(5);
		P0 = 0X10;
	}
	else
	{
		SelectHC138(5);
		P0 = 0X00;
	}
}

//重置阈值模式
void Mode_Reset_shidu_yuzhi()
{
	if(Reset_Check != 0)
	{
		while(1)
		{
			Reset_shidu_yuzhi_Display();
			Alone_Key_S6_S4();
			if(Reset_Check == 0)
			{
				break;
			}
		}
	}
}

//手动模式
void Mode_1()
{
	SelectHC138(4);
	P0 = 0XFD;
	while(1)
	{
		Mode_1_Warning();
		Alone_Key_S6_S4();
		Alone_Key_Mode_Check();
		Mode_SMG_Display();
		if(Mode_Check == 0)
		{
			break;
		}
	}
}

//警报功能
void Mode_1_Warning()
{
	if(Warning != 0)
	{
		Read_DS1302();
		shidu = (uchar)(AD_read(0X03) * 0.39f);
		if(shidu < shidu_yuzhi)
		{
			SelectHC138(5);
			P0 = 0X40;
		}
		else
		{
			SelectHC138(5);
			P0 = 0X00;
		}
	}
}

//模式检查
void Alone_Key_Mode_Check()
{
	//S7按键
	if(P30 == 0)
	{
		Delay_five_ms_Key();
		if(P30 == 0)
		{
			Mode_Check = ~Mode_Check;
		}
		while(!P30);
	}
}

//独立按键(BTN)
void Alone_Key_S6_S4()
{
	//S6按键
	if(P31 == 0)
	{
		Delay_five_ms_Key();
		if(P31 == 0)
		{
			if(Mode_Check == 0)
			{
				Reset_Check = ~Reset_Check;
				while(!P31);
				Mode_Reset_shidu_yuzhi();
			}
			else if(Mode_Check != 0)
			{
				Warning = ~Warning;
			}
		}
		while(!P31);
	}
	//S5按键
	else if(P32 == 0)
	{
		Delay_five_ms_Key();
		if(P32 == 0)
		{
			if(Mode_Check == 0 && Reset_Check != 0)
			{
				shidu_yuzhi = shidu_yuzhi + 1;
				EEPROM_write(0X10, shidu_yuzhi);
				Delay_five_ms_EEPROM();
			}
			else if(Mode_Check != 0)
			{
				SelectHC138(5);
				P0 = 0X10;
			}
		}
		while(!P32);
	}
	//S4按键
	else if(P33 == 0)
	{
		Delay_five_ms_Key();
		if(P33 == 0)
		{
			if(Mode_Check == 0 && Reset_Check != 0)
			{
				shidu_yuzhi = shidu_yuzhi - 1;
				EEPROM_write(0X10, shidu_yuzhi);
				Delay_five_ms_EEPROM();
			}
			else if(Mode_Check != 0)
			{
				SelectHC138(5);
				P0 = 0X00;
			}
		}
		while(!P33);
	}
}


//配置HC138
void SelectHC138(uchar channel)
{
	switch(channel)
	{
		case 4:    //LED
			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;
	}
}

//系统初始化
void Initsys()
{
	SelectHC138(5);
	P0 = 0X00;//关闭蜂鸣器和继电器
	SelectHC138(4);
	P0 = 0XFF;//关闭LED
	
	SelectHC138(6);
	P0 = 0XFF; //选择所有数码管
	SelectHC138(7);
	P0 = 0XFF; //关闭所有数码管
	EEPROM_write(0X10, shidu_yuzhi);
	Delay_five_ms_EEPROM();
}

//在pos位码上,显示value段码
void DisplaySMG_Bit(uchar pos, uchar value)
{
	SelectHC138(6);
	P0 = 0X01 << pos;
	SelectHC138(7);
	P0 = value;
}

//数码管的延时
void Delay_one_ms_SMG()
{
	uint j;
	for(j = 845; j > 0; j--);
}

//按键消抖延时
void Delay_five_ms_Key()
{
	uint i,j;
	for(i = 0; i < 5; i++)
		for(j = 845; j > 0; j--);
}

//EEPROM延时5ms
void Delay_five_ms_EEPROM()
{
	uint i,j;
	for(i = 0; i < 5; i++)
		for(j = 845; j > 0; j--);
}

//时间初始化
void Init_DS1302()
{
	uchar i, add;
	add = 0X80;  //写
	Write_Ds1302(0X8e, 0X00);
	for(i = 0; i < 7; i++)
	{
		Write_Ds1302(add, shijian[i]);
		add = add + 2;
	}
	Write_Ds1302(0X8e, 0X80);
}

//读出时间
void Read_DS1302()
{
	uchar i, add;
	add = 0X81;  //读
	Write_Ds1302(0X8e, 0X00);
	for(i = 0; i < 7; i++)
	{
		shijian[i] = Read_Ds1302(add);
		add = add + 2;
	}
	Write_Ds1302(0X8e, 0X80);
}

//读取湿度
uchar AD_read(uchar add)
{
	uchar temp;
	IIC_Start();
	IIC_SendByte(0X90);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0X91);
	IIC_WaitAck();
	temp = IIC_RecByte();
	IIC_Stop();
	return temp;
}

//读取阈值
uchar EEPROM_read(uchar add)
{
	uchar temp;
	IIC_Start();
	IIC_SendByte(0XA0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0XA1);
	IIC_WaitAck();
	temp = IIC_RecByte();
	IIC_Stop();
	return temp;
}


//写入阈值
void EEPROM_write(uchar add, uchar dat)
{
	IIC_Start();
	IIC_SendByte(0XA0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

//正常数码管显示
void Mode_SMG_Display()
{
	Read_DS1302();
	shidu = (uchar)(AD_read(0X03) * 0.39f);
	DisplaySMG_Bit(0, SMG_duanma[shijian[2] / 10]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(1, SMG_duanma[shijian[2] % 10]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(2, SMG_duanma[16]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(3, SMG_duanma[shijian[1] / 10]);
	Delay_one_ms_SMG();
	
	DisplaySMG_Bit(4, SMG_duanma[shijian[1] % 10]);
	Delay_one_ms_SMG();
//	DisplaySMG_Bit(5, SMG_duanma[5]);
//	Delay_one_ms_SMG();
	DisplaySMG_Bit(6, SMG_duanma[shidu / 10]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(7, SMG_duanma[shidu % 10]);
	Delay_one_ms_SMG();
	P0 = 0XFF;
}

//湿度阈值的显示
void Reset_shidu_yuzhi_Display()
{
	shidu_yuzhi = EEPROM_read(0X10);
	DisplaySMG_Bit(0, SMG_duanma[16]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(1, SMG_duanma[16]);
	Delay_one_ms_SMG();
	
	DisplaySMG_Bit(6, SMG_duanma[shidu_yuzhi / 10]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(7, SMG_duanma[shidu_yuzhi % 10]);
	Delay_one_ms_SMG();
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/562475.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-01
下一篇 2022-04-01

发表评论

登录后才能评论

评论列表(0条)

保存