赞
踩
这篇博客主要是用15单片机(和51单片机差不多)做一个智能电饭煲系统。
本篇博客介绍的系统功能如下:
如图所示:
实物图如图所示:
电路连接图和算法流程图如图所示:
米粒识别是通过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压力传感器,是一个压敏电阻,压力和阻值有关,因此我们使用单片机的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秒的加热时间。
驱动程序,各个模块的测试程序已打包上传:基于单片机的智能电饭煲控制系统的设计
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。