找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外控制舵机

  [复制链接]
跳转到指定楼层
楼主
ID:93295 发表于 2016-3-15 10:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
红外控制舵机
  1. /*******************************************************************************
  2. *具体操作:        使用配套的遥控,按按键,查看显示屏键值。                                                   *
  3. *        键值表:   45H    46H      47H                                                 *
  4. *                                   44H    40H      43H                                                                                   *
  5. *                                   07H    15H      09H                                                                                   *
  6. *                                   16H    19H      0DH                                                                                   *
  7. *                                   0CH    18H      5EH                                                                                   *
  8. *                                   08H    1CH      5AH                                                                                   *
  9. *                                   42H    52H      4AH                                                                                   *
  10. *******************************************************************************/
  11. #include<reg52.h>
  12. #define uchar unsigned char
  13. sbit IR=P3^3;                                //红外中断引脚
  14. sbit wela=P2^6;                                //数码管为选位
  15. sbit dula=P2^5;                                //数码管段选为
  16. sbit PWM=P1^5;                                //PWM信号输出
  17. uchar IRCOM[7];                                //键值存储
  18. uchar code tab[]={                        //共阳极数码管段选数组
  19. 0xc0,0xf9,0xa4,0xb0,0x99,
  20. 0x92,0x82,0xf8,0x80,0x90};
  21. uchar dj,count;                                        //dj舵机角度标识引脚
  22. void delay0(uchar x)                        //延时0.14ms
  23. {
  24.         uchar i;
  25.         while(x--)
  26.         {
  27.                 for(i=0;i<13;i++);
  28.         }
  29. }
  30. void inter() interrupt 2                //外部中断
  31. {       
  32.         unsigned char j,k,N=0;
  33.         EX1=0;
  34.         delay0(15);
  35.         if(IR==1)
  36.         {
  37.                 EX1=1;
  38.                 return;
  39.         }
  40.         while(!IR)
  41.                 delay0(1);                           //跳过9ms低电平引导码
  42.         for(j=0;j<4;j++)
  43.         {
  44.                 for(k=0;k<8;k++)
  45.                 {
  46.                         while(IR)
  47.                                 delay0(1);                //跳过4.5ms的高电平
  48.                         while(!IR)
  49.                                 delay0(0);                //跳过0.56ms低电平
  50.                         while(IR)                        //计算高电平的时间
  51.                         {
  52.                                 delay0(1);
  53.                                 N++;
  54.                                 if(N>=30)                //高电平过长终止外部中断
  55.                                 {
  56.                                         EX1=1;
  57.                                         return;
  58.                                 }
  59.                         }
  60.                         IRCOM[j]=IRCOM[j]>>1;//向右移位补零
  61.                         if(N>=8)
  62.                         {
  63.                                 IRCOM[j]=IRCOM[j]|0X80;
  64.                         }                                         //如果为高电平IRCOM为1
  65.                         N=0;       
  66.                 }
  67.         }
  68.   if(IRCOM[2]!=~IRCOM[3])                 //原码与反码对比验证,如果不正确则停止
  69.   {
  70.           EX1=1;
  71. //        IROK=0;
  72.         return;       
  73.   }
  74.   IRCOM[4]=IRCOM[2]>>4;                //高四位变低四位
  75.   IRCOM[5]=IRCOM[2]&0X0F;        //取键值得低四位
  76.   IRCOM[7]=IRCOM[4]*16+IRCOM[5];//十六进制换算成十进制
  77.   EX1=1;
  78. }
  79. void delay(unsigned int z)
  80. {
  81.         unsigned int x,y;
  82.         for(x=z;x>0;x--)
  83.                 for(y=110;y>0;y--);
  84. }
  85. void display(uchar num)                  //十进制键值显示
  86. {
  87.         uchar         bai,shi,ge;
  88.         bai=num/100;
  89.         shi=(num%100)/10;
  90.         ge=num%10;
  91.         wela=1;
  92.         P0=0x01;
  93.         wela=0;
  94.         P0=0XFF;
  95.         dula=1;
  96.         P0=tab[bai];
  97.         dula=0;
  98.         delay(5);

  99.         wela=1;
  100.         P0=0X02;
  101.         wela=0;
  102.         P0=0xff;
  103.         dula=1;
  104.         P0=tab[shi];
  105.         dula=0;
  106.         delay(5);

  107.         wela=1;
  108.         P0=0x04;
  109.         wela=0;
  110.         P0=0xff;
  111.         dula=1;
  112.         P0=tab[ge];
  113.         dula=0;
  114.         delay(5);
  115.         switch(num)
  116.         {
  117.                 case 7:
  118.                                 dj--;
  119.                                 count=0;
  120.                                 if(dj==0)
  121.                                         dj=1;
  122.                 break;
  123.                 case 21:               
  124.                                 dj++;
  125.                                 count=0;
  126.                                 if(dj==6)
  127.                                         dj=5;
  128.                 break;       
  129.                 default:
  130.                 break;                       
  131.                 }
  132. }
  133. /*void IRscan(uchar num)
  134. {
  135.         uchar temp;
  136.         temp=num;
  137.         if(IROK!=0)
  138.         {
  139.                 switch(num)
  140.                 {
  141.                         case 7:
  142.                                                 dj--;
  143.                                                 count=0;
  144.                                                 if(dj==0)
  145.                                                 dj=1;
  146.                         break;
  147.                         case 21:               
  148.                                                 dj++;
  149.                                                 count=0;
  150.                                                 if(dj==6)
  151.                                                 dj=5;
  152.                         break;       
  153.                         default:
  154.                         break;                       
  155.                 }
  156.                 IROK=0;
  157.         }
  158. }  */
  159. void main()
  160. {
  161.         EA=1;          //全局中断开
  162.     EX1=1;         //外部中断1开
  163.     IT1=1;
  164.         TMOD=0X010;
  165.         TH1=0XFE;
  166.         TL1=0X0C;
  167.         ET1=1;
  168.         TR1=1;
  169.         count=0;
  170.         while(1)
  171.         {       
  172. //                IRscan(IRCOM[7]);
  173.                 display(IRCOM[7]);
  174.                 delay(2);
  175.         }
  176. }
  177. void time1() interrupt 3
  178. {
  179.         TH1=0XFE;
  180.         TL1=0X0C;
  181.         count++;
  182.         if(count<dj)
  183.                 PWM=1;
  184.         else
  185.                 PWM=0;
  186.         count=count%40;
  187. }
