找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3373|回复: 1
收起左侧

如何实现红外控制直流电机正反转调速启停及在数码管上显示

[复制链接]
ID:75543 发表于 2015-3-28 16:17 | 显示全部楼层 |阅读模式
如何实现红外控制直流电机正反转调速启停及在数码管上显示
回复

使用道具 举报

ID:1 发表于 2015-4-2 20:16 | 显示全部楼层
  1. /*此程序是针对uPD6121系列遥控器的取码程序,解码值在Im[2]中,当IrOK=1时解码有效*/
  2. /******************************************************************************/
  3. /* 项目名称  : 51hei扩展板 红外遥控器控制直流电机                             */
  4. /* 主控芯片  : STC89C52                                                       */
  5. /* 文件名称  : Inf_DcMotor                                                    */
  6. /* 文件功能  : 主函数                                                         */
  7. /* 文件版权  : 北京海克智动科技开发有限公司                                   */
  8. /* 文件版本  :                                                                */
  9. /******************************************************************************/
  10. /**********************************包含头文件**********************************/
  11. #include <reg52.h>
  12. /************************************宏定义************************************/
  13. #define uchar unsigned char
  14. #define Imax  14000               //此处为晶振为11.0592时的取值,
  15. #define Imin  8000                //如用其它频率的晶振时,
  16. #define Inum1 1450                //要改变相应的取值。
  17. #define Inum2 700
  18. #define Inum3 3000
  19. /************************************位定义************************************/
  20. sbit dula = P2^6;        
  21. sbit wela = P2^7;
  22. sbit pwm = P1^7 ;                 //PWM信号输出
  23. /********************************定义变量和数组********************************/
  24. uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  25.                       0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段码
  26. uchar Im[4] = {0x00,0x00,0x00,0x00};
  27. uchar f;
  28. uchar IrOK;
  29. uchar PulseWidth = 0;             //定义脉宽值
  30. uchar StartFlag = 0;              //定义启动标志位 0为停止 1为启动
  31. uchar count;                      //0.5ms次数标识
  32. unsigned long m,Tc;
  33. /******************************************************************************/
  34. /* 函数名称  : delay                                                          */
  35. /* 函数描述  : 延时函数                                                       */
  36. /* 输入参数  : 无                                                             */
  37. /* 参数描述  : 无                                                             */
  38. /* 返回值    : 无                                                             */
  39. /******************************************************************************/
  40. void delay(uchar i)
  41. {
  42.     uchar j,k;

  43.     for(j = i;j > 0;j--)
  44.     {
  45.         for(k = 125;k > 0;k--);
  46.     }  
  47. }
  48. /******************************************************************************/
  49. /* 函数名称  : display                                                        */
  50. /* 函数描述  : 显示函数函数                                                   */
  51. /* 输入参数  : 无                                                             */
  52. /* 参数描述  : 无                                                             */
  53. /* 返回值    : 无                                                             */
  54. /******************************************************************************/
  55. void display(void)
  56. {
  57.     dula = 0;
  58.     P0 = table[PulseWidth/10];             //显示脉宽值高位
  59.     dula = 1;
  60.     dula = 0;

  61.     wela = 0;
  62.     P0 = 0xfe;
  63.     wela = 1;
  64.     wela = 0;
  65.     delay(5);
  66. }
  67. /******************************************************************************/
  68. /* 函数名称  : intersvr1                                                      */
  69. /* 函数描述  : 外部中断解码程序                                               */
  70. /* 输入参数  : 无                                                             */
  71. /* 参数描述  : 无                                                             */
  72. /* 返回值    : 无                                                             */
  73. /******************************************************************************/
  74. void intersvr1(void) interrupt 2 using 1
  75. {
  76.         Tc = TH0 * 256 + TL0;                      //提取中断时间间隔时长
  77.         TH0 = 0;
  78.     TL0 = 0;                                   //定时中断重新置零

  79.         if((Tc > Imin) && (Tc < Imax))
  80.     {
  81.                 m = 0;
  82.         f = 1;
  83.                 return;
  84.     }                                          //找到启始码

  85.     if(f == 1)
  86.     {
  87.         if(Tc > Inum1 && Tc < Inum3)
  88.                   {
  89.                         Im[m / 8] = Im[m / 8] >> 1 | 0x80;
  90.             m++;
  91.              }
  92.             if(Tc > Inum2 && Tc < Inum1)
  93.         {
  94.                 Im[m / 8] = Im[m / 8] >> 1;
  95.             m++;                              //取码
  96.                 }
  97.                 if(m == 32)
  98.                  {
  99.             m = 0;  
  100.             f = 0;
  101.                    if(Im[2] ==~ Im[3])
  102.                 {
  103.                 IrOK =1 ;
  104.                     }
  105.             else
  106.             {
  107.                 IrOK = 0;   //取码完成后判断读码是否正确
  108.             }
  109.             }
  110.         }       
  111. }
  112. /******************************************************************************/
  113. /* 函数名称  : Inf_Dispose                                                    */
  114. /* 函数描述  : 红外接收处理函数                                               */
  115. /* 输入参数  : 无                                                             */
  116. /* 参数描述  : 无                                                             */
  117. /* 返回值    : 无                                                             */
  118. /******************************************************************************/
  119. void Inf_Dispose(void)
  120. {
  121.     if(IrOK == 1)
  122.     {
  123.         switch(Im[2])   
  124.         {
  125.             case 0x44:                   //遥控器 开始/停止 键按下 启动停止控制
  126.                 StartFlag =~ StartFlag;
  127.                 if(StartFlag)            //启动 打开定时器中断
  128.                 {
  129.                     if(PulseWidth)       //只有当脉宽值不为0时才可以启动
  130.                     {
  131.                         ET0 = 1;
  132.                     }
  133.                 }
  134.                 else                     //停止 关闭定时器中断
  135.                 {
  136.                     ET0 = 0;
  137.                     pwm = 0;
  138.                 }
  139.             break;

  140.             case 0x09:                   //遥控器 - 键按下 脉宽值加10
  141.                 PulseWidth += 10;                  
  142.                 count=0;                 
  143.                 if(PulseWidth==60)              
  144.                 {
  145.                     PulseWidth = 50;               
  146.                 }
  147.             break;

  148.             case 0x15:                   //遥控器 + 键按下 脉宽值减10
  149.                 PulseWidth -= 10;                  
  150.                 count=0;
  151.                 if(PulseWidth == 0)
  152.                 {
  153.                     PulseWidth = 10;            
  154.                 }
  155.                 if(PulseWidth == 246)
  156.                 {
  157.                     PulseWidth = 0;
  158.                 }               
  159.             break;

  160.             default:
  161.             break;
  162.         }
  163.         IrOK = 0;          
  164.         }
  165. }
  166. /******************************************************************************/
  167. /* 函数名称  : Time0_Init                                                     */
  168. /* 函数描述  : 定时器0初始化函数                                              */
  169. /* 输入参数  : 无                                                             */
  170. /* 参数描述  : 无                                                             */
  171. /* 返回值    : 无                                                             */
  172. /******************************************************************************/
  173. void Time0_Init()                    //定时器初始化
  174. {
  175.         TMOD |= 0x01;                    //定时器0工作在方式1   
  176.         IE          |= 0x82;
  177.         TH0  = 0xfe;
  178.         TL0  = 0x33;                             //11.0592MZ晶振,0.5ms
  179.     TR0  = 1;                        //定时器开始
  180.     ET0 = 0;
  181. }
  182. /******************************************************************************/
  183. /* 函数名称  : Time0_Int                                                      */
  184. /* 函数描述  : 定时器0中断函数                                                */
  185. /* 输入参数  : 无                                                             */
  186. /* 参数描述  : 无                                                             */
  187. /* 返回值    : 无                                                             */
  188. /******************************************************************************/
  189. void Time0_Int() interrupt 1        //中断程序
  190. {
  191.         TH0  = 0xfe;                    //重新赋值
  192.         TL0  = 0x33;
  193.    
  194.     count++;
  195.     if(count == PulseWidth)         //对应的脉宽值输出低电平               
  196.     {
  197.         pwm = 0;
  198.     }

  199.     if(count == 60)//30ms周期到达后
  200.     {
  201.         pwm = 1;                    //输出高电平
  202.         count = 0;
  203.     }   
  204. }
  205. /******************************************************************************/
  206. /* 函数名称  : main                                                           */
  207. /* 函数描述  : 主函数                                                         */
  208. /* 输入参数  : 无                                                             */
  209. /* 参数描述  : 无                                                             */
  210. /* 返回值    : 无                                                             */
  211. /******************************************************************************/
  212. void main(void)
  213. {
  214.         m = 0;
  215.     f = 0;
  216.         EA = 1;
  217.        
  218.         IT1 = 1;
  219.     EX1 = 1;
  220.        
  221.         TMOD = 0x11;  
  222.    
  223.     PulseWidth = 0;
  224.     count = 0;
  225.     pwm = 0;
  226.     Time0_Init();

  227.         while(1)
  228.         {
  229.             Inf_Dispose();            //红外接收处理
  230.         display();                //数码管显示
  231.     }
  232. }
  233. /******************************************************************************/
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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