标题: AT89C2051单片机电灯红外遥控接收板 [打印本页]

作者: shuige169    时间: 2014-12-13 22:24
标题: AT89C2051单片机电灯红外遥控接收板
这个AT89C2051单片机电灯红外遥控接收板,单片机选用的是AT89C2051,制作时省去了数码管显示部分的内容,红处接收头的输入端为单片机的P3.2口,输出端为单片机的P1.1口,P1.1输出经三极管推动断电器来控制电灯的开关。单片机供电部分这里没有单独进行设计,爱好者可以根据自己的实际情况灵活选择用其它方式供电。AT89C2051单片机电灯红外遥控接收板程序附后。


  1. #include<reg52.h>   

  2. sbit IR=P3^2;  //红外接口

  3. sbit R1=P1^0;        //输出1

  4. sbit R2=P1^1;

  5. sbit R3=P1^2;

  6. sbit R4=P1^3;

  7. sbit R5=P1^4;

  8. sbit R6=P1^5;

  9. sbit R7=P1^6;

  10. sbit R8=P1^7;         //输出8

  11. #define DataPort P0 //定义数据端口

  12. sbit LATCH1=P2^2;// 段锁存

  13. sbit LATCH2=P2^3;//                /*------------------------------------------------

  14.                 全局变量声明

  15. ------------------------------------------------*/


  16. unsigned char code DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值


  17. 0~9

  18. unsigned char  irtime;//红外用全局变量


  19. bit irpro_ok,irok;

  20. unsigned char IRcord[4];

  21. unsigned char irdata[33];


  22. /*------------------------------------------------

  23.                   函数声明

  24. ------------------------------------------------*/


  25. void Ir_work(void);

  26. void Ircordpro(void);


  27. /*------------------------------------------------

  28.                   定时器0中断处理

  29. ------------------------------------------------*/


  30. void tim0_isr (void) interrupt 1 using 1

  31. {

  32.   irtime++;  //用于计数2个下降沿之间的时间

  33. }


  34. /*------------------------------------------------

  35.                   外部中断0中断处理

  36. ------------------------------------------------*/

  37. void EX0_ISR (void) interrupt 0 //外部中断0服务函数

  38. {

  39.   static unsigned char  i;             //接收红外信号处理

  40.   static bit startflag;                //是否开始处理标志位

  41. if(startflag)                        

  42. {

  43.     if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms

  44.         i=0;

  45.     irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1

  46.     irtime=0;

  47.     i++;

  48. if(i==33)

  49.            {

  50.         irok=1;

  51. i=0;

  52.         }

  53.   }

  54. else

  55. {

  56. irtime=0;

  57. startflag=1;

  58. }

  59. }


  60. /*------------------------------------------------

  61.                 定时器0初始化

  62. ------------------------------------------------*/

  63. void TIM0init(void)//定时器0初始化

  64. {

  65.   TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值

  66.   TH0=0x00; //重载值

  67.   TL0=0x00; //初始化值

  68.   ET0=1;    //开中断

  69.   TR0=1;   

  70. }

  71. /*------------------------------------------------

  72.                   外部中断0初始化

  73. ------------------------------------------------*/

  74. void EX0init(void)

  75. {

  76.         IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)

  77.         EX0 = 1;   //使能外部中断

  78.         EA = 1;    //开总中断

  79. }

  80. /*------------------------------------------------

  81.                   键值处理

  82. ------------------------------------------------*/


  83. void Ir_work(void)//红外键值散转程序

  84. {

  85.     switch(IRcord[3])//判断第4个数码值,电视遥控和机顶盒遥控不一样,所以加了两端,两个遥控器都能用


  86. ,实际用在灯上没用这么多路

  87.     {

  88. case 0x07:DataPort=DuanMa[1];R1=~R1;break;//1 显示相应的按键值

  89. case 0x0b:DataPort=DuanMa[2];R2=~R2;break;//2

  90. case 0x0f:DataPort=DuanMa[3];R3=~R3;break;//3

  91. case 0x6f:DataPort=DuanMa[3];R3=~R3;break;//3

  92. case 0x13:DataPort=DuanMa[4];R4=~R4;break;//4

  93. case 0x17:DataPort=DuanMa[5];R5=~R5;break;//5

  94. case 0x1b:DataPort=DuanMa[6];R6=~R6;break;//6

  95. case 0x1f:DataPort=DuanMa[7];R7=~R7;break;//7

  96. case 0x23:DataPort=DuanMa[8];R8=~R8;break;//8

  97. case 0x27:DataPort=DuanMa[0];P1=0xf0;break;//off

  98.     case 0x03:DataPort=DuanMa[0];P1=0xf0;break;//off

  99.              default:break;

  100.    }

  101.    switch(IRcord[2])//判断第三个数码值

  102.    {

  103.      case 0x10:DataPort=DuanMa[1];R1=~R1;break;//1 显示相应的按键值

  104.      case 0x03:DataPort=DuanMa[2];R2=~R2;break;//2

  105.      case 0x01:DataPort=DuanMa[3];R3=~R3;break;//3

  106.      case 0x06:DataPort=DuanMa[4];R4=~R4;break;//4

  107.      case 0x09:DataPort=DuanMa[5];R5=~R5;break;//5

  108.      case 0x1d:DataPort=DuanMa[6];R6=~R6;break;//6

  109.      case 0x1f:DataPort=DuanMa[7];R7=~R7;break;//7

  110.      case 0x0d:DataPort=DuanMa[8];R8=~R8;break;//8

  111.      case 0x27:DataPort=DuanMa[0];P1=0xf0;break;//off

  112.      case 0x6f:DataPort=DuanMa[0];P1=0xf0;break;//off

  113.      default:break;

  114.    }         

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

  116. }

  117. /*------------------------------------------------

  118.                 红外码值处理

  119. ------------------------------------------------*/

  120. void Ircordpro(void)//红外码值处理函数

  121. {

  122.    unsigned char i, j, k;

  123.    unsigned char cord,value;

  124.    k=1;

  125.    for(i=0;i<4;i++)      //处理4个字节

  126.    {

  127.       for(j=1;j<=8;j++) //处理1个字节8位

  128.       {

  129.          cord=irdata[k];

  130.          if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差

  131.          value|=0x80;

  132.          if(j<8)

  133. {

  134.    value>>=1;

  135. }

  136.          k++;

  137.      }

  138.      IRcord[i]=value;

  139.      value=0;     

  140.   }

  141.   irpro_ok=1;//处理完毕标志位置1

  142. }


  143. /*------------------------------------------------

  144.                     主函数

  145. ------------------------------------------------*/

  146. void main(void)

  147. {

  148.    P1=0xf0;

  149.    EX0init(); //初始化外部中断

  150.    TIM0init();//初始化定时器


  151.    DataPort=0xfe; //取位码 第一位数码管选通,即二进制1111 1110

  152.    LATCH2=1;      //位锁存

  153.    LATCH2=0;

  154.    while(1)//主循环

  155.    {

  156.       if(irok)                        //如果接收好了进行红外处理

  157.       {   

  158. Ircordpro();

  159.         irok=0;

  160.       }

  161.       if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等

  162.       {

  163. Ir_work();

  164.       }

  165.    }

  166. }
