智能豆浆机控制系统设计
电路原理图如下:
单片机源程序如下:
- #include<reg51.h>
- #include"lcd.h"
- #include"oled.h"
- #include"temp.h"
- sbit IRIN=P2^0;
- sbit jr=P2^7;//加热
- sbit dj=P2^6;//
- sbit bj=P2^5;
- sbit fmq=P2^4;
- sbit aj1=P2^0;//
- sbit aj2=P2^1;//
- sbit aj3=P2^2;//
- sbit aj4=P2^3;//开始
- sbit yd=P3^5;
- sbit ed=P3^6;
- sbit sd=P3^7;
- sbit yw1=P1^1;//最低档
- sbit yw2=P1^2;
- sbit yw3=P1^3;
- unsigned char Time;
- void DelayMs(unsigned int );
- void LcdDisplay(int);
- /*******************************************************************************
- * 函数名 : main
- * 函数功能 : 主函数
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- unsigned char IrValue[6]; //用来存放读取到的红外值
- void delay(unsigned int a)
- {
- while(a--)
- {
- if(yw3==0)
- {
- while(1)
- {
- fmq=bj=0;
- if(yw2==0||yw1==0)
- {
- fmq=bj=1;
- break;
- }
- }
- }
- if(yw1==1&&yw2==1&&yw3==1)
- {
- while(1)
- {
- fmq=bj=0;
- if(yw2==0||yw1==0)
- {
- fmq=bj=1;
- break;
- }
- }
- }
- }
- }
- void sdcx(unsigned char a)
- {
- unsigned char i;
- if(a==1)
- {
- for(i=0;i<6;i++)
- {
- dj=0;delay(25000);
- dj=1;delay(25000);
- }
- }
- else if(a==2)
- {
- for(i=0;i<6;i++)
- {
-
- dj=0;delay(12500);
- dj=1;delay(12500);
-
- dj=0;delay(12500);
- dj=1;delay(12500);
-
- }
- }
- else if(a==3)
- {
- for(i=0;i<6;i++)
- {
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
- }
- }
- }
- void main()
- {
- uchar a=0,i=0,zt,ms,mbz=27,sl,sdbz;
- uint Num=0;
- OLED_Init();//初始化OLED
- if(a==1)
- {
- uchar b[]={0,0};
- LcdInit();
- OLED_ColorTurn(0);
- OLED_Display_On();
- OLED_Display_Off();
- OLED_DisplayTurn(0);
- OLED_ShowNum(0,0,1,1,16);
- OLED_ShowString(0,0,0,16);
- OLED_DrawBMP(0,0,10,10,b);
- LcdDisplay(10);
- }
- while(1)
- {
- // OLED_ShowChinese(40,0,0,16);//豆浆机
- // OLED_ShowChinese(56,0,1,16);
- // OLED_ShowChinese(72,0,2,16);
-
- OLED_ShowChinese(0,2,3,16);//实时液位空
- OLED_ShowChinese(16,2,4,16);
- OLED_ShowChinese(32,2,9,16);
- OLED_ShowChinese(48,2,10,16);
- OLED_ShowChinese(64,2,16,16);
-
- OLED_ShowNum(80,2,sl,1,16);//实时液位
- OLED_ShowChinese(96,2,16,16);
- OLED_ShowNum(112,2,3,1,16);
-
- OLED_ShowChinese(0,4,7,16);//实时温度空
- OLED_ShowChinese(16,4,8,16);
- OLED_ShowChinese(32,4,5,16);
- OLED_ShowChinese(48,4,6,16);
- OLED_ShowChinese(64,4,16,16);
- Num=Ds18b20ReadTemp();
- Num=Num/10;
- OLED_ShowNum(80,4,Num,3,16);
-
-
-
- OLED_ShowChinese(0,6,18,16);//模式
- OLED_ShowChinese(16,6,19,16);
- if(ms==1)OLED_ShowChinese(32,6,14,16);//干或这湿
- else if(ms==0)OLED_ShowChinese(32,6,15,16);
-
- OLED_ShowNum(68,6,sdbz,3,16);
-
- OLED_ShowChinese(0,0,11,16);
- OLED_ShowChinese(16,0,12,16);
- OLED_ShowChinese(32,0,13,16);
-
- OLED_ShowNum(60,0,mbz,3,16);
-
- switch(zt)
- {
- case 0:
- break;
- case 1:
- if(ms==0)
- {
- jr=0;
- dj=0;
-
- for(i=0;i<20;i++)
- {
- if(sdbz==1)
- {
- dj=0;delay(25000);
- dj=1;delay(25000);
- }
- else if(sdbz==2)
- {
- dj=0;delay(12500);
- dj=1;delay(12500);
-
- dj=0;delay(12500);
- dj=1;delay(12500);
-
- }
- else if(sdbz==3)
- {
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
-
- dj=0;delay(5000);
- dj=1;delay(5000);
- }
- }
- fmq=0;
- dj=jr=1;
- delay(30000);
- fmq=bj=1;
- }
- if(ms==1)
- {
- unsigned char i,x;
- for(i=0;i<5;i++)
- {
- dj=0;jr=1;
- sdcx(sdbz);
- dj=1;jr=0;
- delay(50000);
- delay(50000);
- delay(50000);
- delay(50000);
- }
- fmq=0;
- delay(30000);
- fmq=bj=1;
- }
- zt=2;
- break;
- case 2:
- if(Num>mbz)jr=1;
- else jr=0;
- break;
- }
- if(aj4==0)
- {
- zt=1;
- }
- if(zt==2)
- {
- if(aj1==0)
- {
- if(mbz<100)mbz++;
- while(aj1==0);
- }
- if(aj2==0)
- {
- if(mbz>0)mbz--;
- while(aj2==0);
- }
- }
- if(aj3==0)
- {
- if(ms==0)ms=1;
- else ms=0;
- while(aj3==0);
- }
- if(yd==0)sdbz=1;
- else if(ed==0)sdbz=2;
- else if(sd==0)sdbz=3;
-
-
- if(yw1==0)sl=1;
- if(yw2==0)sl=2;
- if(yw3==0)sl=3;
-
- if(yw1==1&&yw2==1&&yw3==1)sl=0;
- if(sl==3||sl==0)
- {
- while(1)
- {
- fmq=bj=0;
- if(yw2==0||yw1==0)
- {
- fmq=bj=1;
- break;
- }
- }
- }
- else fmq=bj=1;
- }
- }
- void DelayMs(unsigned int x) //0.14ms误差 0us
- {
- unsigned char i;
- while(x--)
- {
- for (i = 0; i<13; i++)
- {}
- }
- }
- void ReadIr() interrupt 0
- {
- unsigned char j,k;
- unsigned int err;
- Time=0;
- DelayMs(70);
- if(IRIN==0) //确认是否真的接收到正确的信号
- {
- err=1000; //1000*10us=10ms,超过说明接收到错误的信号
- /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
- 侯,程序死在这里*/
- while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去
- {
- DelayMs(1);
- err--;
- }
- if(IRIN==1) //如果正确等到9ms低电平
- {
- err=500;
- while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去
- {
- DelayMs(1);
- err--;
- }
- for(k=0;k<4;k++) //共有4组数据
- {
- for(j=0;j<8;j++) //接收一组数据
- {
- err=60;
- while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
- {
- DelayMs(1);
- err--;
- }
- err=500;
- while((IRIN==1)&&(err>0)) //计算高电平的时间长度。
- {
- DelayMs(1);//0.14ms
- Time++;
- err--;
- if(Time>30)
- {
- EX0=1;
- return;
- }
- }
- IrValue[k]>>=1; //k表示第几组数据
- if(Time>=8) //如果高电平出现大于565us,那么是1
- {
- IrValue[k]|=0x80;
- }
- Time=0; //用完时间要重新赋值
- }
- }
- }
- if(IrValue[2]!=~IrValue[3])
- {
- return;
- }
- }
- }
- /*******************************************************************************
- * 函数名 : LcdDisplay()
- * 函数功能 : LCD显示读取到的温度
- * 输入 : v
- * 输出 : 无
- *******************************************************************************/
- void LcdDisplay(int temp) //lcd显示
- {
-
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
- float tp;
- if(temp< 0) //当温度值为负数
- {
- LcdWriteCom(0x80); //写地址 80表示初始地址
- LcdWriteData('-'); //显示负
- //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算由?.5,还是在小数点后面。
-
- }
- else
- {
- LcdWriteCom(0x80); //写地址 80表示初始地址
- LcdWriteData('+'); //显示正
- tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
- //如果温度是正的那么,那么正数的原码就是补码它本身
- temp=tp*0.0625*100+0.5;
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算加上0.5,还是在小数点后面。
- }
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
-
- LcdWriteCom(0x82); //写地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //百位
-
- LcdWriteCom(0x83); //写地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
- LcdWriteCom(0x84); //写地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //个位
- LcdWriteCom(0x85); //写地址 80表示初始地址
- LcdWriteData('.'); //显示 ‘.’
- LcdWriteCom(0x86); //写地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //显示小数点
- LcdWriteCom(0x87); //写地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //显示小数点
- }
复制代码
Keil代码下载:
原理图+程序.7z
(340.76 KB, 下载次数: 23)
|