基于单片机的智能电饭煲控制系统的设计(附代码)

基于单片机的智能电饭煲控制系统的设计


这篇博客主要是用15单片机(和51单片机差不多)做一个智能电饭煲系统。



一、整体功能

本篇博客介绍的系统功能如下:

  • 根据放入电饭煲谷物的类型和数量,计算出进水量和最佳工作温度,并计算出加热时间,最后将谷物类型,重量,和当前系统工作的温度和当前剩余的加热时间显示出来。

在这里插入图片描述
如图所示:

    1. 摄像头和K60芯片来对谷物拍照,并将照片以串口通信的形式传送给15单片机;
    1. 15单片机通过FSR400压力传感器计算出加入谷物的重量;
    1. 根据谷物类型和重量,计算出所需加水量,适合的工作温度,和加热时间
    1. DS18B20测试当前温度
    1. LCD1602液晶显示屏将谷物类型,重量,和当前系统工作的温度和当前剩余的加热时间显示出来

实物图如图所示:

在这里插入图片描述

  • 本来想只用15单片机做的,15单片机IO口又不够给摄像头用,就用了K60来连接摄像头然后把照片发给15单片机。
  • 根据图片识别米粒,牵扯到AI,咱当时也没这水平,想了个办法,盒子上面扣个洞,摄像头塞进去,这样放进盒子里不同大小的米粒,对应的图片里米粒的大小就不同了,就能直接区分开了。
  • 加热,没有加热电阻丝,留一个IO口给它,IO口高电平表示加热,否则不加热;
  • 水泵,额,也没有,同上,留一个IO口给它,IO口高电平表示加水,否则不加水;

电路连接图和算法流程图如图所示:
在这里插入图片描述
在这里插入图片描述


二、米粒识别

米粒识别是通过K60芯片,连接摄像头拍照实现的, K60用串口通信发给15单片机;K60比较麻烦,而且这个摄像头拍照和串口发送图片数组,都是例程,没啥可说的。这篇博客主要写15单片机部分的内容;

15单片机串口中断接收图片数组的程序如下:

