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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機智能控制洗衣機程序+仿真(根據污泥度和油脂度計算電動機的轉動時間)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:232052 發表于 2019-1-23 18:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用智能控制的算法實現的,三角形隸屬函數,輸入為污泥度和油脂度,輸出為電動機的轉動時間,程序都有詳細標注

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. /**********
  2.         論域e ec u  規則r
  3.         e[e_length]    e_length  5+1  //第一個輸入變量表的長度
  4.         ec[ec_length]  ec_length 5+1                //第二個輸入變量表的長度
  5.         u[]
  6.         r[r_Line_width][r_Column_width]   r_Line_width   5 //規則表的行
  7.                                                                                                                                                 r_Column_width 5//規則表的列
  8.         //等級表自動生成的
  9.         unsigned char e_level[e_length-1]={0};
  10.         unsigned char ec_level[ec_length]={0};
  11.         unsigned char u_level[u_level_length]={0};

  12.         unsigned char x;//第一個電壓的等級
  13.         unsigned char y;//第二個電壓的等級
  14.         unsigned char z;//輸出等級
  15. *************/
  16. #include <REG52.H>//頭文件

  17. #include "TLC2543.h"
  18. #define uchar unsigned char//宏定義
  19. #define uint  unsigned int
  20. /*******************************數碼表****************************/
  21. unsigned char code Tab[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //數碼管顯示0~9的段碼表
  22. /************修改長度區****************************/
  23. //論域的長度
  24. #define e_length  5+1  //e的長度
  25. #define ec_length 5+1                //第二個輸入變量表的長度
  26. #define  u_length  5
  27. //規則表的行列
  28. #define r_Line_width   5 //規則表的行
  29. #define r_Column_width 5//規則表的列
  30. /*************論域表****************************/
  31.                                                                                                         //   0    1     2   3     4
  32. double code e[e_length]  ={0,   0.7,  2.0,  3.0,  4.2,  5};//5個范圍6個數代表實際輸入電壓
  33. double code ec[ec_length]={0,   0.7,  2.0,  3.0,  4.2,  5};//5個范圍6個數
  34. unsigned char code u[u_length]={28,34,40,46,52};
  35. /*************論域等級表****************************/
  36. unsigned char e_level[e_length-1]={0};//等級表自動生成的
  37. unsigned char ec_level[ec_length-1]={0};
  38. unsigned char u_level[u_length]={0};
  39. /*****************規則表**************************/
  40. unsigned char r[r_Line_width][r_Column_width]=   //規則表(里面的數據代表的輸出等級)
  41. {
  42.         1,1,2,3,4,
  43.         1,2,3,4,5,
  44.         2,3,3,4,5,
  45.         3,4,4,5,5,
  46.         4,5,5,5,5
  47. };

  48. //兩個輸入和一個輸出得等級
  49. unsigned char x;//第一個電壓的等級
  50. unsigned char y;//第二個電壓的等級
  51. unsigned char z;//輸出等級
  52. //兩個真實的電壓
  53. double e_u;
  54. double ec_u;
  55. unsigned char u_t;//電動機轉動時間

  56. //tlc2543讀取的兩個電壓
  57. uint ad_value1=0;
  58. uint ad_value2=0;

  59. unsigned char int_time;        //記錄中斷次數
  60. unsigned char second;        //儲存秒
  61. unsigned char second1;        //儲存秒
  62. uint t=0,tt=0;
  63. uint t1=0,tt1=0;
  64. //按鍵定義
  65. sbit k_start=P0^7;
  66. sbit k_stop=P0^6;
  67. sbit k3=P0^2;
  68. sbit sg=P0^3;

  69. sbit Upper_leve=P0^4;//上液位
  70. sbit Lower_level=P0^5;//下液位

  71. sbit ledon=P0^7;

  72. sbit washing_led=P2^0;//洗滌燈
  73. sbit drying_led=P2^1;//甩干燈

  74. sbit in_led=P2^5;//進水燈
  75. sbit out_led=P2^6;//排水燈

  76. sbit p30=P3^0;
  77. sbit p31=P3^1;

  78. sbit beepon=P2^7;//蜂鳴器

  79. sbit sm1=P3^6;//進水閥門
  80. sbit sm2=P3^7;//出水閥門
  81. void DisplaySecond(unsigned char k);
  82. unsigned char rule_process(double e_local[e_length] ,double ec_local[ec_length],unsigned char r_local[r_Line_width][r_Column_width])
  83. {
  84.         //將兩個輸入的論域分為等級存在兩個表中分別為01234....
  85.         uchar i=0;
  86.         uchar j=0;
  87.         uchar t;
  88.         //等級i分為01234
  89.         for(i=0;i<e_length-1;i++)//循環01234
  90.         {
  91.                         e_level[i]=i;                //存進去表01234
  92.                         if ( (e_local[i]<e_u) && (e_u<=e_local[i+1]) )    //e電壓大于第0個數小于第一個數
  93.                         x=i;                                                                                                                                                                                        //  x等級為0
  94.         }
  95.         
  96.         //等級j分為01234
  97.         for(j=0;j<ec_length-1;j++)
  98.         {        

  99.                         ec_level[j]=j;        
  100.                         if ( (ec_local[j]<ec_u) && (ec_u<=ec_local[j+1]) )  //ec電壓大于第0個數小于第一個數
  101.                                 y=j;                                                                                                                                                                        // y等級為0               
  102.         }        
  103.         z=r_local[x][y];//確定輸出z的等級(查找規則)等級輸出為12345
  104.         t=u[z-1];//輸出電動機轉動的時間//等級輸出01234所對應的時間
  105.         return t;
  106. }
  107. //延時函數
  108. void delay2(void)
  109. {
  110.         unsigned char m;
  111.         for(m=0;m<200;m++);
  112. }

  113. void delay1(int s)
  114. {
  115.         int i;
  116.         for(;s>0;s--)
  117.         for(i=0;i<65;i++);
  118. }

  119. void delay(uint i)
  120. {
  121.         uchar j;
  122.         for(i;i>0;i--)
  123.         for(j=255;j>0;j--);
  124. }
  125. //顯示函數
  126. void DisplaySecond(unsigned char k)
  127. {
  128.    
  129.                 sm1=0;        //P2.6引腳輸出低電平, DS6點亮
  130.                 P1=Tab[k/10];          //顯示十位
  131.                 delay2();
  132.                 delay2();
  133.                 sm1=1;
  134.                 sm2=0;       //P2.7引腳輸出低電平, DS7點亮
  135.                 P1=Tab[k%10];         //顯示個位
  136.                 delay2();
  137.                 delay2();
  138.                 P3=0xff;     //關閉所有數碼管
  139.                 P1=1;        //顯示個位
  140.                 delay2();
  141.                 delay2();
  142. }

  143. //響蜂鳴器程序
  144. void beep()
  145. {
  146.         p30=0;
  147.         p31=0;
  148.         t=0;
  149.         while(1)
  150.         {
  151.                 beepon^=1;
  152.                 delay(300);
  153.                 if(t>=80) break;
  154.         }
  155.         beepon=0;

  156. }
  157.   
  158. void Washing(uint Washing_time_sec)
  159. {         

  160.         t=0;
  161.         tt=0;        
  162.         int_time=0;
  163.         second=Washing_time_sec;
  164.         //洗滌的時間
  165.         while(1)
  166.         {        
  167.                         //每20代表真實的一秒
  168.                 if(tt>=Washing_time_sec*20) break; //洗滌時間總共是Washing_time_sec秒  時間到了退出循環
  169.                 t=0;
  170.                 //正轉2s        
  171.                 while(t<40&&tt<=Washing_time_sec*20)
  172.                 {        
  173.                         p31=0;
  174.                         p30=1;        //正轉 2s
  175.                         DisplaySecond(second);
  176.                 }
  177.                 t=0;
  178.                 //反轉 2s        
  179.                 while(t<40&&tt<=400)
  180.                 {
  181.                         p30=0;
  182.                         p31=1;
  183.                         DisplaySecond(second);
  184.                 }
  185.         }
  186.                 //停止轉動
  187.                 p30=0;
  188.                 p31=0;        

  189. }
  190. void out_water()
  191. {
  192.         p30=0;
  193.         p31=0;
  194.         out_led=1;        //排水閥燈亮 等待霍爾開關2
  195.         while(Lower_level);
  196.         if(Lower_level==0)  //如果閉合
  197.         out_led=0;        //排水燈滅
  198. }

  199. void in_water()
  200. {
  201.         p30=0;
  202.         p31=0;
  203.         in_led=1;//進水燈亮起
  204.         while(Upper_leve);//等待
  205.         if(Upper_leve==0)//進水完畢
  206.         in_led=0;//進水燈關閉
  207. }

  208. void drying(uint Drying_time)
  209. {

  210.         t=0;
  211.         int_time=0;
  212.         DisplaySecond(0);
  213.         second=Drying_time;
  214.         while(t<=Drying_time*20)
  215.         {        
  216.         p31=0;
  217.         p30=1;        
  218.         if(second>=0)
  219.         DisplaySecond(second);
  220.         }
  221. }

  222. void work()
  223. {  
  224.         //甩干占4s  兩次占8s 兩次進出水共計6s 所以兩次洗滌  (u_t-14)/2
  225.         in_water();                    //等待進水完畢才往下走
  226.         Washing((u_t-14)/2);                     //洗滌10S
  227.         out_water();                                                                //洗滌結束開始排水//等待排水排干再繼續往下走
  228.         drying(4);                                                                         //甩干4s
  229.         in_water();                                                                                //進水開始等待進水結束
  230.         Washing((u_t-14)/2);                                                        //漂洗10S
  231.         out_water();               //漂洗結束開始排水//等待排水排干再繼續往下走
  232.         drying(4);         
  233.         beep();
  234. }

  235. void Read_voltage()
  236. {
  237.                 //                        e_u=3;  //輸入電壓
  238.                 //                        ec_u=4; //輸入電壓
  239.                 //                        u_t=rule_process(e,ec,r);//輸入參數為e  ec 和r
  240.                 //真實得到電壓小數   第一個電壓
  241.                 //小數兩位b=(uint)(e_u*1000)%1000/10
  242.                 //整數一位a=(uint)(e_u*1000)/1000
  243.                 ad_value1=(read2543(0)*5000.0)/4095;//第一通道//輸出電壓是一個4位整數
  244.                 e_u=ad_value1/1000.0;   

  245.                 ad_value2=(read2543(1)*5000.0)/4095;//第二通道//輸出電壓是一個4位整數
  246.                 ec_u=ad_value2/1000.0;                    //第二個電壓

  247. }
  248. int main(void)
  249. {         

  250.   TMOD=0x01;       //方式1 16位計數器
  251.   TH0=-50000/256;   //設定初值
  252.   TL0=-50000%256;
  253.   EA=1;               //開總中斷
  254.   ET0=1;             //開定時器0中斷
  255.   TR0=1;             //啟動定時器0
  256.   P2=0;
  257.   int_time=0;     //中斷次數初始化
  258.   second=00;           //秒初始化
  259.          while(1)
  260.     {               
  261.                                 if(k_start==0)        
  262.                                 {
  263.                                         while(1)
  264.                                         {
  265.                                                 Read_voltage();             //將兩個的電壓讀入到e_u ec_u
  266.                                                 u_t=rule_process(e,ec,r);  //輸入參數為e  ec 和r
  267.                                                 work();
  268.                                         }
  269.                                 
  270.                                 }
  271.                                        
  272.                                 
  273. //                                DisplaySecond(u_t);        //顯示出應該輸出的電機轉動的時間        
  274. }
  275.         return 0;
  276. }  


  277. void time0() interrupt 1 using 1
  278. {  
  279. ……………………

  280. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
程序加仿真洗衣機版本五.rar (161.4 KB, 下載次數: 150)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:247166 發表于 2019-1-24 19:01 | 只看該作者
太好了,謝謝
回復

使用道具 舉報

板凳
ID:506687 發表于 2019-4-8 18:01 | 只看該作者

這個真的能夠做出來東西嗎?里面的文件齊不齊全呢?適合小白嗎?
回復

使用道具 舉報

地板
ID:477512 發表于 2019-5-17 11:11 | 只看該作者
已經下載,謝謝分享!
回復

使用道具 舉報

5#
ID:67838 發表于 2023-8-31 01:13 | 只看該作者

已經下載,謝謝分享!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人免费 | 欧美国产日韩在线 | japanhd美女动 | 亚洲欧美日韩一区 | av香蕉| 欧美日韩国产高清视频 | 国产激情在线观看视频 | 日韩一区二区三区在线看 | 欧美精品日韩精品国产精品 | 国产91在线 | 亚洲 | 欧美日韩综合视频 | 在线观看成人精品 | 一区二区在线免费观看视频 | 亚洲视频中文字幕 | 国产一区二区视频在线观看 | 97精品国产97久久久久久免费 | 成年人视频免费在线观看 | 亚洲精品1区2区3区 91免费看片 | 国产精品久久在线 | 天堂亚洲网| 精品欧美乱码久久久久久 | 日韩伦理电影免费在线观看 | 三级免费| 国产视频福利一区 | 日本午夜在线视频 | 国产成人精品免费视频大全最热 | 欧美一区二区三区视频在线观看 | 日韩欧美一区二区三区免费观看 | 色综合天天综合网国产成人网 | 淫片专区 | 亚洲毛片在线 | 91在线精品一区二区 | 欧美5区| 国产精品区二区三区日本 | 欧美最猛黑人xxxx黑人 | 亚洲视频一区在线 | 国产亚洲欧美在线 | 国产婷婷色综合av蜜臀av | 国产第1页 | 日韩精品福利 | 成人免费视频7777777 |