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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

洗衣機控制器AD電路圖+PCB+單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
Altium Designer畫的洗衣機控制器原理圖和PCB圖如下:(51hei附件中可下載工程文件)
  1. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  2. #include<intrins.h>                //因為要用到左右移函數,所以加入這個頭文件




  3. typedef unsigned int u16;          //對數據類型進行聲明定義
  4. typedef unsigned char u8;

  5. sbit MOTOA = P1^0;//步進機控制
  6. sbit MOTOB = P1^1;
  7. sbit MOTOC = P1^2;
  8. sbit MOTOD = P1^3;
  9. sbit k1    = P3^2;//按鍵 定時
  10. sbit k2    = P3^1;//按鍵 啟動
  11. sbit k3    = P3^3;
  12. sbit LSA   =P2^2;    //段選
  13. sbit LSB   =P2^3;
  14. sbit LSC   =P2^4;
  15. sbit beep  =P2^0;   //蜂鳴器

  16. sbit right =P2^5;    //燈顯示狀態
  17. sbit opposite=P2^6;
  18. sbit stort =P2^7;
  19. #define speed1 1
  20. #define speed2 2
  21. #define speed3 3

  22. u8 code FFW[]=
  23. {
  24.         0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
  25. };                                            //反轉

  26. u8 code REV[]=
  27. {
  28.         0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01
  29. };                                             //正轉   

  30. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  31.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

  32. u8 DisplayData[8];
  33.                                        
  34. u16 i,second = 0,time=0,start=0,X,Y,Z=0,f,fengtime=0,fengstop_sign=0,interval=speed1,num=0;

  35. void delay(u16 i)
  36. {
  37.       
  38.         while(i--);


  39. }


  40. void delay2ms500us(void)   //誤差 0us
  41. {
  42.     unsigned char a,b;
  43.     for(b=227;b>0;b--)
  44.         for(a=4;a>0;a--);
  45. }



  46. void delay2ms(void)   //誤差 0us
  47. {
  48.     u8 a,b;
  49.     for(b=4;b>0;b--)
  50.         for(a=248;a>0;a--);
  51.     _nop_();  //if Keil,require use intrins.h
  52. }


  53. void delay1ms200us(void)   //誤差 0us
  54. {
  55.     unsigned char a,b;
  56.     for(b=171;b>0;b--)
  57.         for(a=2;a>0;a--);
  58. }



  59. void keyprosk2()
  60. {
  61.         if(k2==0)                  //檢測按鍵K2是否按下
  62.         {      
  63.                 delay(1000);   //消除抖動 一般大約10ms
  64.                 if(k2==0)         //再次判斷按鍵是否按下
  65.                 {
  66.                         time=start;          //啟動鍵賦值
  67.                        
  68.                 }
  69.                 while(!k2);         //檢測按鍵是否松開
  70.         }               
  71. }

  72. void keyprosk3()                   //控制轉速  三檔轉速
  73. {
  74.         static u16 speed=1,m=0; //m是過濾第一次進來的第一檔(因為interval初值是185
  75.                                                    //第一次換擋需要按兩次才能進入二檔) 所以消掉
  76.         if(k3==0)                  //檢測按鍵K2是否按下
  77.         {      
  78.                 delay(1900);   //消除抖動 一般大約10ms
  79.                 if(k3==0)         //再次判斷按鍵是否按下
  80.                 {
  81.                         if(speed==4)                              
  82.                         {
  83.                                 speed=1;
  84.                         }
  85.                         if(interval==speed1&&m==0)
  86.                         {
  87.                                 speed=2;
  88.                         }
  89.                         switch(speed)
  90.                         {
  91.                                 case(1):
  92.                                 interval=speed1; break;
  93.                                 case(2):
  94.                                 interval=speed2; break;
  95.                                 case(3):
  96.                                 interval=speed3; break;
  97.                         }
  98.                        
  99.                 }
  100.                 while(!k3);                //檢測按鍵是否松開
  101.                 speed++;
  102.                 m++;
  103.         }               
  104. }
  105. void tiaosu()  //調速函數
  106. {
  107.         if(interval==1)
  108.         {
  109.                 delay1ms200us();
  110.         }
  111.         if(interval==2)
  112.         {
  113.                 delay2ms();
  114.         }
  115.         if(interval==3)
  116.         {
  117.                 delay2ms500us();
  118.         }
  119. }
  120. void Timer0() interrupt 1
  121. {
  122.         static u16 i;
  123.         TH0=0XFC;        //給定時器賦初值,定時1ms
  124.         TL0=0X18;
  125.         i++;
  126.         if(i==1000)
  127.         {
  128.                 i=0;
  129.                 if(time>0)
  130.                 {
  131.                         time --;
  132.                         second ++;
  133.                 }
  134.                 if(fengstop_sign==1) //時間到后 開始計時 3秒后蜂鳴器停止響
  135.                 {
  136.                         fengtime++;
  137.                 }
  138.                
  139.         }
  140. }
  141. void Int0()        interrupt 0      
  142. {
  143.         if(k1==0)                  //檢測按鍵k1是否按下
  144.         {      
  145.                 delay(1900);   //消除抖動 一般約10ms
  146.                 if(k1==0)         //再次判斷按鍵是否按下
  147.                 {
  148.                         start=start+60;
  149.                         second=0;
  150.                 }
  151.                 while(!k1);         //檢測按鍵是否松開
  152.         }
  153. }

  154. void DigDisplay()
  155. {
  156.         u8 i;
  157.         for(i=0;i<8;i++)
  158.         {
  159.                 switch(i)         //位選,選擇點亮的數碼管,
  160.                 {
  161.                         case(0):
  162.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  163.                         case(1):
  164.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  165.                         case(2):
  166.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  167.                         case(3):
  168.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  169.                         case(4):
  170.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  171.                         case(5):
  172.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  173.                         case(6):
  174.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  175.                         case(7):
  176.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位      
  177.                 }
  178.                 P0=DisplayData[i];//發送段碼
  179.                 delay(100); //間隔一段時間掃描      
  180.                 P0=0x00;//消隱
  181.         }
  182. }

  183. void Timer0Init()
  184. {
  185.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
  186.         IT0=0;//低電平觸發
  187.         EX0=1;//打開外部中斷0
  188.         TH0=0XFC;        //給定時器賦初值,定時1ms
  189.         TL0=0X18;      
  190.         ET0=1;//打開定時器0中斷允許
  191.         EA=1;//打開總中斷
  192.         TR0=1;//打開定時器                       
  193. }



  194. void wash_finalstop()
  195.         {
  196.                 MOTOA = 0;
  197.                 MOTOB = 0;
  198.                 MOTOC = 0;
  199.                 MOTOD = 0;
  200.                 right = 1;
  201.                 opposite=1;
  202.                 stort =0;
  203.                
  204.                
  205.         }

  206. void washstop()
  207.         {
  208.                 MOTOA = 0;
  209.                 MOTOB = 0;
  210.                 MOTOC = 0;
  211.                 MOTOD = 0;
  212.                 right = 1;
  213.                 opposite=1;
  214.                 stort =0;
  215.       
  216.         }


  217. void washright()
  218. {
  219.         u8 j;

  220.                  for(j=0;j<8;j++)
  221.                 {
  222.                         
  223.                         P1 = REV[j];
  224.                         tiaosu();
  225.                        
  226.                        
  227.                 }


  228.                        
  229.       
  230.                 right = 0;
  231.                 opposite=1;
  232.                 stort =1;
  233.       
  234.                
  235. }

  236. void washopposite()
  237. {
  238.         u8 j;

  239.                  for(j=0;j<8;j++)
  240.                 {      
  241.                         P1 = FFW[j];
  242.                         tiaosu();
  243.                 }
  244.                        
  245.       
  246.                 right = 1;
  247.                 opposite=0;
  248.                 stort =1;
  249.       
  250. }


  251. void main()
  252. {      
  253.       
  254.         Timer0Init();
  255.       
  256.         P1=0X00;
  257.       
  258.         while(1)
  259.         {      
  260.                
  261.                 if(time>0&&((second%60)<20))
  262.                 {
  263.                         washright();                                       
  264.                 }
  265.                                                
  266.                 else if(time>0&&((second%60)<30))
  267.                 {
  268.                         washstop();
  269.                                        
  270.                 }
  271.                
  272.                 else if(time>0&&((second%60)<50))
  273.                 {
  274.                         washopposite();
  275.         }
  276.                
  277.                 else if(time>0&&((second%60)<60))
  278.                 {
  279.                         washstop();
  280.                               
  281.                 }
  282.                 else
  283.                 {
  284.                        
  285.                        
  286.                        
  287.                        
  288.                 }
  289.                
  290.                        
  291.                         DisplayData[0] = smgduan[((start/60)-(second/60)) % 100 / 10];
  292.                         DisplayData[1] = smgduan[((start/60)-(second/60)) %10];
  293.                         DisplayData[2] = 0x00;
  294.                         DisplayData[3] = 0x00;
  295.                         DisplayData[4] = 0x00;
  296.                         DisplayData[5] = 0x00;
  297.                         DisplayData[6] = 0x00;
  298.                         DisplayData[7] = 0x00;
  299.                         DigDisplay();
  300.                         keyprosk2();
  301.                         keyprosk3();
  302.                                        
  303.                                         if(time==0&&start>0&&second>0)
  304.                                         {
  305.                                                 fengstop_sign=1;
  306.                                                
  307.                                         }
  308.                                         if(fengstop_sign==1)   //判斷是時間到了才停止蜂鳴 而不是一開始蜂鳴器就響
  309.                                                 {
  310.                                                         wash_finalstop();
  311.                                                         beep=0;                       
  312.                                                         while(1)
  313.                                                         {
  314.                                                                 DisplayData[0] = smgduan[((start/60)-(second/60)) % 100 / 10];
  315.                                                                 DisplayData[1] = smgduan[((start/60)-(second/60)) %10];
  316.                                                                 DisplayData[2] = 0x00;
  317.                                                                 DisplayData[3] = 0x00;
  318.                                                                 DisplayData[4] = 0x00;
  319.                                                                 DisplayData[5] = 0x00;
  320.                                                                 DisplayData[6] = 0x00;
  321.                                                                 DisplayData[7] = 0x00;
  322.                                                                 DigDisplay();
  323.                                                                 if(fengtime>=3)
  324.                                                                 {      
  325.                                                                         beep=1;
  326.                                                                 }
  327.                                                         }
  328.       
  329.                                                 }
  330.                
  331.                
  332.         }
  333.                               
  334. }
  335.          
