找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4363|回復(fù): 4
收起左側(cè)

51單片機(jī)智能控制洗衣機(jī)程序+仿真(根據(jù)污泥度和油脂度計(jì)算電動(dòng)機(jī)的轉(zhuǎn)動(dòng)時(shí)間)

  [復(fù)制鏈接]
ID:232052 發(fā)表于 2019-1-23 18:31 | 顯示全部樓層 |閱讀模式
用智能控制的算法實(shí)現(xiàn)的,三角形隸屬函數(shù),輸入為污泥度和油脂度,輸出為電動(dòng)機(jī)的轉(zhuǎn)動(dòng)時(shí)間,程序都有詳細(xì)標(biāo)注

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

單片機(jī)源程序如下:
  1. /**********
  2.         論域e ec u  規(guī)則r
  3.         e[e_length]    e_length  5+1  //第一個(gè)輸入變量表的長(zhǎng)度
  4.         ec[ec_length]  ec_length 5+1                //第二個(gè)輸入變量表的長(zhǎng)度
  5.         u[]
  6.         r[r_Line_width][r_Column_width]   r_Line_width   5 //規(guī)則表的行
  7.                                                                                                                                                 r_Column_width 5//規(guī)則表的列
  8.         //等級(jí)表自動(dòng)生成的
  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;//第一個(gè)電壓的等級(jí)
  13.         unsigned char y;//第二個(gè)電壓的等級(jí)
  14.         unsigned char z;//輸出等級(jí)
  15. *************/
  16. #include <REG52.H>//頭文件

  17. #include "TLC2543.h"
  18. #define uchar unsigned char//宏定義
  19. #define uint  unsigned int
  20. /*******************************數(shù)碼表****************************/
  21. unsigned char code Tab[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //數(shù)碼管顯示0~9的段碼表
  22. /************修改長(zhǎng)度區(qū)****************************/
  23. //論域的長(zhǎng)度
  24. #define e_length  5+1  //e的長(zhǎng)度
  25. #define ec_length 5+1                //第二個(gè)輸入變量表的長(zhǎng)度
  26. #define  u_length  5
  27. //規(guī)則表的行列
  28. #define r_Line_width   5 //規(guī)則表的行
  29. #define r_Column_width 5//規(guī)則表的列
  30. /*************論域表****************************/
  31.                                                                                                         //   0    1     2   3     4
  32. double code e[e_length]  ={0,   0.7,  2.0,  3.0,  4.2,  5};//5個(gè)范圍6個(gè)數(shù)代表實(shí)際輸入電壓
  33. double code ec[ec_length]={0,   0.7,  2.0,  3.0,  4.2,  5};//5個(gè)范圍6個(gè)數(shù)
  34. unsigned char code u[u_length]={28,34,40,46,52};
  35. /*************論域等級(jí)表****************************/
  36. unsigned char e_level[e_length-1]={0};//等級(jí)表自動(dòng)生成的
  37. unsigned char ec_level[ec_length-1]={0};
  38. unsigned char u_level[u_length]={0};
  39. /*****************規(guī)則表**************************/
  40. unsigned char r[r_Line_width][r_Column_width]=   //規(guī)則表(里面的數(shù)據(jù)代表的輸出等級(jí))
  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. //兩個(gè)輸入和一個(gè)輸出得等級(jí)
  49. unsigned char x;//第一個(gè)電壓的等級(jí)
  50. unsigned char y;//第二個(gè)電壓的等級(jí)
  51. unsigned char z;//輸出等級(jí)
  52. //兩個(gè)真實(shí)的電壓
  53. double e_u;
  54. double ec_u;
  55. unsigned char u_t;//電動(dòng)機(jī)轉(zhuǎn)動(dòng)時(shí)間

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

  59. unsigned char int_time;        //記錄中斷次數(shù)
  60. unsigned char second;        //儲(chǔ)存秒
  61. unsigned char second1;        //儲(chǔ)存秒
  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;//進(jìn)水燈
  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;//進(jìn)水閥門
  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.         //將兩個(gè)輸入的論域分為等級(jí)存在兩個(gè)表中分別為01234....
  85.         uchar i=0;
  86.         uchar j=0;
  87.         uchar t;
  88.         //等級(jí)i分為01234
  89.         for(i=0;i<e_length-1;i++)//循環(huán)01234
  90.         {
  91.                         e_level[i]=i;                //存進(jìn)去表01234
  92.                         if ( (e_local[i]<e_u) && (e_u<=e_local[i+1]) )    //e電壓大于第0個(gè)數(shù)小于第一個(gè)數(shù)
  93.                         x=i;                                                                                                                                                                                        //  x等級(jí)為0
  94.         }
  95.         
  96.         //等級(jí)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個(gè)數(shù)小于第一個(gè)數(shù)
  101.                                 y=j;                                                                                                                                                                        // y等級(jí)為0               
  102.         }        
  103.         z=r_local[x][y];//確定輸出z的等級(jí)(查找規(guī)則)等級(jí)輸出為12345
  104.         t=u[z-1];//輸出電動(dòng)機(jī)轉(zhuǎn)動(dòng)的時(shí)間//等級(jí)輸出01234所對(duì)應(yīng)的時(shí)間
  105.         return t;
  106. }
  107. //延時(shí)函數(shù)
  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. //顯示函數(shù)
  126. void DisplaySecond(unsigned char k)
  127. {
  128.    
  129.                 sm1=0;        //P2.6引腳輸出低電平, DS6點(diǎn)亮
  130.                 P1=Tab[k/10];          //顯示十位
  131.                 delay2();
  132.                 delay2();
  133.                 sm1=1;
  134.                 sm2=0;       //P2.7引腳輸出低電平, DS7點(diǎn)亮
  135.                 P1=Tab[k%10];         //顯示個(gè)位
  136.                 delay2();
  137.                 delay2();
  138.                 P3=0xff;     //關(guān)閉所有數(shù)碼管
  139.                 P1=1;        //顯示個(gè)位
  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.         //洗滌的時(shí)間
  165.         while(1)
  166.         {        
  167.                         //每20代表真實(shí)的一秒
  168.                 if(tt>=Washing_time_sec*20) break; //洗滌時(shí)間總共是Washing_time_sec秒  時(shí)間到了退出循環(huán)
  169.                 t=0;
  170.                 //正轉(zhuǎn)2s        
  171.                 while(t<40&&tt<=Washing_time_sec*20)
  172.                 {        
  173.                         p31=0;
  174.                         p30=1;        //正轉(zhuǎn) 2s
  175.                         DisplaySecond(second);
  176.                 }
  177.                 t=0;
  178.                 //反轉(zhuǎn) 2s        
  179.                 while(t<40&&tt<=400)
  180.                 {
  181.                         p30=0;
  182.                         p31=1;
  183.                         DisplaySecond(second);
  184.                 }
  185.         }
  186.                 //停止轉(zhuǎn)動(dòng)
  187.                 p30=0;
  188.                 p31=0;        

  189. }
  190. void out_water()
  191. {
  192.         p30=0;
  193.         p31=0;
  194.         out_led=1;        //排水閥燈亮 等待霍爾開(kāi)關(guān)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;//進(jìn)水燈亮起
  204.         while(Upper_leve);//等待
  205.         if(Upper_leve==0)//進(jìn)水完畢
  206.         in_led=0;//進(jìn)水燈關(guān)閉
  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 兩次進(jìn)出水共計(jì)6s 所以兩次洗滌  (u_t-14)/2
  225.         in_water();                    //等待進(jìn)水完畢才往下走
  226.         Washing((u_t-14)/2);                     //洗滌10S
  227.         out_water();                                                                //洗滌結(jié)束開(kāi)始排水//等待排水排干再繼續(xù)往下走
  228.         drying(4);                                                                         //甩干4s
  229.         in_water();                                                                                //進(jìn)水開(kāi)始等待進(jìn)水結(jié)束
  230.         Washing((u_t-14)/2);                                                        //漂洗10S
  231.         out_water();               //漂洗結(jié)束開(kāi)始排水//等待排水排干再繼續(xù)往下走
  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);//輸入?yún)?shù)為e  ec 和r
  240.                 //真實(shí)得到電壓小數(shù)   第一個(gè)電壓
  241.                 //小數(shù)兩位b=(uint)(e_u*1000)%1000/10
  242.                 //整數(shù)一位a=(uint)(e_u*1000)/1000
  243.                 ad_value1=(read2543(0)*5000.0)/4095;//第一通道//輸出電壓是一個(gè)4位整數(shù)
  244.                 e_u=ad_value1/1000.0;   

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

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

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


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

  280. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:247166 發(fā)表于 2019-1-24 19:01 | 顯示全部樓層
太好了,謝謝
回復(fù)

使用道具 舉報(bào)

ID:506687 發(fā)表于 2019-4-8 18:01 | 顯示全部樓層

這個(gè)真的能夠做出來(lái)東西嗎?里面的文件齊不齊全呢?適合小白嗎?
回復(fù)

使用道具 舉報(bào)

ID:477512 發(fā)表于 2019-5-17 11:11 | 顯示全部樓層
已經(jīng)下載,謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:67838 發(fā)表于 2023-8-31 01:13 | 顯示全部樓層

已經(jīng)下載,謝謝分享!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表