电子技术论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
下载方法|用单线程|避免多扣帖子规范|求助必读|发帖建议积分策略|勋章介绍|新人必读获取金币|推广论坛|出售帖子基本礼节|致会员信|版规总则
禁涉政治|反对低俗|举报专帖征集相片|留下足迹|推荐精华上传附件|制作分卷|使用网盘禁发qq群|恶意灌水|纯表情帖加入团队|监督机制|安全上网
查看: 3701|回复: 25

单片红外线遥控问题帮忙看看

[复制链接]
发表于 2020-5-2 19:53:50 | 显示全部楼层 |阅读模式

注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
最近用STC单片机做一个空调红外线摇控器,半学半搞,真的是有点山穷水尽了,发射部分原理是搞懂了,但在编程上遇到问题,希望有大神帮助一下,现在就是定时器做精准延时这一块有问题。在网上看了别人的程序,但还是不能用,也有些看不懂,发个写的定时器延时程序,.

        TMOD = 0x02; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
        EA = 1;        //中断总开关



        TH0 = 0xff; //16位计数寄存器T0高8位
        TL0 = 0xff; //16位计数寄存器T0低8位(0xff = 1uS延时)
        ET0 = 1; //T/C0中断开关
        TR0 = 1; //T/C0启动开关
        TF0 = 0;
}这个是初始化,没有问题。
void T_C0 (void) interrupt 1  using 1{ //切换寄存器组到1
         

   cou--; //软计数器-1
这个是定时中断处理。
  /*********************************************************************************************/
void Delayus(unsigned int t)        //用定时器在做延时1US,方便调用
{
           TF0 = 0; //T/C0启动开关
   
      cou=t;
      while(cou);
          
}这个是定时器中断做的延时程序。想用这个直接调用延时控制红外线编码延时,如9MS开头,4.5MS间隔,0.65MS 1或0.
这个原理好像是行的通,但实际用不了,在神们看看是那里出了问题,或者有更好的建议,不胜感激。
发表于 2020-5-9 00:53:12 来自手机 | 显示全部楼层
1us延时,没有意义,因为它什么也做不了,太短
发表于 2020-5-9 01:09:41 来自手机 | 显示全部楼层
一看你这代码不全(抄的吧。),看来你还不了解单片机,继续努力。代码缺很多重要的东西
 楼主| 发表于 2020-5-9 17:14:59 | 显示全部楼层
露露维修 发表于 2020-5-9 01:09
一看你这代码不全(抄的吧。),看来你还不了解单片机,继续努力。代码缺很多重要的东西 ...

抄谈不上,只能说是借鉴,软件是通用的只要自已明的是什么意思就行了,没有必要自已一个字一个字的去写吧!代码没有缺少只是我没有发出来,是可以编译的完整程序,内行一看就明白了,当然我也是个小白,想做一个红外遥控器,编码原理是懂了,就是程序上连续精准延时有问题,道理讲得通,实际不能用,帮我看看
 楼主| 发表于 2020-5-9 17:17:07 | 显示全部楼层
本帖最后由 CCTV-6 于 2020-5-9 17:25 编辑
露露维修 发表于 2020-5-9 00:53
1us延时,没有意义,因为它什么也做不了,太短


我是想做红外遥控器,间隔是13US产生38KHZ载波,又做间隔延时,理论讲得通,实际上不行,帮我看看
 楼主| 发表于 2020-5-9 17:25:00 | 显示全部楼层
/*********************************************************************************************
函数名:定时/计数器初始化函数
调  用:T_C_init();
参  数:无
返回值:无
结  果:设置SFR中T/C1和(或)T/C0相关参数
备  注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽
/**********************************************************************************************/
void T_C_init (void){
        P1M0 = P1M0SET; //设置I/O口工作方式(行为推挽,列为普通输入/输出)
        P1M1 = P1M1SET;
        IRLED=1;

        TMOD = 0x02; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
        EA = 1;        //中断总开关



        TH0 = 0xf3; //16位计数寄存器T0高8位
        TL0 = 0xf3; //16位计数寄存器T0低8位(0xf3 = 13uS延时)
        ET0 = 1; //T/C0中断开关
        TR0 = 1; //T/C0启动开关
        flag = 0;
}


/**********************************************************************************************/
/*********************************************************************************************
函数名:定时/计数器0中断处理函数
调  用:[T/C0溢出后中断处理]
参  数:无
返回值:无
结  果:重新写入16位计数寄存器初始值,处理用户程序
备  注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致
/**********************************************************************************************/
void T_C0 (void) interrupt 1  { //切换寄存器组到1
cou++;
if (flag==1){//如果是1就发送38KHZ载波
                 IRLED=~IRLED;//让I/O口不断翻转
                }
                else{//如果是空闲就不发送载波
                  IRLED=1;
                }
       
        //函数内容
}
/*********************************************************************************************
函数名:报头处理函数
调  用:[T/C0溢出后中断处理]
参  数:无
返回值:无
结  果:重新写入16位计数寄存器初始值,处理用户程序
备  注:9MS报头,4.5MS间距
/**********************************************************************************************/
void ksm (void){
         flag=1;//开始发送载波
            cou=0;//计数器清0
         endcou=692;//延时9MS 692*13=9MS
do{}
           while (cou<endcou);//始终判断是不是到了9MS
          cou=0;//清0
          flag=0;//停止发送载波
     cou=0;
         endcou=346;//延时4.5MS
         do{}
           while (cou<endcou);//判断是否4.5MS
cou=0;

        }
  大神们帮我看看,
发表于 2020-5-9 21:14:43 来自手机 | 显示全部楼层
主函数呢?
 楼主| 发表于 2020-5-10 22:05:43 | 显示全部楼层

/*********************************************************************************************
函数名:数据处理函数
调  用:[T/C0溢出后中断处理]
参  数:无
返回值:无
结  果:重新写入16位计数寄存器初始值,处理用户程序
备  注:1是脉宽656US,1640US间距  0是脉宽656US,间距544US。
/**********************************************************************************************/
void sjm (bit s){//数据位码

  flag=1;
  cou=0;
  do{}
           while (cou<50);
flag=0;
cou=0;


cou=0;
   do{}
           while (cou<42);
cou=0;

        if(s){
cou=0;
do{}
           while (cou<84);
cou=0;
}       

}

/**********************************************************************************************/
void MT (unsigned char a){//字节发送
        unsigned char i,n;

        for(i=0;i<8;i++){
                n = a & 0x80;//1000 0000
                a = a << 1;//0000 1010
                if(n == 0x80){
                        sjm(1);
                }else{
                        sjm(0);
                }
        }
}
/**********************************************************************************************/
void END (void){//结束码
  flag=1;
  cou=0;
  do{}
           while (cou<50);
        flag=0;
cou=0;

  
   cou=0;
   endcou=1538;
   do{}
           while (cou<endcou);
cou=0;
}

/*********************************************************************************************/
void main (void){ //主程序
        T_C_init();//初始程序
        delay1ms(1000);
        while (1){
                ksm();
       
                MT(0xda);
                MT(0x70);
                MT(0x0e);
                MT(0x0a);
           sjm (0);sjm (1);        sjm (0);
          END();
                   MT(0x88);
                        MT(0x00);
                           MT(0x00);
                           MT(0x0c);
                   END();
                 
     delay1ms(3000);
        }
}
发表于 2020-5-11 00:47:51 来自手机 | 显示全部楼层
主问题还是在定时器设置上,你时钟是1T还是12T的,现在假设用STC51的都是1T的时钟,12M晶振,定时器T0方式0:13US的初值应该是1F64
发表于 2020-5-11 01:23:36 来自手机 | 显示全部楼层
void sjm (bit s)这个函数也有问题,为数据0时,怎么处理为1时怎么处理。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|家电维修技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2025-2-22 22:58 , Processed in 0.067330 second(s), 4 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

CopyRight © 电子技术论坛
电子邮箱:8794149@qq.com | 联系 QQ:3081868839 | 官方网址:www.dzdu.com

Qiji. All Rights Reserved


服务条款 | 站长声明

Wuhan Qiji Technology Co., Ltd.武汉奇迹科技有限公司版权所有


鄂ICP备09003585号-2鄂公网安备42010602000420号

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