找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5701|回复: 4
收起左侧

洗衣机控制器AD电路图+PCB+单片机程序

[复制链接]
ID:418403 发表于 2018-12-6 13:54 | 显示全部楼层 |阅读模式
Altium Designer画的洗衣机控制器原理图和PCB图如下:(51hei附件中可下载工程文件)
0.jpg 0.png 0.png
  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)
回复

使用道具 举报

ID:529721 发表于 2019-5-7 16:57 | 显示全部楼层
那具体实现的功能是什么?
回复

使用道具 举报

ID:574758 发表于 2019-7-2 14:52 | 显示全部楼层
谢谢分享,拿走学习学习
回复

使用道具 举报

ID:576648 发表于 2019-7-2 19:27 | 显示全部楼层
我也想学习,求大神带飞
回复

使用道具 举报

ID:571495 发表于 2019-7-3 08:48 | 显示全部楼层
这是几层板呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表