找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外遥控8路电机程序

[复制链接]
跳转到指定楼层
楼主
ID:79544 发表于 2015-7-23 23:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /**********************************************************
  2.                         正确的外部中断1 P3^3红外接收 控制LED灯
  3.                 并显示键值  
  4.                                         红外遥控控制机械臂

  5.                         P0^6位使能。PO^7段使能。P2口输出数据
  6.                         单片机:STC89C52
  7.                         晶振:11.0592M
  8.                         苏义江
  9.                          2015年4月22日

  10. *********************************************************/
  11. #include<12c5a.h>
  12. #define QIANJIN   a=1;b=0;c=1;d=0;
  13. #define HOUTUI    a=0;b=1;c=0;d=1;
  14. #define ZUOZHUAN  a=0;b=1;c=1;d=0;
  15. #define YOUZHUAN  a=1;b=0;c=0;d=1;
  16. #define STOP      a=1;b=1;c=1;d=1;

  17. sbit wei =P0^6;
  18. sbit duan=P0^7;
  19. sbit ting   =P2^7;
  20. sbit xzdj1a =P0^0;//行走电机
  21. sbit xzdj1b =P0^1;
  22. sbit xzdj2a =P0^2;
  23. sbit xzdj2b =P0^3;

  24. sbit toua  =P0^6;//头电机
  25. sbit toub  =P0^7;
  26. sbit shoua =P1^0;//手电机
  27. sbit shoub =P1^1;
  28. sbit wana  =P1^2;//腕电机
  29. sbit wanb  =P1^3;
  30. sbit zhoua =P1^4;//肘电机
  31. sbit zhoub =P1^5;
  32. sbit zhou1a=P1^6;
  33. sbit zhou1b=P1^7;
  34. sbit jiana =P2^0;//肩电机
  35. sbit jianb =P2^1;
  36. sbit jian1a=P2^2;
  37. sbit jian1b=P2^3;
  38. uchar irtime;    //红外时间
  39. uchar startflag; //起始标志位
  40. uchar irdata[33];//多少个数据
  41. uchar bitnum;    //第几位
  42. uchar irreceok;  //红外接收完成
  43. uchar ircode[4]; //用户码和键值码4位
  44. uchar irprosok;  //红外接收结束
  45. uchar disp[4];   //分离出4位数据显示

  46. uchar code table[]={0xfe,0xfd,0xfb,0xf7};
  47.                                 //        0xef,0xbf,0xdf,0x7f};
  48. uchar code smg[]={0xC0,0xF9,0xA4,0xB0,0x99,
  49.                                         0x92,0x82,0xf8,0x80,0x90,0x88,
  50.                                         0x83,0xC6,0xA1,0x86,0x8E};
  51. /*void delay_50ms(uint t)//12m晶振50ms秒延时
  52. {
  53.         uint j;
  54.         for(;t>0;t--)
  55.         for(j=6245;j>0;j--);
  56. }
  57. void delay_1ms(uint t)//12m晶振1ms秒延时
  58. {
  59.         uint j,k;
  60.         for(j=t;j>0;j--)
  61.         for(k=120;k>0;k--);
  62. }*/
  63. void delay_50us(uint t)//12m晶振50us秒延时
  64. {
  65.         uchar j;
  66.         for(;t>0;t--)
  67.         for(j=19;j>0;j--);
  68. }
  69. void timer0init() //定时器初始化
  70. {
  71. //        TMOD=0X12;//T1方式1.T0方式2
  72.         TMOD=0X02;//T0方式2
  73.         TH0=0X00;//高8位清零
  74.         TL0=0X00;//低8位清零
  75.         EA=1;
  76.         ET0=1;
  77.         TR0=1;       
  78. }
  79. void int0init()//外部中断1初始化
  80. {
  81.         IT1=1; //下降沿触发
  82.         EX1=1; //打开外部中断1
  83.         EA=1;  // 开总中断
  84. }
  85. void irwork()//分离16进制红外数据
  86. {
  87.         disp[2]=ircode[0]/16;//键值码
  88.         disp[1]=ircode[0]%16;
  89.         disp[3]=ircode[2]/16;//识别码
  90.         disp[0]=ircode[2]%16;


  91. }
  92. void  shoushen()
  93. {
  94.         shoua=1;
  95.         shoub=0;
  96. }
  97. void  shouzhua()
  98. {
  99.         shoua=0;
  100.         shoub=1;
  101. }
  102. void  wanzuo()
  103. {
  104.         wana =1;
  105.         wanb=0;
  106. }
  107. void  wanyou()
  108. {
  109.         wana =0;
  110.         wanb=1;
  111. }
  112. void zhouzuo()
  113. {
  114.   zhoua=1;
  115.   zhoub=0;
  116. }
  117. void zhouyou()
  118. {
  119.   zhoua=0;
  120.   zhoub=1;
  121. }
  122. void zhoushang()
  123. {
  124.   zhou1a=1;
  125.   zhou1b=0;
  126. }
  127. void zhouxia()
  128. {
  129.   zhou1a=0;
  130.   zhou1b=1;
  131. }
  132. void xzqianjin()
  133. {
  134.         xzdj1a =1;
  135.         xzdj1b =0;
  136.         xzdj2a =1;
  137.         xzdj2b =0;
  138. }
  139. void xzhoutui()
  140. {
  141.         xzdj1a =0;
  142.         xzdj1b =1;
  143.         xzdj2a =0;
  144.         xzdj2b =1;
  145. }
  146. void xzzuozhuan()
  147. {
  148.         xzdj1a =0;
  149.         xzdj1b =1;
  150.         xzdj2a =1;
  151.         xzdj2b =0;
  152. }
  153. void xzyouzhuan()
  154. {
  155.         xzdj1a =1;
  156.         xzdj1b =0;
  157.         xzdj2a =0;
  158.         xzdj2b =1;
  159. }
  160. void jianshang()
  161. {
  162.         jiana=1;
  163.         jianb=0;
  164. }
  165. void jianxia()
  166. {
  167.         jiana=0;
  168.         jianb=1;
  169. }
  170. void jianqian()
  171. {
  172.    jian1a=1;
  173.    jian1b=0;
  174. }
  175. void jianhou()
  176. {
  177.    jian1a=0;
  178.    jian1b=1;
  179. }
  180. void tingsha()
  181. {
  182.         P0=0Xff;
  183.         P2 =0XFF;
  184.         P1=0XFF;
  185. }
  186. void display()//显示
  187. {
  188.         P2=0xfe;
  189.         wei=1;
  190.         wei=0;
  191.         delay_50us(50);

  192.         P2=smg[disp[0]];
  193.         delay_50us(50);
  194.         duan=1;
  195.         duan=0;
  196.         P2=0xff;

  197.         P2=0xfd;
  198.         wei=1;
  199.         wei=0;
  200.         delay_50us(50);

  201.         P2=smg[disp[1]];
  202.         delay_50us(50);
  203.         duan=1;
  204.         duan=0;
  205.         P2=0xff;

  206.         P2=0xfb;
  207.         wei=1;
  208.         wei=0;
  209.         delay_50us(50);

  210.         P2=smg[disp[2]];
  211.         delay_50us(50);
  212.         duan=1;
  213.         duan=0;
  214.         P2=0xff;

  215.         P2=0xf7;
  216.         wei=1;
  217.         wei=0;
  218.         delay_50us(50);

  219.         P2=smg[disp[3]];
  220.         delay_50us(50);
  221.         duan=1;
  222.         duan=0;
  223.         P2=0xff;
  224.        
  225. }
  226. /*void display()//显示
  227. {
  228.         uchar i;       
  229.         for(i=0;i<4;i++)
  230.         {
  231.                 duan=1;
  232.                 duan=0;
  233.                 P2=smg[disp[i]];
  234.                 delay_50us(50);
  235.                 wei=1;
  236.                 wei=0;
  237.                 P2=table[i];
  238.                 delay_50us(20);
  239.         }
  240. }*/
  241. void irpros()//红外处理
  242. {
  243.         uchar k,i,j;
  244.         uchar value;   //红外数据值
  245.         k=1;           //从第一个数据码开始
  246.         for(j=0;j<4;j++)//只取出4组码
  247.         {
  248.                 for(i=0;i<8;i++)//8位数据循环8次
  249.                 {
  250.                 //右移一位。移动7次。从低位开始移
  251.                         value=value>>1;
  252.                 //循环这个判断语句8次.判断是1 还是0
  253.                 //大于7为 1. 小于7为 0
  254.                         if(irdata[k]>7)
  255.                         {                               
  256.                                 value=value|0x80;
  257.                         }
  258.                         k++;
  259.                 }
  260.         //把数据放到数组中
  261.                 ircode[j]=value;       
  262.         }
  263.         irprosok=1;
  264. }
  265. void main()
  266. {       
  267.         timer0init() ;
  268.         int0init();
  269.         while(1)
  270.         {
  271.                 if(irreceok)
  272.                 {
  273.                         irpros();
  274.                         irreceok=0;
  275.                 }
  276.                 if(irprosok)
  277.                 {
  278.                         irwork();
  279.                         irprosok=0;
  280.                 }
  281.                 display();
  282.                 switch(ircode[2])
  283.                 {
  284.                 //        case 0x05: QIANJIN ;break;
  285.                 //        case 0x06: HOUTUI  ;break;
  286.                 //        case 0x07: ZUOZHUAN;break;
  287.                 //        case 0x08: YOUZHUAN;break;
  288.                 //        case 0x04: STOP ;   break;

  289.                         case 0x02: xzqianjin(); break;//电视遥控器键值
  290.                         case 0x0a: xzhoutui()  ;break;//电视遥控器键值
  291.                         case 0x07: xzzuozhuan();break;//电视遥控器键值
  292.                         case 0x05: xzyouzhuan(); break;//电视遥控器键值
  293.                         case 0x06: tingsha();  break;//电视遥控器键值
  294.                         case 0x18: tingsha();  break;

  295.                         case 0x17: shoushen(); break;
  296.                         case 0x14: shouzhua(); break;

  297.                         case 0x16: wanzuo();   break;
  298.                         case 0x13: wanyou();   break;

  299.                         case 0x15: zhoushang();break;
  300.                         case 0x12: zhouxia();  break;

  301.                         case 0x11: zhouzuo();  break;
  302.                         case 0x1a: zhouyou();  break;

  303.                         case 0x10: jianqian(); break;
  304.                         case 0x0e: jianhou();  break;

  305.                         case 0x0f: jianshang();break;
  306.                         case 0x19: jianxia();  break;

  307.                

  308.                
  309.                         default:break;
  310.                 }       
  311.         }
  312. }
  313. void timer0() interrupt 1//定时器0中断服务函数
  314. {
  315.         irtime++; //加到255自动清零再加
  316. }
  317. void int0() interrupt 2//定时器1中断服务函数
  318. {
  319.         if(startflag)
  320.         {
  321.                 if(irtime>32)//检测引导码
  322.                 {
  323.                         bitnum=0;
  324.                 }
  325.                 irdata[bitnum]=irtime;
  326.                 irtime=0;
  327.                 bitnum++;
  328.                 if(bitnum==33)
  329.                 {
  330.                         bitnum=0;
  331.                         irreceok=1;//红外接收结束
  332.                 }
  333.         }
  334.         else
  335.         {
  336.                 startflag=1;
  337.                 irtime=0;
  338.         }
  339.        
  340. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2015-7-24 02:36 来自手机 | 只看该作者
楼主谢谢分享能给个电路图,或者说明一下电机用什么芯片驱动?怎么接线吗?
回复

使用道具 举报

板凳
ID:74784 发表于 2015-7-24 19:40 | 只看该作者
8个电机都接哪了???
回复

使用道具 举报

地板
ID:79544 发表于 2015-8-3 20:18 | 只看该作者
admin 发表于 2015-7-24 02:36
楼主谢谢分享能给个电路图,或者说明一下电机用什么芯片驱动?怎么接线吗?

您好,我用的是L6203驱动电机,8个电机就用8块,和L298的驱动方法一样。电路图自己画的不会传无奈。
回复

使用道具 举报

5#
ID:79544 发表于 2015-8-3 20:20 | 只看该作者
lxa0 发表于 2015-7-24 19:40
8个电机都接哪了???

手,腕,肘,肩。还有头。都是驱动芯片L6203控制的。
回复

使用道具 举报

6#
ID:119663 发表于 2016-9-3 12:38 | 只看该作者
太棒了!多谢分享
回复

使用道具 举报

7#
ID:194844 发表于 2017-5-1 14:20 | 只看该作者

太棒了!多谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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