复制代码


舵机 红外.rar

21.55 KB, 下载次数: 48, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:107891 发表于 2016-3-15 10:40 | 只看该作者
艾玛。。坨机 我现在正在研究
回复

使用道具 举报

板凳
ID:78462 发表于 2016-4-3 20:44 | 只看该作者
希望能好好研究下
回复

使用道具 举报

地板
ID:84495 发表于 2016-4-4 09:40 | 只看该作者
我有个爱顶贴的好习惯
回复

使用道具 举报

5#
ID:122267 发表于 2016-5-20 22:42 | 只看该作者
我想参考下
回复

使用道具 举报

6#
ID:121473 发表于 2016-5-23 08:47 | 只看该作者
认真学习
回复

使用道具 举报

7#
ID:117161 发表于 2016-5-31 19:32 | 只看该作者
  有没有原理图
回复

使用道具 举报

8#
ID:117984 发表于 2016-6-12 17:26 | 只看该作者
谢谢楼主 一起学习一起加油
回复

使用道具 举报

9#
ID:135495 发表于 2016-8-2 01:51 | 只看该作者
新手
回复

使用道具 举报

10#
ID:152251 发表于 2016-12-5 11:22 | 只看该作者
我有个爱顶贴的好习惯
回复

使用道具 举报

11#
ID:190886 发表于 2017-4-18 16:43 | 只看该作者
46和47行代码应该在41行后面,因为接收引导码是9ms低电平+4.5ms高电平,不分开~
回复

使用道具 举报

12#
ID:190939 发表于 2017-4-18 19:13 | 只看该作者
舵机,就是挺多用的,程序有点不知道怎么入手
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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