找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3980|回复: 0
收起左侧

基于单片机的洗衣机的proteus仿真和源码

[复制链接]
ID:321836 发表于 2018-5-29 09:52 | 显示全部楼层 |阅读模式
实现洗衣机常用功能,C源代码+Proteus仿真,可以在此设计基础上适当增减功能,实现洗衣机的控制!
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
单片机源程序如下:
  1. #include<reg51.h>
  2. //按键引脚
  3. sbit key_1 = P1^4;
  4. sbit key_2 = P1^5;
  5. sbit key_3 = P1^6;
  6. sbit key_4 = P1^7;

  7. //电机引脚
  8. sbit b_1 = P1^0;
  9. sbit b_2 = P1^1;
  10. sbit b_3 = P1^2;
  11. sbit b_4 = P1^3;

  12. sbit BEEP = P2^0;
  13. sbit led_1 = P2^1;
  14. sbit led_2 = P2^2;
  15. sbit led_3 = P2^3;
  16. sbit led_4 = P2^4;

  17. sbit w_1 = P2^6;//位选引脚
  18. sbit w_2 = P2^7; //位选引脚

  19. sbit power_1 = P3^6; //加水
  20. sbit power_2 = P3^7; //脱水
  21. int count = 0;
  22. char flag=0;        //当前层
  23. char number=0;
  24. char bit_1 = 0;//位选
  25. char bit_2 = 0;//位选

  26. int time = 0;
  27. int time_1 = 1*60; //12分钟 洗涤时间
  28. int time_2 = 1*60; //6分钟 漂洗时间
  29. int time_3 = 20; //3分钟 脱水时间

  30. char start = 0; //报警标量
  31. //int time_4 = 12*60; //12分钟 洗涤时间
  32. //数码管a--f
  33. unsigned char dis[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};        //数码管引脚定义 0123456789 -
  34. void Delay10ms(unsigned char d)   //误差 0us
  35. {
  36.     unsigned char a, b,c;
  37.                 //正传按键按下
  38.                  if(key_1==0)
  39.                  {
  40.                          while(key_1==0);  //等待正传按键抬起
  41.                         flag = 1;          //状态标量
  42.                  }
  43.                  if(key_2==0)
  44.                  {
  45.                          while(key_2==0);
  46.                         flag = 2;
  47.                  }
  48.                  if(key_3==0)
  49.                  {
  50.                          while(key_3==0);
  51.                         flag = 0;
  52.                  }
  53.         //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
  54.     for (c=d;c>0;c--)
  55.         {
  56.                 for (b=38;b>0;b--)
  57.                 {
  58.                         for (a=130;a>0;a--);
  59.                 }         
  60.         }      
  61. }
  62. //电机正转                 A-B-C-D循环
  63. void dianji_z(unsigned char time)
  64. {
  65.         b_1 = 1;
  66.         b_2 = 0;
  67.         b_3 = 0;
  68.         b_4 = 0;
  69.         Delay10ms(time);
  70.         b_1 = 0;
  71.         b_2 = 1;
  72.         b_3 = 0;
  73.         b_4 = 0;
  74.         Delay10ms(time);
  75.         b_1 = 0;
  76.         b_2 = 0;
  77.         b_3 = 1;
  78.         b_4 = 0;
  79.         Delay10ms(time);
  80.         b_1 = 0;
  81.         b_2 = 0;
  82.         b_3 = 0;
  83.         b_4 = 1;
  84.         Delay10ms(time);
  85. }
  86. //电机反转                 A-B-C-D循环
  87. void dianji_f(unsigned char time)
  88. {
  89.         b_1 = 0;
  90.         b_2 = 0;
  91.         b_3 = 0;
  92.         b_4 = 1;
  93.         Delay10ms(time);
  94.         b_1 = 0;
  95.         b_2 = 0;
  96.         b_3 = 1;
  97.         b_4 = 0;
  98.         Delay10ms(time);
  99.         b_1 = 0;
  100.         b_2 = 1;
  101.         b_3 = 0;
  102.         b_4 = 0;
  103.         Delay10ms(time);
  104.         b_1 = 1;
  105.         b_2 = 0;
  106.         b_3 = 0;
  107.         b_4 = 0;
  108.         Delay10ms(time);
  109. }
  110. //洗涤模式 漂洗模式
  111. void xidi()
  112. {
  113.         int  i; //用于for循环变量
  114.         for(i=0;i<10;i++)        //正转10s
  115.                 dianji_z(25); //1S
  116.         for(i=0;i<5;i++)        //反转5s
  117.                 Delay10ms(100); //1S
  118.         for(i=0;i<10;i++)        //反转10s
  119.                 dianji_f(25); //1S
  120.         for(i=0;i<5;i++)        //反转5s
  121.                 Delay10ms(100); //1S
  122. }

  123. void main(void)
  124. {
  125.         int  i; //用于for循环变量
  126.            TMOD = 0X01;           //设置定时器T0  16位
  127.         EA = 1;                           //打开中断
  128.         ET0 = 1;                   //打开TO定时器
  129.         TR0 = 1;                   //关闭中断
  130.         TH0 = (65536-5000)/256;
  131.         TL0 = (65536-5000)%256;
  132.                                                                           
  133.         BEEP = 0;//蜂鸣器 不响
  134.         led_1 = led_2 = led_3 = led_4 = 0; //指示灯 全灭

  135.         while(1)
  136.         {
  137.                  //开始检测
  138.                   if(key_1==0)
  139.                  {
  140.                          while(key_1==0);
  141.                         power_2 = 1; //脱水关
  142.                         power_1 = 0;  //加水
  143.                         start = 1;
  144.                         //检测到水位
  145.                         if(key_4==0)
  146.                         {
  147.                                 while(key_4==0); //水位加满
  148.                                 power_1 = 1;  //停止加水
  149.                         }

  150.                         for(i=0;i<3;i++)  //洗涤 漂洗 三次
  151.                         {
  152.                                 //洗涤模式
  153.                                 time = time_1;
  154.                                 led_1 = 1;
  155.                                 led_2 = led_3 = 0;
  156.                                 for(;;)
  157.                                 {
  158.                                         xidi();
  159.                                         if(time==0)
  160.                                                 break;
  161.                                 }
  162.                                 //漂洗模式
  163.                                 time = time_2;
  164.                                 led_2 = 1;
  165.                                 led_1 = led_3 = 0;
  166.                                 for(;;)
  167.                                 {
  168.                                         xidi();
  169.                                         if(time==0)
  170.                                         break;
  171.                                 }
  172.                         }
  173.                         led_1 = led_2 = 0;
  174.                         led_3 =        1;
  175.                         power_2 = 0; //启动脱水
  176.                         power_1 = 1;  //不加水
  177.                         time = time_3;
  178.                         for(;;)
  179.                         {
  180.                                 if(time==0)
  181.                                         break;
  182.                                  Delay10ms(10);                   //延时100ms       
  183.                         }
  184.                         led_3 =        0;
  185.                         start = 0;
  186.                  }
  187.                  Delay10ms(10);                   //延时100ms               
  188.         }
  189. }


  190. //中断函数
  191. void delay1s(void) interrupt 1
  192. {
  193.         TH0 = (65536-5000)/256;                           //5ms产生一次中断  用于数码管动态扫描
  194.         TL0 = (65536-5000)%256;                           //5ms产生一次中断  用于数码管动态扫描
  195.         count++;

  196.         if(count>=200)                           //1S时间变小
  197.         {
  198.                  count = 0;

  199.                 if(time>0)
  200.                         time--;

  201.                 if(time>60)         //显示分钟
  202.                 {
  203.                         bit_1 = (time/60)/10;
  204.                         bit_2 = (time/60)%10;
  205.                 }
  206.                 else if(time<60) //显示秒
  207.                 {
  208.                         bit_1 = (time%60)/10;
  209.                         bit_2 = (time%60)%10;
  210.                 }
  211.         }
  212.         w_1 = w_2 = 0;
  213.         switch(count % 2)
  214.         {
  215.                 case 0:                                          //数码管1位                                                               
  216.                        
  217.                                 w_1 = 1;
  218.                                 w_2 = 0;       
  219.                                 P0 = dis[bit_1];               
  220.                                 break;
  221.                 case 1:                                          //数码管1位                                                               
  222.                                 w_1 = 0;
  223.                                 w_2 = 1;       
  224.                                 P0 = dis[bit_2];               
  225.                                 break;       
  226.         }

  227.         //检测盖子打开 报警
  228.         if((key_3==0)&&(start==1))
  229.         {
  230.                 led_4 = 1;  //报警指示灯
  231.                 BEEP = 1; //报警
  232.         }
  233.         else
  234.         {
  235.                 led_4 = 0;  //报警指示灯 不亮
  236.                 BEEP = 0; //不报警       
  237.         }
  238. }
复制代码
0.png

所有资料51hei提供下载:

Exam1.rar (189.32 KB, 下载次数: 125)


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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