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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2047|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機智能豆?jié){機控制系統(tǒng)程序與原理圖設(shè)計

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:229133 發(fā)表于 2022-4-29 18:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
智能豆?jié){機控制系統(tǒng)設(shè)計

電路原理圖如下:


單片機源程序如下:

  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. * 函數(shù)名         : main
  25. * 函數(shù)功能                   : 主函數(shù)
  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);//豆?jié){機
  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.                 /*當(dāng)兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
  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組數(shù)據(jù)
  319.                         {                                
  320.                                 for(j=0;j<8;j++)        //接收一組數(shù)據(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表示第幾組數(shù)據(jù)
  341.                                         if(Time>=8)                        //如果高電平出現(xiàn)大于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. * 函數(shù)名         : LcdDisplay()
  357. * 函數(shù)功能                   : LCD顯示讀取到的溫度
  358. * 輸入           : v
  359. * 輸出                  : 無
  360. *******************************************************************************/

  361. void LcdDisplay(int temp)          //lcd顯示
  362. {
  363.    
  364.           unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
  365.         float tp;  
  366.         if(temp< 0)                                //當(dāng)溫度值為負數(shù)
  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.                 //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
  376.                 //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  377.                 //算由?.5,還是在小數(shù)點后面。

  378.           }
  379.          else
  380.           {                        
  381.                   LcdWriteCom(0x80);                //寫地址 80表示初始地址
  382.             LcdWriteData('+');                 //顯示正
  383.                 tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  384.                 //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
  385.                 temp=tp*0.0625*100+0.5;        
  386.                 //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
  387.                 //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  388.                 //算加上0.5,還是在小數(shù)點后面。
  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]); //顯示小數(shù)點  

  406.         LcdWriteCom(0x87);                 //寫地址 80表示初始地址
  407.         LcdWriteData('0'+datas[4]); //顯示小數(shù)點  
  408. }
復(fù)制代碼

Keil代碼下載: 原理圖+程序.7z (340.76 KB, 下載次數(shù): 23)

評分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲日韩欧美一区二区在线 | 欧美操操操 | 国产综合欧美 | 国产亚洲成av人在线观看导航 | 91电影 | 91精品国产91久久久久福利 | 婷婷中文在线 | 成人久久久 | 国产一区二区三区 | 国产一区久久 | 亚洲午夜精品视频 | 国产精品日韩 | 国产网站在线免费观看 | 黄色大片免费看 | 黑人巨大精品欧美一区二区免费 | 国产精品久久福利 | 最新中文字幕第一页视频 | 毛片一区二区三区 | 国产乱码一二三区精品 | 91九色在线观看 | 狠狠涩 | av片在线免费看 | 欧美日韩在线视频一区 | 国产午夜精品一区二区三区嫩草 | 人人99| a级免费观看视频 | 亚洲三级免费看 | 成人av影院 | 天天综合国产 | 美女一级毛片 | 手机在线观看 | 日本大香伊一区二区三区 | 视频一二区 | 亚洲一区二区三区视频 | 国内精品免费久久久久软件老师 | 欧美日韩亚洲系列 | 自拍视频一区二区三区 | 国产精品成人在线播放 | 91精品国产一区 | 国产精品视频导航 | 九九视频在线观看 |