找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外线遥控直流电机启停源码(原创设计)

[复制链接]
跳转到指定楼层
楼主
ID:374361 发表于 2018-10-14 22:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
红外线遥控直流电机启停源码


单片机源程序如下:
  1. #include"reg51.h"
  2. typedef unsigned  char u8;
  3. typedef unsigned  int u16;
  4. sbit  a=P1^4;
  5. sbit  b=P1^5;
  6. sbit  c=P1^6;
  7. u8 reddata[6];
  8. u8 redcom[2];
  9. u8 time,j,k;
  10. u16 err;
  11. sbit  stop=P3^2;
  12. sbit  motor=P1^0;
  13. sbit  motoa=P3^4;
  14. sbit  motob=P3^5;
  15. sbit  motoc=P3^6;
  16. sbit  motod=P3^7;
  17. u16 smg[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0X76};
  18. /*************************************************************/
  19. void smgbitswitch(num)
  20. {
  21.                 switch(num)         //位选,选择点亮的数码管,
  22.                 {
  23.                         case(0):
  24.                                 a=0;b=0;c=0; break;//显示第0位
  25.                         case(1):
  26.                                 a=1;b=0;c=0; break;//显示第1位
  27.                         case(2):
  28.                                 a=0;b=1;c=0; break;//显示第2位
  29.                         case(3):
  30.                                 a=1;b=1;c=0; break;//显示第3位
  31.                         case(4):
  32.                                 a=0;b=0;c=1; break;//显示第4位
  33.                         case(5):
  34.                                 a=1;b=0;c=1; break;//显示第5位
  35.                         case(6):
  36.                                 a=0;b=1;c=1; break;//显示第6位
  37.                         case(7):
  38.                                 a=1;b=1;c=1; break;//显示第7位       
  39.                 }
  40. }
  41. void delay(u16 num)
  42. {
  43.       while(num)
  44.           {
  45.               num--;
  46.           }

  47. }
  48. void you1(num)
  49. {
  50.     smgbitswitch(7);
  51.         P0=smg[num];
  52.         delay(10);
  53.         P0=0x00;
  54. }
  55. void you2(num)
  56. {
  57.     smgbitswitch(6);
  58.         P0=smg[num];
  59.     delay(10);
  60.         P0=0x00;
  61. }
  62. void you3(num)
  63. {
  64.     smgbitswitch(5);
  65.         P0=smg[num];
  66.     delay(10);
  67.         P0=0x00;
  68. }
  69. void   redcomsmg()
  70. {
  71.      if(reddata[2]==0x16)
  72.          {
  73.              redcom[1]=0;
  74.          }
  75.          if(reddata[2]==0x0c)
  76.          {
  77.              redcom[1]=1;
  78.          }
  79.          if(reddata[2]==0x18)
  80.          {
  81.              redcom[1]=2;
  82.          }
  83.          if(reddata[2]==0x5e)
  84.          {
  85.              redcom[1]=3;
  86.          }
  87.          if(reddata[2]==0x08)
  88.          {
  89.              redcom[1]=4;
  90.          }
  91.          if(reddata[2]==0x1c)
  92.          {
  93.              redcom[1]=5;
  94.          }
  95.          if(reddata[2]==0x5a)
  96.          {
  97.              redcom[1]=6;
  98.          }
  99.          if(reddata[2]==0x42)
  100.          {
  101.              redcom[1]=7;
  102.          }
  103.          if(reddata[2]==0x52)
  104.          {
  105.              redcom[1]=8;
  106.          }
  107.          if(reddata[2]==0x4a)
  108.          {
  109.              redcom[1]=9;
  110.          }
  111. }
  112. void  inter()
  113. {
  114.        EX0=1;          
  115.            IT0=1;
  116.            EA=1;


  117.            stop=1;
  118. }
  119. void main()
  120. {
  121.      inter();
  122.          delay(1);
  123.          motoa=0;
  124.          motob=0;
  125.          motoc=0;
  126.          motod=0;
  127.          motor=0;
  128.      while(1)
  129.          {
  130.              redcomsmg();
  131.                  delay(2000);
  132.                  you1(10);
  133.                  you2(redcom[1]);
  134.                  you3(0);
  135.                  if(redcom[1]==0)                  //        直流电机停止
  136.                  {
  137.                      motor=0;
  138.                  }
  139.                  if(redcom[1]==3)                  //   直流电机启动
  140.                  {                     
  141.                      motor=1;
  142.                  }
  143.                  if(redcom[1]==2)           //                 步进电机启动
  144.                  {
  145.                      motoa=1;
  146.                          motob=0;
  147.                          motoa=1;
  148.                          motob=1;
  149.                          delay(200);
  150.                          
  151.                          motoa=1;
  152.                          motob=1;
  153.                          motoa=1;
  154.                          motob=0;
  155.                          delay(200);
  156.                          
  157.                          
  158.                          motoa=0;
  159.                          motob=1;
  160.                          motoa=1;
  161.                          motob=1;
  162.                          delay(200);
  163.                          
  164.                          
  165.                          motoa=1;
  166.                          motob=1;
  167.                          motoa=0;
  168.                          motob=1;
  169.                          delay(200);  
  170.                  }
  171.                  if(redcom[1]==4)         //           步进电机停止
  172.                  {
  173.                      motoa=0;
  174.                          motob=0;
  175.                          motoa=0;
  176.                          motob=0;
  177.                  }   
  178.          }
  179. }


  180. void stopservice() interrupt 0
  181. {
  182.      time=0;
  183.          if(stop==0)           //如果按键按下
  184.          {
  185.               err=1000;
  186.                   while((stop==0)&&(err>0))                  //        等待9ms低电平过去
  187.                   {
  188.                        delay(1);
  189.                            err--;
  190.                   }
  191.                   if(stop==1)
  192.                   {
  193.                        err=500;
  194.                            while((stop==1)&&(err>0))  // 等待4.5ms高电平过去
  195.                            {
  196.                                delay(1);
  197.                                    err--;
  198.                            }
  199.                            for(k=0;k<4;k++)
  200.                            {
  201.                                  for(j=0;j<8;j++)
  202.                                          {
  203.                                               err=60;
  204.                                                   while((stop==0)&&(err>0))          //  等待560us低电平过去
  205.                                                   {
  206.                                                       delay(1);
  207.                                                           err--;
  208.                                                   }
  209.                                                   err=50;
  210.                                                   while((stop==1)&&(err>0))                   //计算高电平时间
  211.                                                   {
  212.                                                        delay(10);
  213.                                                            time++;
  214.                                                            if(time>30)
  215.                                                            {
  216.                                                                 err=0;
  217.                                                                        return;
  218.                                                            }
  219.                                                   }
  220.                                                   reddata[k]>>=1;         //        因为红外通信是先传低位,再传高位。所以是右移。
  221.                                                   if(time>=8)                //         如果大于0.8ms说明是高电平,0.8ms是一个中间值
  222.                                                   {
  223.                                                        reddata[k]|=0x80;
  224.                                                   }
  225.                                                   time=0;
  226.                                                   err=0;                                                                                                    
  227.                                          }
  228.                            }
  229.                   }
  230.                   if(reddata[2]!=~reddata[3])
  231.                   {
  232.                       return;
  233.                   }
  234.          }
  235.           
  236. }
复制代码

所有资料51hei提供下载:
红外遥控直流电机启停.rar (525.55 KB, 下载次数: 23)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2018-10-15 01:28 | 只看该作者
楼主能分享下原理图吗?
回复

使用道具 举报

板凳
ID:295874 发表于 2018-10-15 08:57 | 只看该作者
没有原理图参考起来不易,意义是有,但不好参考学习,建议上传原理图,谢谢。
回复

使用道具 举报

地板
ID:374361 发表于 2018-10-15 19:31 | 只看该作者
实验板原理图,其实最重要的还是那个PPT,红外遥控的编码规则和时序搞清楚了就简单了

EM3 V2.2开发板原理图.pdf

274.28 KB, 下载次数: 13, 下载积分: 黑币 -5

回复

使用道具 举报

5#
ID:374361 发表于 2018-10-15 19:34 | 只看该作者
动态数码管的作用是将外红遥控的按键显示在上面,按1,经过译码之后数码管显示1,按2,经过译码之后数码管显示2.其他按键也是同样的原理。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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