找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机步进电机的红外遥控系统程序,加减速部分不太好 求指导

[复制链接]
跳转到指定楼层
楼主
求一个步进电机的红外遥控控制系统
硬件:stc89c51+28BYJ48步进电机+红外遥控+LCD1602液晶显示
要求:使用红外遥控实现步进电机的点动、连续运动、反转、停止。
共使用六个按钮,实现四种功能
点动无要求
连续运动的时候可以调节速度,可以设置3—5个挡位,并在1602显示器上面显示出来处于哪个挡位
反转采用一个按钮进行控制
下面的程序已经实现了遥控启动停止加速减速反转,没有加显示屏显示,并且加减速程序不太舒服,希望大佬可以改一下,求求大佬帮帮忙

单片机源程序如下:
  1. #include<reg51.h>

  2. void delay0();
  3. void delay();//可能是漏了函数原型. 如果在main{ ...} 以后定义了函数,main以前要加函数原型声明.
  4. unsigned char bdata ab[4];
  5. sbit P3_2=P3^2;
  6. char h=0;
  7. bit f0=0;
  8. int i=0;
  9. main()
  10. {        
  11.         char code zz[8]={0x07,0x03,0x0B,0x09,0x0D,0x0c,0x0E,0x06};
  12.         char code fz[8]={0x06,0x0E,0x0C,0x0D,0x09,0x0B,0x03,0x07};
  13.         char djh[5]={0x15,0x63,0x78,0xB1,0xEC};
  14.         char djl[5]={0xA0,0xC0,0xD0,0xE0,0x78};
  15.         P0=0xff;
  16.         EA=1;
  17.         EX0=1;                                                                                                        
  18. //必须先初始化才能赋值;
  19.         IT0=1;               
  20.         do
  21.         {
  22.         if(ab[2]==0x0c)                                                                  
  23. //单步 //开始ab[2]未赋值的时候??
  24.             {   P0=0xf9;
  25.                P2=f0==0?zz[i]:fz[i];                           
  26. //中断通过改变ab[2]的值来控制步进电机//f0决定正转反转
  27.                                 i++;
  28.                         if(i>7)i=0;
  29.                         ab[2]=0;
  30.                         
  31.                                 
  32.                 }
  33.           else if(ab[2]==0x18)                                                        //连续
  34.             {        P0=0xa4;
  35.                         for(;;)
  36.                                   {        P2=f0==0?zz[i]:fz[i];
  37.                                             TH0=djh[h];
  38.                                         TL0=djl[h];
  39.                                         delay();
  40.                                         i++;
  41.                                         if(i>7)i=0;
  42.                                         if(ab[2]==0x0c ){ab[2]=0;break;}                                
  43. //        停止键和单步键能退出连续运行               
  44.                                         else        if(ab[2]==0x5a ){break;}
  45.                                 }                                
  46.                         
  47.                   }
  48.         } while(1);  
  49.                      
  50. }

  51. void delay0(unsigned char x)    //x*0.14MS
  52. {
  53. unsigned char i;
  54.   while(x--)
  55. {
  56.   for (i = 0; i<7; i++) {}
  57. }
  58. }


  59. //简单的红外遥控解码程序(HT6221)
  60. void hongwai() interrupt 0 //入口点和出口点
  61. {                                
  62.   unsigned char j,k,N=0;
  63.      EX0 = 0;   
  64.          delay0(15);
  65.          if (P3_2==1)
  66.      { EX0 =1;
  67.            return;
  68.           }
  69.                            //确认IR信号出现
  70.   while (!P3_2)            //等IR变为高电平,跳过9ms的前导低电平信号。
  71.     {delay0(1);}

  72. for (j=0;j<4;j++)         //收集四组数据
  73. {
  74.   for (k=0;k<8;k++)        //每组数据有8位
  75.   {
  76.    while (P3_2)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  77.      {delay0(1);}
  78.     while (!P3_2)          //等 IR 变为高电平
  79.      {delay0(1);}
  80.      while (P3_2)           //计算IR高电平时长
  81.       {
  82.     delay0(1);
  83.     N++;           
  84.     if (N>=30)
  85.          { EX0=1;
  86.          return;}                  //0.14ms计数过长自动离开。
  87.       }                        //高电平计数完毕               
  88.      ab[j]=ab[j] >> 1;                  //数据最高位补"0"
  89.      if (N>=8) {ab[j] = ab[j] | 0x80;}  //数据最高位补"1"
  90.      N=0;
  91.   }//end for k
  92. }//end for j

  93.    if (ab[2]!=~ab[3])
  94.    { EX0=1;
  95.      return; }
  96.                         if(ab[2]==0x0c)                                                //数据显示及用于步进电机控制
  97.                                 {P0=0xf9;
  98.                                 }
  99.                         else if(ab[2]==0x18)
  100.                                 {P0=0xa4;
  101.                                 }
  102.                         else if(ab[2]==0x5e)
  103.                            {        P0=0xb0;
  104.                                         f0=~f0;
  105.                                 }
  106.                         else if(ab[2]==0x08)
  107.                            {        P0=0x99;
  108.                                         h++;
  109.                                         if(h>4)h=4;
  110.                                 }
  111.                         else if(ab[2]==0x1c)
  112.                            {        P0=0x92;
  113.                                         h--;
  114.                                         if(h<0)h=0;
  115.                                    }
  116.                         else if(ab[2]==0x5a)
  117.                                  { P0=0x82;}
  118.                         EX0=1;                                        ////开外部中断0
  119. }
  120. void delay()
  121. {        
  122.         TMOD=0x01;
  123.         TR0=1;
  124.         while(!TF0);
  125.         TF0=0;
  126.         TR0=0;
  127. }
复制代码

61d8cb22190e25252c0c3524e92ccab.png (95.21 KB, 下载次数: 38)

红外收发一体1

红外收发一体1

84617afe7e3bf2e2c8dabc6141684d7.png (30.51 KB, 下载次数: 34)

红外收发一体2

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

使用道具 举报

沙发
ID:908239 发表于 2021-10-12 22:29 | 只看该作者
我这个程序的加减速部分不太好,希望大家可以帮忙改改,谢谢大家了
回复

使用道具 举报

板凳
ID:161164 发表于 2021-10-13 00:35 | 只看该作者
加减速部分有什么不好?
回复

使用道具 举报

地板
ID:908239 发表于 2021-10-13 09:36 | 只看该作者
频率跨度太大,就是先以最高速运行,按一下减速还行,最多四下就不动了
回复

使用道具 举报

5#
ID:161164 发表于 2021-10-13 13:09 | 只看该作者
123456uioxhkbhs 发表于 2021-10-13 09:36
频率跨度太大,就是先以最高速运行,按一下减速还行,最多四下就不动了

那就减少跨度,增加档位啦
回复

使用道具 举报

6#
ID:908239 发表于 2021-10-13 19:26 | 只看该作者
哪个大佬看得懂这套程序能不能解释一下?大概的框架,主要修改速度在哪里修改?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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