久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2047|回復: 0
打印 上一主題 下一主題
收起左側

單片機智能豆漿機控制系統程序與原理圖設計

[復制鏈接]
跳轉到指定樓層
樓主
智能豆漿機控制系統設計

電路原理圖如下:


單片機源程序如下:

  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 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区视频 | 色婷婷精品 | 亚洲精品成人在线 | 激情91| 国产欧美一区二区三区在线看 | 亚洲成av人片在线观看 | 国产1区2区在线观看 | 亚洲国产精品日本 | 亚洲第一av | 国产免费一区二区三区最新6 | 中文字幕av色 | 国产精品一区二区福利视频 | 日韩久久综合网 | 日本不卡一区二区 | 国产激情一区二区三区 | 日韩精品在线一区 | 久久久久久综合 | 国产在线一区二区 | 91免费视频观看 | 亚洲综合色自拍一区 | 成人一区二区视频 | 麻豆视频国产在线观看 | 亚洲国产精品一区二区第一页 | 日本在线视频中文字幕 | www.夜夜草| 中文字幕亚洲区 | 羞羞视频网站免费看 | 日韩av在线一区二区三区 | 成人精品一区亚洲午夜久久久 | 久久男人天堂 | 中文精品一区二区 | 国产精品99久久久久久宅男 | 在线观看欧美日韩视频 | 久久久久久久国产 | 国产精品久久久久久久久久 | 鸳鸯谱在线观看高清 | 在线三级电影 | 日韩欧美一区在线 | 日韩av成人在线观看 | 国产免费拔擦拔擦8x高清 | 人人看人人爽 |