找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1655|回复: 0
收起左侧

单片机智能豆浆机控制系统程序与原理图设计

[复制链接]
ID:229133 发表于 2022-4-29 18:04 | 显示全部楼层 |阅读模式
智能豆浆机控制系统设计

电路原理图如下:
51hei.png

单片机源程序如下:

  1. #include<reg51.h>
  2. #include"lcd.h"
  3. #include"oled.h"
  4. #include"temp.h"

  5. sbit IRIN=P2^0;



  6. sbit jr=P2^7;//加热
  7. sbit dj=P2^6;//
  8. sbit bj=P2^5;
  9. sbit fmq=P2^4;

  10. sbit aj1=P2^0;//
  11. sbit aj2=P2^1;//
  12. sbit aj3=P2^2;//
  13. sbit aj4=P2^3;//开始

  14. sbit yd=P3^5;
  15. sbit ed=P3^6;
  16. sbit sd=P3^7;

  17. sbit yw1=P1^1;//最低档
  18. sbit yw2=P1^2;
  19. sbit yw3=P1^3;


  20. unsigned char Time;
  21. void DelayMs(unsigned int );
  22. void LcdDisplay(int);
  23. /*******************************************************************************
  24. * 函数名         : main
  25. * 函数功能                   : 主函数
  26. * 输入           : 无
  27. * 输出                  : 无
  28. *******************************************************************************/
  29. unsigned char IrValue[6];          //用来存放读取到的红外值

  30. void delay(unsigned int a)
  31. {
  32.         while(a--)
  33.         {
  34.                 if(yw3==0)
  35.                 {
  36.                         while(1)
  37.                         {                                
  38.                                 fmq=bj=0;
  39.                                 if(yw2==0||yw1==0)
  40.                                 {
  41.                                         fmq=bj=1;
  42.                                         break;
  43.                                 }
  44.                         }
  45.                 }
  46.                 if(yw1==1&&yw2==1&&yw3==1)
  47.                 {
  48.                         while(1)
  49.                         {                                
  50.                                 fmq=bj=0;
  51.                                 if(yw2==0||yw1==0)
  52.                                 {
  53.                                         fmq=bj=1;
  54.                                         break;
  55.                                 }
  56.                         }
  57.                 }
  58.         }
  59. }

  60. void sdcx(unsigned char a)
  61. {
  62.         unsigned char i;
  63.         if(a==1)
  64.         {
  65.                 for(i=0;i<6;i++)
  66.                 {
  67.                         dj=0;delay(25000);
  68.                         dj=1;delay(25000);
  69.                 }
  70.         }
  71.         else if(a==2)
  72.         {
  73.                 for(i=0;i<6;i++)
  74.                 {
  75.                         
  76.                         dj=0;delay(12500);
  77.                         dj=1;delay(12500);
  78.                         
  79.                         dj=0;delay(12500);
  80.                         dj=1;delay(12500);
  81.                         
  82.                 }
  83.         }
  84.         else if(a==3)
  85.         {
  86.                 for(i=0;i<6;i++)
  87.                 {
  88.                         
  89.                         dj=0;delay(5000);
  90.                         dj=1;delay(5000);
  91.                         
  92.                         dj=0;delay(5000);
  93.                         dj=1;delay(5000);
  94.                         
  95.                         dj=0;delay(5000);
  96.                         dj=1;delay(5000);
  97.                         
  98.                         dj=0;delay(5000);
  99.                         dj=1;delay(5000);
  100.                         
  101.                         dj=0;delay(5000);
  102.                         dj=1;delay(5000);                        
  103.                 }
  104.         }
  105. }

  106. void main()
  107. {
  108.         uchar a=0,i=0,zt,ms,mbz=27,sl,sdbz;
  109.         uint Num=0;
  110.         OLED_Init();//初始化OLED
  111.         if(a==1)
  112.         {
  113.                 uchar b[]={0,0};
  114.                 LcdInit();
  115.                 OLED_ColorTurn(0);
  116.                 OLED_Display_On();
  117.                 OLED_Display_Off();
  118.                 OLED_DisplayTurn(0);
  119.                 OLED_ShowNum(0,0,1,1,16);
  120.                 OLED_ShowString(0,0,0,16);
  121.                 OLED_DrawBMP(0,0,10,10,b);
  122.                 LcdDisplay(10);
  123.         }
  124.         while(1)
  125.         {
  126. //                OLED_ShowChinese(40,0,0,16);//豆浆机
  127. //                OLED_ShowChinese(56,0,1,16);
  128. //                OLED_ShowChinese(72,0,2,16);
  129.                
  130.                 OLED_ShowChinese(0,2,3,16);//实时液位空
  131.                 OLED_ShowChinese(16,2,4,16);
  132.                 OLED_ShowChinese(32,2,9,16);
  133.                 OLED_ShowChinese(48,2,10,16);
  134.                 OLED_ShowChinese(64,2,16,16);
  135.                
  136.                 OLED_ShowNum(80,2,sl,1,16);//实时液位
  137.                 OLED_ShowChinese(96,2,16,16);
  138.                 OLED_ShowNum(112,2,3,1,16);
  139.                
  140.                 OLED_ShowChinese(0,4,7,16);//实时温度空
  141.                 OLED_ShowChinese(16,4,8,16);
  142.                 OLED_ShowChinese(32,4,5,16);
  143.                 OLED_ShowChinese(48,4,6,16);
  144.                 OLED_ShowChinese(64,4,16,16);
  145.                 Num=Ds18b20ReadTemp();
  146.                 Num=Num/10;
  147.                 OLED_ShowNum(80,4,Num,3,16);
  148.                
  149.                
  150.                
  151.                 OLED_ShowChinese(0,6,18,16);//模式
  152.                 OLED_ShowChinese(16,6,19,16);
  153.                 if(ms==1)OLED_ShowChinese(32,6,14,16);//干或这湿
  154.                 else if(ms==0)OLED_ShowChinese(32,6,15,16);
  155.                
  156.                 OLED_ShowNum(68,6,sdbz,3,16);
  157.                
  158.                 OLED_ShowChinese(0,0,11,16);
  159.                 OLED_ShowChinese(16,0,12,16);
  160.                 OLED_ShowChinese(32,0,13,16);
  161.                
  162.                 OLED_ShowNum(60,0,mbz,3,16);
  163.                
  164.                 switch(zt)
  165.                 {
  166.                         case 0:
  167.                                 break;
  168.                         case 1:
  169.                                 if(ms==0)
  170.                                 {
  171.                                         jr=0;
  172.                                         dj=0;
  173.                                        
  174.                                         for(i=0;i<20;i++)
  175.                                         {
  176.                                                 if(sdbz==1)
  177.                                                 {
  178.                                                         dj=0;delay(25000);
  179.                                                         dj=1;delay(25000);
  180.                                                 }
  181.                                                 else if(sdbz==2)
  182.                                                 {
  183.                                                         dj=0;delay(12500);
  184.                                                         dj=1;delay(12500);
  185.                                                         
  186.                                                         dj=0;delay(12500);
  187.                                                         dj=1;delay(12500);
  188.                                                         
  189.                                                 }
  190.                                                 else if(sdbz==3)
  191.                                                 {
  192.                                                         dj=0;delay(5000);
  193.                                                         dj=1;delay(5000);
  194.                                                         
  195.                                                         dj=0;delay(5000);
  196.                                                         dj=1;delay(5000);
  197.                                                         
  198.                                                         dj=0;delay(5000);
  199.                                                         dj=1;delay(5000);
  200.                                                         
  201.                                                         dj=0;delay(5000);
  202.                                                         dj=1;delay(5000);
  203.                                                         
  204.                                                         dj=0;delay(5000);
  205.                                                         dj=1;delay(5000);
  206.                                                 }
  207.                                         }
  208.                                         fmq=0;
  209.                                         dj=jr=1;
  210.                                         delay(30000);
  211.                                         fmq=bj=1;
  212.                                 }
  213.                                 if(ms==1)
  214.                                 {
  215.                                         unsigned char i,x;
  216.                                         for(i=0;i<5;i++)
  217.                                         {
  218.                                                 dj=0;jr=1;
  219.                                                 sdcx(sdbz);
  220.                                                 dj=1;jr=0;
  221.                         delay(50000);
  222.                         delay(50000);
  223.                         delay(50000);
  224.                         delay(50000);
  225.                                         }                                       
  226.                                         fmq=0;
  227.                                         delay(30000);
  228.                                         fmq=bj=1;
  229.                                 }
  230.                                 zt=2;
  231.                                 break;
  232.                         case 2:
  233.                                 if(Num>mbz)jr=1;
  234.                                 else jr=0;
  235.                                 break;
  236.                 }
  237.                 if(aj4==0)
  238.                 {
  239.                         zt=1;
  240.                 }
  241.                 if(zt==2)
  242.                 {
  243.                         if(aj1==0)
  244.                         {
  245.                                 if(mbz<100)mbz++;
  246.                                 while(aj1==0);
  247.                         }
  248.                         if(aj2==0)
  249.                         {
  250.                                 if(mbz>0)mbz--;
  251.                                 while(aj2==0);
  252.                         }
  253.                 }
  254.                 if(aj3==0)
  255.                 {
  256.                         if(ms==0)ms=1;
  257.                         else ms=0;
  258.                         while(aj3==0);
  259.                 }
  260.                 if(yd==0)sdbz=1;
  261.                 else if(ed==0)sdbz=2;
  262.                 else if(sd==0)sdbz=3;
  263.         
  264.                            
  265.                 if(yw1==0)sl=1;
  266.                 if(yw2==0)sl=2;
  267.                 if(yw3==0)sl=3;
  268.         
  269.                 if(yw1==1&&yw2==1&&yw3==1)sl=0;
  270.                 if(sl==3||sl==0)
  271.                 {
  272.                         while(1)
  273.                         {                                
  274.                                 fmq=bj=0;
  275.                                 if(yw2==0||yw1==0)
  276.                                 {
  277.                                         fmq=bj=1;
  278.                                         break;
  279.                                 }
  280.                         }
  281.                 }
  282.                 else fmq=bj=1;               
  283.         }
  284. }
  285. void DelayMs(unsigned int x)   //0.14ms误差 0us
  286. {
  287.         unsigned char i;
  288.         while(x--)
  289.         {
  290.                 for (i = 0; i<13; i++)
  291.                 {}
  292.         }
  293. }


  294. void ReadIr() interrupt 0
  295. {
  296.         unsigned char j,k;
  297.         unsigned int err;
  298.         Time=0;                                         
  299.         DelayMs(70);

  300.         if(IRIN==0)                //确认是否真的接收到正确的信号
  301.         {
  302.                 err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
  303.                 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  304.                 侯,程序死在这里*/        
  305.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
  306.                 {                        
  307.                         DelayMs(1);
  308.                         err--;
  309.                 }
  310.                 if(IRIN==1)                        //如果正确等到9ms低电平
  311.                 {
  312.                         err=500;
  313.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
  314.                         {
  315.                                 DelayMs(1);
  316.                                 err--;
  317.                         }
  318.                         for(k=0;k<4;k++)                //共有4组数据
  319.                         {                                
  320.                                 for(j=0;j<8;j++)        //接收一组数据
  321.                                 {

  322.                                         err=60;               
  323.                                         while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  324.                                         {
  325.                                                 DelayMs(1);
  326.                                                 err--;
  327.                                         }
  328.                                         err=500;
  329.                                         while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
  330.                                         {
  331.                                                 DelayMs(1);//0.14ms
  332.                                                 Time++;
  333.                                                 err--;
  334.                                                 if(Time>30)
  335.                                                 {
  336.                                                         EX0=1;
  337.                                                         return;
  338.                                                 }
  339.                                         }
  340.                                         IrValue[k]>>=1;         //k表示第几组数据
  341.                                         if(Time>=8)                        //如果高电平出现大于565us,那么是1
  342.                                         {
  343.                                                 IrValue[k]|=0x80;
  344.                                         }
  345.                                         Time=0;                //用完时间要重新赋值                                                        
  346.                                 }
  347.                         }
  348.                 }
  349.                 if(IrValue[2]!=~IrValue[3])
  350.                 {
  351.                         return;
  352.                 }
  353.         }                        
  354. }

  355. /*******************************************************************************
  356. * 函数名         : LcdDisplay()
  357. * 函数功能                   : LCD显示读取到的温度
  358. * 输入           : v
  359. * 输出                  : 无
  360. *******************************************************************************/

  361. void LcdDisplay(int temp)          //lcd显示
  362. {
  363.    
  364.           unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
  365.         float tp;  
  366.         if(temp< 0)                                //当温度值为负数
  367.           {
  368.                   LcdWriteCom(0x80);                //写地址 80表示初始地址
  369.             LcdWriteData('-');                  //显示负
  370.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  371.                 temp=temp-1;
  372.                 temp=~temp;
  373.                 tp=temp;
  374.                 temp=tp*0.0625*100+0.5;        
  375.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  376.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  377.                 //算由?.5,还是在小数点后面。

  378.           }
  379.          else
  380.           {                        
  381.                   LcdWriteCom(0x80);                //写地址 80表示初始地址
  382.             LcdWriteData('+');                 //显示正
  383.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  384.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  385.                 temp=tp*0.0625*100+0.5;        
  386.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  387.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  388.                 //算加上0.5,还是在小数点后面。
  389.         }
  390.         datas[0] = temp / 10000;
  391.         datas[1] = temp % 10000 / 1000;
  392.         datas[2] = temp % 1000 / 100;
  393.         datas[3] = temp % 100 / 10;
  394.         datas[4] = temp % 10;

  395.         LcdWriteCom(0x82);                  //写地址 80表示初始地址
  396.         LcdWriteData('0'+datas[0]); //百位

  397.         
  398.         LcdWriteCom(0x83);                 //写地址 80表示初始地址
  399.         LcdWriteData('0'+datas[1]); //十位

  400.         LcdWriteCom(0x84);                //写地址 80表示初始地址
  401.         LcdWriteData('0'+datas[2]); //个位

  402.         LcdWriteCom(0x85);                //写地址 80表示初始地址
  403.         LcdWriteData('.');                 //显示 ‘.’

  404.         LcdWriteCom(0x86);                 //写地址 80表示初始地址
  405.         LcdWriteData('0'+datas[3]); //显示小数点  

  406.         LcdWriteCom(0x87);                 //写地址 80表示初始地址
  407.         LcdWriteData('0'+datas[4]); //显示小数点  
  408. }
复制代码

Keil代码下载: 原理图+程序.7z (340.76 KB, 下载次数: 23)

评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表