找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9021|回复: 5
打印 上一主题 下一主题
收起左侧

单片机全自动洗衣机控制程序及原理图等制作资料

  [复制链接]
跳转到指定楼层
楼主
1、利用MCS-51内部定时器定时,实现倒计时的时间控和显示;
2、能按键调整洗衣机洗涤类型;
3、正反转控制,到时间蜂鸣器报警;

制作成功的全自动洗衣机实物图:


单片机原理图:

系统C语言程序:
  1. #include <REG51.H>
  2. #define  uchar unsigned char   //类型定义,方便书写
  3. #define   uint unsigned int
  4. uchar code roundz[] ={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};   //步进电机正转控制数组
  5. uchar code roundf[] ={0x08,0x0C,0x04,0x06,0x02,0x03,0x01,0x09};   //步进电机反转控制数组
  6. uchar code disptab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极LED显示器显示码
  7. sbit beep=P2^7;
  8. sbit baiwei=P2^0;
  9. sbit shiwei=P2^1;
  10. sbit gewei=P2^2;          //数码管位选
  11. uint num,sec;      
  12. #define K1 0x06
  13. #define K20x5
  14. #define K3 0x3   //按键码,分别检测三个按键是否有按下
  15. sbit in_water=P3^3;           
  16. sbit out_water=P3^4;
  17. sbit LED_bz=P3^5;
  18. sbit LED_qr=P3^6;
  19. sbit LED_sg=P3^7;        //5个LED灯,分别为进水,出水,标准,轻柔和甩干
  20. //**************基本延迟函数************************************************
  21. void delay(uint dcnt)  // 延迟时间为dcntms
  22. {
  23.     uint i,j;   
  24.     for(i=dcnt;i>0;i--)
  25.         for(j=120;j>0;j--);
  26. }
  27. //************定时器0控制倒计时*****************************************
  28. void count_down() interrupt 1
  29. {
  30.     int count ;
  31.     TH0=(65536-50000)/256;
  32.     TL0=(65536-50000)%256;   //定时器0每50ms产生一次中断;
  33.     count ++;
  34.     if(count == 20)          //每50*20=1s sec的值减1
  35.     {
  36.         count =0;
  37.         sec--;
  38.         if(sec==0)         //计时结束时,关闭总中断,电机停止转动。
  39.         {
  40.             EA=0;
  41.             P0=0xff;
  42.             P1=0xff;
  43.             P2=0xff;
  44.             P3=0xff;
  45.             while(1);
  46.         }           
  47.     }   
  48. }
  49. //***************倒计时的数码管显示程序*******************************
  50. void display()  interrupt 3         //利用定时器1来进行数码管显示
  51. {
  52.   TH1=(65536-5000)/256;               //每5ms扫描一次
  53.   TL1=(65536-5000)%256;
  54.     num=(num%3);   
  55.     P0=0xff;  //消影   
  56.     switch(num)
  57.     {      
  58.         case 0:
  59.             P0=disptab[sec/100];
  60.             baiwei=1;   shiwei=0;gewei=0;
  61.             break;
  62.         case 1:
  63.             P0=disptab[(sec/10)%10];
  64.             baiwei=0; shiwei=1;  gewei=0;      
  65.             break;
  66.         case 2:
  67.             P0=disptab[sec%10];
  68.              baiwei=0;  shiwei=0; gewei=1;         
  69.             break;
  70.         default:break;
  71.     }
  72.     num++;
  73. }
  74. //************************步进电机正转控制函数******************************
  75. void RotateWise(uinttime,uchar stepcnt)           //time为转一步时间,stepcnt为圈数
  76. {
  77.     uchar i ,j;
  78.     for(i=0;i<stepcnt;i++)
  79.     {
  80.         for(j=0;j<8;j++)
  81.         {
  82.             P1= roundz[j] ;
  83.             delay (time);             //更改delay里数值可改变转速,转一圈时间为time*8 ms
  84.         }
  85.     }
  86. }
  87. //***********************步进电机反转控制函数****************************
  88. void ContraRotate(uinttime,uchar stepcnt)  //time为转一步时间,stepcnt为圈数
  89. {
  90.     uchar i ,j;
  91.     for(i=0;i<stepcnt;i++)
  92.     {
  93.         for(j=0;j<8;j++)
  94.         {
  95.             P1= roundf[j] ;          //更改delay里数值可改变转速,转一圈时间为time*8 ms
  96.             delay (time);
  97.         }
  98.     }
  99. }
  100. //**************************洗涤子程序****************************************
  101. void xidi()                  
  102. {
  103.     uint i;
  104.     in_water = 0;         
  105.     delay(9000);           //开水阀,进水9s
  106.     in_water = 1;          //关水阀
  107.     delay(1000);
  108.     for(i=10;i>0;i--)      //转动十次
  109.     {
  110.     RotateWise(50,10) ;  //正转10圈,转速为50ms*8
  111.     delay(1000);             //停止一秒
  112.     ContraRotate(50,10) ;    //反转10圈,转速为50ms*8
  113.     delay(1000);
  114.     }   
  115. }
  116. //**************************漂洗子程序****************************************
  117. void piaoxi()
  118. {
  119.     uint i;
  120.     in_water = 0;         
  121.     delay(9000);           //开水阀,进水9s
  122.     in_water = 1;          //关水阀
  123.     delay(1000);
  124.     for(i=5;i>0;i--)       //转动五次
  125.     {
  126.     RotateWise(100,10) ;     //正转10圈,转速为100ms*8
  127.     delay(1000);             //停止一秒
  128.     ContraRotate(100,10) ;   //反转10圈,转速为100ms*8
  129.     delay(1000);
  130.     }
  131. }
  132. //*********************脱水子程序*******************************************
  133. void tuoshui()
  134. {
  135.     uint i;
  136.     out_water = 0;        //打开排水阀
  137.     delay(9000);          //排水9s
  138.     for(i=10;i>0;i--)      //转动十次
  139.     {
  140.     RotateWise(50,10) ;  //正转10圈,转速为50ms*8  
  141.     }
  142.     beep=0;
  143.     delay(1000);         //蜂鸣器警报
  144.     beep=1;
  145.     out_water =1 ;       //甩干完毕,关闭水阀
  146. }
  147. //********************标准模式************************************************
  148. void biaozhun()
  149. {   sec=360;             //设定倒计时数目
  150.     LED_bz = 0;         //点亮“标准”LED灯
  151.     xidi();              //洗涤
  152.     piaoxi();
  153.     piaoxi();            //2次漂洗
  154.     tuoshui();           //脱水
  155.     LED_bz=1;            //熄灭LED灯
  156. }
  157. //*********************轻揉模式********************************************
  158. void qingrou()
  159. {   sec=250;           //设定倒计时数目
  160.     LED_qr = 0;        //点亮“轻揉”LED灯
  161.     piaoxi();         
  162.     piaoxi();         //2次漂洗
  163.     tuoshui();        //脱水
  164.     LED_qr = 1;       //熄灭LED灯
  165. }
  166. //**********************甩干模式********************************************
  167. void shuaigan()
  168. {   
  169.     sec=50;              //设定倒计时数目
  170.     LED_sg = 0;          //点亮“甩干”LED灯
  171.     tuoshui();            //脱水
  172.     LED_sg = 1;          //熄灭LED灯
  173. }
  174. //********************键盘扫描程序****************************************
  175. uchar scankey()
  176. {
  177.     int key;
  178.     if((P3&0x07)== 0x07)
  179.     return(0xff);               //消抖
  180.     delay(30);
  181.     if((P3&0x07)== 0x07)
  182.     return(0xff);
  183.     key = P3&0x07;
  184.     while ((P3&0x07)!=0x07);    //当有按键按下的时候,返回key值,判断哪个按键被按下
  185.     return key;
  186. }
  187. //******************主函数************************************************
  188. void main()
  189. {
  190.     TMOD|=0x11;  //定时器0和定时器1模式  工作方式1
  191.     TH0=(65536-50000)/256;  
  192.     TL0=(65536-50000)%256;  //定时0器寄存器装初值,每50ms产生一次中断
  193.     EA=0;                   //关总中断
  194.     ET0=1;                  //开定时器0中断
  195.     TH1=(65536-5000)/256;   //定时器1寄存器装初值,没5ms产生一次中断
  196.     TL1=(65536-5000)%256;
  197.     ET1=1;                //打开定时器1中断
  198.     TR0=1;  
  199.     TR1=1;              //打开定时器0和定时器1
  200.     while(1)
  201.     {      
  202.        uchar key = scankey();
  203.        if (key == K1)
  204.       {     
  205.         EA=1;              //开总中断[em12]
  206.         biaozhun();
  207.       }     
  208.        if (key == K2)
  209.       {   
  210.        EA=1;
  211.        qingrou();
  212.       }
  213.        if (key == K3)
  214.       {   
  215.        EA=1;
  216.        shuaigan();

  217.       }     }   }  
复制代码

全部资料下载地址:
main.doc (5.74 KB, 下载次数: 73)

评分

参与人数 1黑币 +5 收起 理由
LY1259045520 + 5 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:221420 发表于 2017-8-1 00:05 | 只看该作者
谢谢分享!
回复

使用道具 举报

板凳
ID:89286 发表于 2017-8-1 04:38 | 只看该作者
thanks for sharing
回复

使用道具 举报

地板
ID:222834 发表于 2017-8-1 09:27 | 只看该作者
赞个!!!
回复

使用道具 举报

5#
ID:142320 发表于 2017-8-1 14:46 | 只看该作者
项目是好,但你定时器里面用while死循环,我是第一次看到,而且程序中的时间用了大量的DELAY来实现,非常不合理的设计
回复

使用道具 举报

6#
ID:130345 发表于 2017-8-3 17:51 | 只看该作者
谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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