数码之家

 找回密码
 立即注册
搜索

恭喜您,帖子穿越成功!

您是第4591643位成功穿越者

查看: 5238|回复: 17

[C51] 关于遥控发射程序移植到STC15F104W的问题

[复制链接]
发表于 2021-5-14 15:12:59 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近我在学习有关遥控发射的程序,从网上搜集了一个例程,测试了一下在AT89S52和STC89C52RC上都可以正常运行,手上还有STC15F104W的芯片,就想用到这个芯片上面,改写了程序里的红外发射管端口和按键端口后编译烧写这个发射程序发现在STC15F104W无法正常工作啊,谁能说一下咋样改才可以用?测试了原程序可以正常使用,红外发射管也可以指定另外端口。需要就是简单的1到4按键按下发射对应的键码就可以,对C不太懂,只会看简单的程序,正在学习中。undefined哪位大侠帮忙改一下,或者帮我指点一下,先谢谢各位了。
下面这个是搜集的原程序:晶振12M
#include <reg52.h>
sbit  IR  = P1^0;      //发射引脚(接PNP三极管基极)
sbit IRLED = P1^0;
sbit key=P3^2;
#define  USER_H   0X00             //用户码识别码
#define  USER_L   0Xff             //用户码识别码反码

#define m9    (65536-9000)        //9mS
#define m4_5  (65536-4500)        //4.5mS
#define m1_6  (65536-1650)        //1.65mS
#define m_56  (65536-560)        //0.56mS
#define m40   (65536-40000)       //40mS
#define m56   (65536-56000)       //56mS
#define m2_25 (65536-2250)        //2.25mS

void  ZZ(unsigned char x);      //NEC编码发送程序
void  Z0(unsigned char temp);     //单帧(8位数据)发送程序
void  TT0(bit BT,unsigned int x);    //38KHz载波发射 + 延时程序
void delay5ms(void)   //误差 0us
{
    unsigned char a,b;
    for(b=19;b>0;b--)
        for(a=130;a>0;a--);
}