復制代碼

全部資料51hei下載地址:
洗衣機控制器.rar (610.82 KB, 下載次數: 120)

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

使用道具 舉報

沙發
ID:529721 發表于 2019-5-7 16:57 | 只看該作者
那具體實現的功能是什么?
回復

使用道具 舉報

板凳
ID:574758 發表于 2019-7-2 14:52 | 只看該作者
謝謝分享,拿走學習學習
回復

使用道具 舉報

地板
ID:576648 發表于 2019-7-2 19:27 | 只看該作者
我也想學習,求大神帶飛
回復

使用道具 舉報

5#
ID:571495 發表于 2019-7-3 08:48 | 只看該作者
這是幾層板呢?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲福利一区 | 一区二区三区欧美 | 成人欧美一区二区 | 久久久久久久久久久高潮一区二区 | 欧美一区在线看 | 91国产精品 | 日韩成人免费 | 伊人久久免费视频 | 欧美三级视频在线观看 | 在线观看亚洲专区 | 久在线视频播放免费视频 | 欧美一级二级在线观看 | 欧美 日韩 亚洲91麻豆精品 | 亚洲一区二区在线电影 | 国产精品视频一 | www.久久久久久久久久久 | 天天躁日日躁狠狠躁白人 | 国产成人免费 | 久久久精品网 | 97av在线 | 日韩黄色免费 | 欧美在线小视频 | 天天夜碰日日摸日日澡 | 国产97在线视频 | 亚洲天堂一区二区 | 日韩欧美一级精品久久 | 综合网在线 | 日韩在线视频一区二区三区 | 性一交一乱一透一a级 | 欧美日韩在线一区二区 | 久久久久久久久久久爱 | 国产日韩亚洲欧美 | 97超碰站| 国产精品美女久久久久aⅴ国产馆 | 亚洲国产精选 | 91精品麻豆日日躁夜夜躁 | 中文字幕一区二区三区精彩视频 | 亚洲国产精品久久久 | 福利视频一区二区三区 | 久久精品中文字幕 | 产真a观专区 |