找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红外摇控继电器程序,如何增加一个红外中断使能?

[复制链接]
跳转到指定楼层
楼主
各位大虾,

帮忙看一下线路图,再在原工程程序上赋值一个红外中断使能工作。
红外键值码:
0x15:   +
0x07:   -
将两键值码赋值到P2^0 ~ P2^1  IO  口工作,电机有正反转功能
键码按下有正反转,松开键码停止转动。


单片机源程序如下:
  1. /********************************************************************/
  2. #include<reg52.h>                           //包含头文件特殊功能寄存器定义

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

  4. sbit beep = P3^7;          //蜂鸣器定义
  5. bit flag_beep_en;          //蜂鸣器使能标志
  6. bit flag_200ms;            //200ms标志
  7. bit flag_100ms;            //100ms标志

  8. sbit jdq1=P1^0;             //定义继电器为P1.0~2  IO口
  9. sbit jdq2=P1^1;
  10. sbit jdq3=P1^2;

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

  12. bit irpro_ok,irok;
  13. unsigned char IRcord[4];
  14. unsigned char irdata[33];

  15. void ir_work(void);
  16. void ircordpro(void);

  17. void tim0_isr (void)interrupt 1 using 1
  18. {
  19.    irtime++;      //用于计数2个下降沿        之间的时间                                                                                                                  
  20. }

  21. void EX0_isr (void) interrupt 0         //外部中继0服务涵数
  22. {
  23.        static unsigned char i;               //接收红外信号处理
  24.            static bit startflag;                   //是否开始处理标志位

  25.            if(startflag)
  26.            {
  27.                   if(irtime<63&&irtime>=33)         //引导码TC9012的头码,9ms+4.5ms
  28.                           i=0;
  29.                           irdata[ i]=irtime;    //存储每个电平的持续时间,用于以后判断是0还是1
  30.                           irtime=0;
  31.                           i++;
  32.                           if(i==33)
  33.                           {
  34.                                  irok=1;
  35.                                          i=0;
  36.                           }
  37.            }
  38.            else
  39.            {
  40.                   irtime=0;
  41.                           startflag=1;
  42.            }
  43. }

  44. void TIMOinit(void)  //定时器0初始化
  45. {
  46.       TMOD=0x02;    //定时器0工作方式2,TH0是重装值,TL0是初值
  47.           TH0=0x00;     //重装值
  48.           TL0=0x00;     //初始化值
  49.           ET0=1;        //开中断
  50.           TR0=1;        
  51. }
  52. void EX0init(void)
  53. {
  54.      IT0 = 1;       //指定外部中断0下降沿触发,INTO(P3.2)
  55.          EX0 = 1;       //使能外部中断
  56.          EA = 1;        //开总中断
  57. }
  58. void  ir_work(void)     //红外键值散转程序
  59. {
  60.        switch(IRcord[2]) //判断第三个数码值
  61.            {
  62.                    case 0x46:jdq1=!jdq1;break;//电源显示相应的按键值
  63.                            default:break;
  64.            }
  65.            irpro_ok=0;  //处理完成标志
  66.          {
  67.                 beep = 0;               //蜂鸣器叫一声
  68.                                    // delay_1ms(50);
  69.                                            //        beep = 1;
  70.           }
  71. }
  72. void ircordpro(void)   //红外码值处理涵数
  73. {
  74.       unsigned char i,j,k,cord,value;
  75.           k=1;
  76.           for(i=0;i<4;i++)  //处理4个字节
  77.           {
  78.                  for(j=1;j<=8;j++)  //处理1个字节8位
  79.                          {
  80.                                 cord=irdata[k];
  81.                                         if(cord>7)  //大于某值为1
  82.                                         value=value|0x80;
  83.                                         if(j<8)
  84.                                         {
  85.                                               value>>=1;
  86.                                         }
  87.                                         k++;
  88.                          }
  89.                          IRcord[ i]=value;
  90.                          value=0;
  91.           }
  92.           irpro_ok=1;   //处理完毕标志位置1
  93. }
  94. void main(void)
  95. {
  96.         EX0init();  //初始化外部中断
  97.                 TIMOinit();  //初始化定时器
  98.                 jdq1=1;       //继电器初始化为关闭状态
  99.                 while(1)   //主循环
  100.                 {
  101.                        if(irok)                        //如果接收好了进行红外处理
  102.                            {
  103.                                    ircordpro();
  104.                                            irok=0;
  105.                            }
  106.                            if(irpro_ok)            //如果处理好后进行工作处理                           {
  107.                               ir_work();
  108.                            }
  109.                 }
  110. }
复制代码


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

使用道具 举报

沙发
ID:584814 发表于 2019-12-26 08:09 | 只看该作者
在定时器中读红外,符合你的条件就做相应的事情。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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