找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5831|回复: 6
收起左侧

51单片机红外控制步进电机代码

  [复制链接]
ID:424598 发表于 2018-11-13 06:57 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. #include<reg52.h>            //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #define uchar unsigned char

  3. /*********************************************************************************/

  4. sbit IR=P3^2;                          //红外接口标志
  5. uchar i;
  6. unsigned char irtime;        //红外用全局变量

  7. bit irpro_ok,irok;
  8. unsigned char IRcord[4];
  9. unsigned char irdata[33];

  10. /*********************************************************************************/
  11. sbit A1=P1^0; //定义步进电机连接端口 P1^0-P1^3
  12. sbit B1=P1^1;
  13. sbit C1=P1^2;
  14. sbit D1=P1^3;
  15. #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
  16. #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
  17. #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
  18. #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
  19. #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

  20. unsigned int o;
  21. unsigned char Speed;
  22. /*------------------------------------------------
  23. uS延时函数,含有输入参数 unsigned char t,无返回值
  24. unsigned char 是定义无符号字符变量,其值的范围是
  25. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  26. 长度如下 T=tx2+5 uS
  27. ------------------------------------------------*/
  28. void DelayUs2x(unsigned char t)
  29. {   
  30. while(--t);
  31. }
  32. /*------------------------------------------------
  33. mS延时函数,含有输入参数 unsigned char t,无返回值
  34. unsigned char 是定义无符号字符变量,其值的范围是
  35. 0~255 这里使用晶振12M,精确延时请使用汇编
  36. ------------------------------------------------*/
  37. void DelayMs(unsigned char t)
  38. {
  39.      
  40. while(t--)
  41. {
  42.      //大致延时1mS
  43.      DelayUs2x(245);
  44.          DelayUs2x(245);
  45. }
  46. }

  47. /*********************************************************************************/

  48. void Ir_work(void);
  49. void Ircordpro(void);

  50. void tim0_isr (void) interrupt 1 using 1
  51. {
  52.   irtime++;  //用于计数2个下降沿之间的时间
  53. }

  54. void EX0_ISR (void) interrupt 0 //外部中断0服务函数
  55. {
  56.         static unsigned char  i;             //接收红外信号处理
  57.         static bit startflag;                //是否开始处理标志位

  58.         if(startflag)                        
  59.         {
  60.                 if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
  61.             i=0;
  62.                     irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
  63.                     irtime=0;
  64.                     i++;
  65.                            if(i==33)
  66.                       {
  67.                                   irok=1;
  68.                                 i=0;
  69.                           }
  70.         }
  71.         else
  72.         {
  73.                 irtime=0;
  74.                 startflag=1;
  75.         }
  76. }

  77. void delay(uchar z)
  78. {
  79.         uchar x,y;
  80.         for(x=z;x>0;x--)
  81.                 for(y=120;y>0;y--);
  82. }

  83. void TIM0init(void)//定时器0初始化
  84. {
  85.         TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  86.         TH0=0x00; //重载值
  87.         TL0=0x00; //初始化值
  88.         ET0=1;    //开中断
  89.         TR0=1;   
  90. }

  91. void EX0init(void)
  92. {
  93. IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
  94. EX0 = 1;   //使能外部中断
  95. EA = 1;    //开总中断
  96. }

  97. void Ir_work(void)//红外键值散转程序
  98. {   
  99.            switch(IRcord[2])//判断第三个数码值
  100.                  {
  101.                         case 0x44:
  102.                                 Speed=2; //数字越小,转速越大,力矩越小
  103.                                    o=256;//旋转一周时间为512,这里改成红外按住才转动,所以是100
  104.                                 Coil_OFF //步进电机参数
  105.                                 while(o--)  //正向
  106.                                 {         
  107.                                         Coil_AB1                //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
  108.                                         DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
  109.                                         Coil_BC1
  110.                                         DelayMs(Speed);
  111.                                         Coil_CD1
  112.                                         DelayMs(Speed);
  113.                                         Coil_DA1
  114.                                         DelayMs(Speed);
  115.                                 }               
  116.                          break;//电源 显示相应的按键值
  117.                          case 0x40:
  118.                                  Speed=2; //数字越小,转速越大,力矩越小
  119.                                    o=256;//旋转一周时间为512,这里改成红外按住才转动,所以是100
  120.                                  Coil_OFF //步进电机参数
  121.                                 while(o--)//反向
  122.                                 {
  123.                                         Coil_DA1                //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
  124.                                         DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
  125.                                         Coil_CD1
  126.                                         DelayMs(Speed);
  127.                                         Coil_BC1
  128.                                         DelayMs(Speed);
  129.                                         Coil_AB1
  130.                                         DelayMs(Speed);
  131.                                 }       
  132.                          break;//电源 显示相应的按键值
  133.                          case 0x07:
  134.                                  Speed=2; //数字越小,转速越大,力矩越小
  135.                                    o=20;//旋转一周时间为512,这里改成红外按住才转动,所以是100
  136.                                 Coil_OFF //步进电机参数
  137.                                 while(o--)  //正向
  138.                                 {         
  139.                                         Coil_AB1                //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
  140.                                         DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
  141.                                         Coil_BC1
  142.                                         DelayMs(Speed);
  143.                                         Coil_CD1
  144.                                         DelayMs(Speed);
  145.                                         Coil_DA1
  146.                                         DelayMs(Speed);
  147.                                 }               
  148.                          break;//电源 显示相应的按键值
  149.                          case 0x15:
  150.                                  Speed=2; //数字越小,转速越大,力矩越小
  151.                                    o=20;//旋转一周时间为512,这里改成红外按住才转动,所以是100
  152.                                  Coil_OFF //步进电机参数
  153.                                 while(o--)//反向
  154.                                 {
  155.                                         Coil_DA1                //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
  156.                                         DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
  157.                                         Coil_CD1
  158.                                         DelayMs(Speed);
  159.                                         Coil_BC1
  160.                                         DelayMs(Speed);
  161.                                         Coil_AB1
  162.                                         DelayMs(Speed);
  163.                                 }       
  164.                          break;//电源 显示相应的按键值
  165.              default:break;
  166.                          }

  167.                   irpro_ok=0;//处理完成标志

  168. }

  169. void Ircordpro(void)//红外码值处理函数
  170. {
  171.         unsigned char i, j, k,cord,value;
  172.         k=1;
  173.         for(i=0;i<4;i++)      //处理4个字节
  174.         {
  175.                 for(j=1;j<=8;j++) //处理1个字节8位
  176.                 {
  177.                         cord=irdata[k];
  178.                         if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
  179.                         value=value|0x80;
  180.                         if(j<8)
  181.                         {
  182.                                 value>>=1;
  183.                         }
  184.                         k++;
  185.                 }
  186.                 IRcord[i]=value;
  187.                 value=0;     
  188.         }
  189.         irpro_ok=1;//处理完毕标志位置1
  190. }

  191. void main(void)
  192. {
  193.         EX0init(); //初始化外部中断
  194.         TIM0init();//初始化定时器

  195.         while(1)//主循环
  196.         {
  197.                 if(irok)                        //如果接收好了进行红外处理
  198.                 {   
  199.                         Ircordpro();
  200.                         irok=0;
  201.                 }
  202.                 if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
  203.                 {
  204.                         Ir_work();
  205.                 }
  206.         }
  207. }
复制代码

所有资料51hei提供下载:
51红外控制步进电机.zip (29.21 KB, 下载次数: 101)

评分

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

查看全部评分

回复

使用道具 举报

ID:432346 发表于 2018-12-23 13:52 | 显示全部楼层
感谢分享~~
回复

使用道具 举报

ID:272625 发表于 2019-8-15 22:09 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

ID:378732 发表于 2019-8-19 21:37 | 显示全部楼层
为什么这个程序放我这里用不了。我就是用了P3^3口用的接收。。。。
回复

使用道具 举报

ID:805799 发表于 2020-11-27 21:43 | 显示全部楼层
这个是用慧净电子开发板吗
回复

使用道具 举报

ID:836097 发表于 2020-12-7 21:55 | 显示全部楼层
怎样接线呀
回复

使用道具 举报

ID:799238 发表于 2021-7-14 17:52 | 显示全部楼层
这是慧净电子的开发板吧 谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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