复制代码



AT89C2051单片机电灯红外遥控接收板程序.rar (30.79 KB, 下载次数: 167)




作者: lising    时间: 2014-12-17 20:07
学习研究。
作者: pps111    时间: 2014-12-19 16:04
一般吧~~和我找人设计的差小小
作者: pps111    时间: 2014-12-19 16:04
等下发给你参考
作者: 51hei电控2112312    时间: 2014-12-21 04:29
很好,正需要
作者: xsynet    时间: 2015-1-6 12:35
请问楼主,我接好了,但按下遥控器后,p3.2高达4.5V,什么原因?谢谢

作者: lxl2255    时间: 2015-1-7 09:45
good  想看看
作者: xsynet    时间: 2015-1-11 15:58
要是有PCB就好了
作者: xsynet    时间: 2015-1-11 15:58
有PCB吗
作者: VECENT_LIN    时间: 2015-1-14 17:23
谢谢!!!
作者: shahai    时间: 2015-1-15 09:50
感谢楼主,这个对我有用
作者: fzg63031525    时间: 2015-1-15 10:15
资料不错!下载来学习一下!
作者: blj178    时间: 2015-1-15 14:59
学习研究。
作者: hj0787    时间: 2015-1-15 19:49
不错呀,研究研究
作者: 兔匪先生    时间: 2015-1-15 23:53
可以学习一下
作者: 雪中梅花    时间: 2015-1-16 20:32
谢谢楼主的奉献
作者: jcyya    时间: 2015-1-16 23:17
谢谢楼主分享!学习了。
作者: 雪中梅花    时间: 2015-2-20 19:02
谢谢楼主的奉献
作者: meilidianzhi    时间: 2015-2-23 22:23
谢谢了
作者: meilidianzhi    时间: 2015-2-23 22:23

作者: fontex    时间: 2015-2-26 09:59
很好,正需要。
作者: 姗姗    时间: 2015-3-10 10:10
先下载下来学习下。。。。
作者: 18246288682    时间: 2015-4-14 22:14
学习一下 好东西啊
作者: 茂茂耶    时间: 2015-4-15 18:48
好好看看
作者: 星星一眨眼    时间: 2015-4-15 18:58
感谢楼主分享,我又学到东西了
作者: 壮志凌云3811    时间: 2015-4-16 07:48
学习一下思路
作者: leichyi    时间: 2015-4-25 09:26
好东西
作者: leichyi    时间: 2015-4-25 09:27
要多几路就好了
作者: bhjyqjs    时间: 2015-6-2 08:45
程序虽然是网络公开的资料,但楼主的动手能力真棒!万用板焊的板子,有的元件还是二手的,却做出了成功的作品,值得学习!顶一个!!!
作者: ky3830446    时间: 2015-7-20 04:49
太好了!!
作者: 华呆    时间: 2015-7-31 23:20
谢谢楼主的贡献
作者: goodlbg123    时间: 2015-10-3 11:18
下载有时间仿制学习一下
作者: goodlbg123    时间: 2015-10-3 11:41
上个电路图吧
作者: 用户2111157    时间: 2015-10-5 15:12
下载下来好好研究学习
作者: moose    时间: 2015-10-11 14:12
感谢楼主
作者: shishi007    时间: 2015-10-26 15:57
下来研究一下。。。。
作者: micmiutom    时间: 2017-5-1 16:37

 一般吧~~和我找人设计的差小小
作者: bhjyqjs    时间: 2017-5-9 10:43
好东西,谢楼主分享!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1