void main(void)
{
  TMOD = 0x01;         //T0 16位工作方式
  IR=1;       //发射端口常态为高电平
  while(1)
  {   
        if(key==0)
        {
            delay5ms();
                if(key==0)
                {
                      ZZ(0x0ce);
                        while(!key);
                }            
        }

  }
}

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:NEC编码发送程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void ZZ(unsigned char Value)
{  
  TT0(1,m9);         //高电平9mS
  TT0(0,m4_5);            //低电平4.5mS
  /*┈ 发送4帧数据┈*/
  Z0(USER_H );         //用户码高8位         

  Z0(USER_L );      //用户码低8位
  Z0(Value);      //操作码
  Z0(~Value);      //操作码反码
  /*┈┈ 结束码 ┈┈*/
  TT0(1,m_56);
  TT0(0,m40);
  /*┈┈ 重复码 ┈┈*/
// while(KEY() != 0)
  // {
  //      TT0(1,m9);
  //      TT0(0,m2_25);
  //      TT0(1,m_56);
  //      TT0(0,m40);
// TT0(0,m56);      
  //  }     
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:单帧(8位数据)发送程序
入口:temp
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Z0(unsigned char temp)
{
  unsigned char v;
  for (v=0;v<8;v++)                     //循环8次移位
  {     
      TT0(1,m_56);          //高电平0.65mS         
    if(temp&0x01)
        TT0(0,m1_6); //发送最低位
    else         
        TT0(0,m_56);     
    temp >>= 1;                //右移一位
  }   
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:38KHz载波发射 + 延时程序
入口:(是否发射载波,延时约 x (uS))
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void TT0(bit BT,unsigned int x)
{
  TH0 = x>>8;             //输入T0初始值
  TL0 = x;
  TF0=0;           //清0
  TR0=1;           //启动定时器0
  if(BT == 0) while(!TF0); //BT=0时,不发射38KHz载波只延时;BT=1发射38KHz脉冲且延时;
  else while(1)       //38KHz载波
       {
    IR = 0;
          if(TF0)break;
                 if(TF0)break;

         //IR=0和IR=1的延时语句比例决定了调制波占空比,占空比越小越省电,发射功率越小
    IR = 1;
          if(TF0)break;
                 if(TF0)break;
          if(TF0)break;
                 if(TF0)break;
          if(TF0)break;
                 if(TF0)break;
          if(TF0)break;
                 if(TF0)break;
          if(TF0)break;
                 if(TF0)break;


  }
  TR0=0;           //关闭定时器0
  TF0=0;           //标志位溢出则清0
  IR =1;           //载波停止后,发射端口常态为高
}


发表于 2021-5-14 16:21:29 | 显示全部楼层
增加一句 AUXR &= 0x7F; 试试看,把模式改为12T。

打赏

参与人数 1家元 +10 收起 理由
家睦 + 10

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-5-14 16:54:00 | 显示全部楼层
之前做的是固定时钟,然后计数的

1、先调校时钟
2、调校几种需要时长

排除程序,最好还是用逻辑仪看看输出的信号是否正确。

打赏

参与人数 1家元 +10 收起 理由
家睦 + 10

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-5-14 17:07:02 | 显示全部楼层
没有定时器1,只有定时器2
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-14 18:43:59 | 显示全部楼层
flishmen 发表于 2021-5-14 16:21
增加一句 AUXR &= 0x7F; 试试看,把模式改为12T。

谢谢回复,我有改过也不行,实际我红外发射管接的是STC15F104W的P3.5,那个是TOclko输出脚,按键接的是P3.2。定时器模式改1T和12T都一样。在实际工程里我有加的是STC15F.H的头文件,可以编译通过,但无法正常工作。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-14 18:48:30 | 显示全部楼层
rush 发表于 2021-5-14 17:07
没有定时器1,只有定时器2

STC15F104W有T0和T2定时器的,没有T1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-14 18:54:54 | 显示全部楼层
本帖最后由 xjlfh 于 2021-5-14 18:59 编辑
rush 发表于 2021-5-14 17:07
没有定时器1,只有定时器2

这是STC15F104W的脚位图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2021-5-15 13:40:38 | 显示全部楼层
STC15F104W没有P1口哦,程序二三行要重新定义哈,还有定时器频率最好改低点,STC15F104W这个单片机自身的时钟一般在4M左右,楼主原程序里时钟是12M,重新调整好定时器初始值,下载程序时改好相应的频率,水平有限只看出来这点问题希望能帮到楼主。
回复 支持 反对

使用道具 举报

发表于 2021-5-15 17:08:09 | 显示全部楼层
1时钟  2脚位
回复 支持 反对

使用道具 举报

发表于 2021-5-15 19:01:13 | 显示全部楼层
有一个红外的帖子是用STC15W单片机的,有兴趣可以看看。
基于STC15W单片机的电视机与有线机顶盒联动控制器【红外接收&红外发射】
https://www.mydigit.cn/forum.php?mod=viewthread&tid=102751
(出处: 数码之家)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-16 11:30:00 来自手机浏览器 | 显示全部楼层
独孤九剑1234 发表于 2021-5-15 13:40
STC15F104W没有P1口哦,程序二三行要重新定义哈,还有定时器频率最好改低点,STC15F104W这个单片机自身的时 ...

谢谢回复,这个我知道,STC15F104W我在实际应用中工程文件不是按上面程序里的接的,实际工程里红外发射管接的是P3.5,按键接的是P3.2,这个程序里为了定时器设置方便采用的是12M时钟,实际烧写我也选用的12M,我也仿制成功了坛里坛友用STC15F104W做的4路学习型遥控,那个发射的键码是接收到学习到的键码解码后直接存到内部EEROM里的,发射时直接调取的,我想要的是可以直接烧写死的例如按下一个键直接发射对应键码的那种。刚开始学C,不知道咋改才可以。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-16 11:34:23 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2021-5-15 19:01
有一个红外的帖子是用STC15W单片机的,有兴趣可以看看。
基于STC15W单片机的电视机与有线机顶盒联动控制器 ...

谢谢回复,这个有看过,目前水平有限看的不是太懂,正在摸索实验中。那个用的是STC15W408,不知和STC15F104 w通用不。目前我是每次烧写完后按发射然后用另一个自制的遥控解码器看能不能解码出来确认程序正常没有。
回复 支持 反对

使用道具 举报

发表于 2021-5-16 19:36:52 | 显示全部楼层
xjlfh 发表于 2021-5-16 11:34
谢谢回复,这个有看过,目前水平有限看的不是太懂,正在摸索实验中。那个用的是STC15W408,不知和STC15F1 ...

一般而言STC15系单片机之间移植代码没啥障碍,我的代码中兼容了广电机顶盒遥控器和乐视电视遥控器,但38khz载波都是一样的,就是那个void T2_START(uint T_MS)函数,而红外输出函数void out_IR(bit e,uint key)中起始的判断就是区分两种遥控器的,你用的话只要删除这个if---else判断直接根据你的用户码赋值DIL、DIH两个变量,再把函数名改成void out_IR(uint key)就可以直接调用发送数据了,另外我的代码模拟的是ENC红外遥控协议的,玩这个必要弄一个逻辑分析仪(淘宝十几元那种即可)会少走弯路的。
回复 支持 反对

使用道具 举报

发表于 2021-5-16 19:50:43 | 显示全部楼层
慕名而来 发表于 2021-5-16 19:36
一般而言STC15系单片机之间移植代码没啥障碍,我的代码中兼容了广电机顶盒遥控器和乐视电视遥控器,但38k ...

你的代码主函数中的  ZZ(0x0ce);这句是发送键值或命令码吧,如果是的话,按照协议键值码应该是8位数据,而你的函数中定义的数据Value也是8位的,但0x0ce应该是16位数据。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-17 10:31:09 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2021-5-16 19:50
你的代码主函数中的  ZZ(0x0ce);这句是发送键值或命令码吧,如果是的话,按照协议键值码应该是8位数据,而 ...

是的,括号里的就是要发送的键码,我试过把它替换成别的遥控器已解码出来的键值编译后也可以直接发送的。
回复 支持 反对

使用道具 举报

发表于 2021-5-17 19:42:24 | 显示全部楼层
xjlfh 发表于 2021-5-17 10:31
是的,括号里的就是要发送的键码,我试过把它替换成别的遥控器已解码出来的键值编译后也可以直接发送的。 ...

如果你的问题仍然没有解决的话,建议你再仔细研究一下例程吧,玩单片机可以不会编程、可以完整的应用移植例程但必须要读懂例程,如果不懂例程而应用,那么在你的工程中例程就是固件了,有了问题就很难解决了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-26 10:24:55 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2021-5-17 19:42
如果你的问题仍然没有解决的话,建议你再仔细研究一下例程吧,玩单片机可以不会编程、可以完整的应用移植 ...

谢谢了,最近比较忙没顾上上线,这个程序移植到15F104不成功我知道是定时器设置和载波输出部分程序有问题,正在摸索中,下载了有关F100系列的定时器的说明部分,抽空再试试。同时我也在网上找到了另一个类似的程序,经改动已可以正常使用了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-26 10:30:50 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2021-5-16 19:36
一般而言STC15系单片机之间移植代码没啥障碍,我的代码中兼容了广电机顶盒遥控器和乐视电视遥控器,但38k ...

已打算买一个逻辑分析仪了,觉得买一个要方便一些,这样可以看出设置的和实际输出之间的差距有多少,也变于调整和学习。原来对汇编懂一些,C很少接触,现在也是在学习中,有的语句看了也是半懂之中,像按键之类的用汇编可能很容易搞定但看C的就只有大眼瞪小眼的从头开始学了。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-6-5 21:19 , Processed in 0.156000 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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