void serial() interrupt 4
{
	int p;
  if(RI)
	{
		RI=0;
		p=SBUF; //串口通信接收图片数组,一次接受8个像素点
		ch=ch+(p&0x01); 
		ch=ch+((p>>1)&0x01);
		ch=ch+((p>>2)&0x01);
		ch=ch+((p>>3)&0x01);
		ch=ch+((p>>4)&0x01);
		ch=ch+((p>>5)&0x01);
		ch=ch+((p>>6)&0x01);
		ch=ch+((p>>7)&0x01); //ch为图片中1的个数
  }

计算1的个数是因为,我采用的是二值化摄像头,图片只有黑白,1是黑色,0是白色,谷物越大,1的个数越多,因此我们可以通过统计接收到的‘1’的个数,将谷物分为三类;


三、FSR400压力传感器

FSR400压力传感器,是一个压敏电阻,压力和阻值有关,因此我们使用单片机的ADC来读取模拟电压,从而计算出加入谷物重量

init_ADC();
Delay10ms();
while(!(ADC_CONTR & ADC_FLAG));
ch=((ADC_RES*256)&0x300)+(ADC_RESL&0xff);

四、主程序

思路感觉差不多说清楚了,整体程序如下:

#include <STC15.h>
#include "lcd1602.h" //这个文件里放着LCD1602的一些程序,网上都有
#include "UART.h" //这个文件里放着串口驱动的一些程序,网上都有
#include "ADC.h" //这个文件里放着15单片机ADC的驱动程序
#include "DS18b20.h" //这个文件里放着DS15B20的驱动
#define water_pin P23 //水泵控制引脚
#define R_pin P22 //加热电阻控制引脚
int ch=0;
int pwm=0;
int T=0;
void delay(unsigned int i) //延时函数
{
	while(i--);
}
void Delay2000ms()		//延时函数
{
	unsigned char i, j, k;
	i = 85;
	j = 12;
	k = 155;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void Timer0Init(void)		//定时器中断初始化
{
	AUXR |= 0x80;		//?????1T??
	TMOD &= 0xF0;		//???????
	TL0 = 0xCD;		//??????
	TH0 = 0xD4;		//??????
	TF0 = 0;		//??TF0??
	TR0 = 1;		//???0????
	EA=1;
}
void main()
{
	int water=0;
	float f=0.0;
	int t=0;
	unsigned char pi[11]; //LCD1602液晶屏的显示数组
	Init_UART1(115200); 
	Enable_UART1_INT();
	LCD_Init();
	while(!RI);
	Delay2000ms();  
	Disable_UART1_INT();  //初始化LCD显示屏和串口,并通过串口通信接收图片数组,在中断函数中计算图片数组中黑色像素点的数量
	if(ch<45 && ch>0) 	pi[0]='1';
	else if(ch<110 && ch>50) 	pi[0]='2';
	else 	pi[0]='3'; //根据黑色像素点数量,将谷物分为三类;
	init_ADC(); //初始化ADC
	Delay10ms();
  while(!(ADC_CONTR & ADC_FLAG));
	ch=((ADC_RES*256)&0x300)+(ADC_RESL&0xff);//读出ADC的模拟电压(相当于谷物重量)
	pi[1]=' ';
	pi[2]=ch/100+'0';
	pi[3]=ch%100/10+'0';
	pi[4]=ch%10+'0';
	pi[5]=' '; // 将重量显示在LCD上
	T=21*ch/100+pi[0]-'0'; //计算加热时间
	water=ch/100+pi[0]-'0'; //加水量
	water_pin=1;  //加水
	while(water--); 
	water_pin=0; //停止加水
	Timer0Init(); 
	while(1)
	{
		ET0=0;
		f=Read_Temperature();//读取DS18B20温度传感器的温度
		ET0=1;
		t=(int)f;
		t=t*10;
	    pi[6]=t%1000/100+'0'; //显示温度
		pi[7]=t%100/10+'0';
		pi[8]=' ';
		if(t>40) pwm=0; //动态调节温度,pwm表示加热电阻工作的占空比
		else pwm=(40-t)*25; 
		if(T==0) //剩余加热时间为0,停止工作
		{
			pi[9]='0';
			pi[10]=' ';
			ET0=0;
			R_pin=0;
		}			
		else //否则显示剩余加热时间,倒计时通过定时器中断来实现
		{
			pi[9]=T/10+'0';
			pi[10]=T%10+'0';
		}
		pi[11]=' ';
		LCD_Display(0,0,pi);
	}
}
void T0Function() interrupt 1 //定时器中断
{
	static m=0;
	if(m<pwm) 
	{
		m++;
		R_pin=1;
	}
	else if(m<1000)
	{
		m++;
		R_pin=0;
	}
	else
	{
		T--;
		m=0;
	}
}
void serial() interrupt 4 //串口接收照片数组
{
	int p;
  if(RI)
	{
		RI=0;
		p=SBUF;
		ch=ch+(p&0x01);
		ch=ch+((p>>1)&0x01);
		ch=ch+((p>>2)&0x01);
		ch=ch+((p>>3)&0x01);
		ch=ch+((p>>4)&0x01);
		ch=ch+((p>>5)&0x01);
		ch=ch+((p>>6)&0x01);
		ch=ch+((p>>7)&0x01);
  }
}

在这里插入图片描述
实验结果如图,‘3’表示加入的是第三种类型谷物(最大),259表示谷物重量为259,‘24’表示当前工作温度为24℃,‘53’表示还有53秒的加热时间。

五、需要注意的地方

  • DSB18B20读取温度的过程不能被中断,否则会出错,所以读取温度时,要关闭其他中断;

六、完整工程文件

驱动程序,各个模块的测试程序已打包上传:基于单片机的智能电饭煲控制系统的设计
在这里插入图片描述

  • 15.zip 为15单片机的项目文件,就比这篇博客里多了驱动文件
  • K60.zip 是K60芯片读取摄像头照片,并将照片数组以UART的方式发给15单片机
  • 其他的是一些小模块的测试程序
  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮宽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值