打印
[51单片机]

用51单片机做遥控器出现的问题

[复制链接]
1604|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
因为我的51实验板上自带38K调制模块(下图有此模块的原理图),我认为将控制脚拉高就可以自动发射38K载波,将控制脚拉底就会持续发射底电平。以下代码是我根据网上流行的一个电视遥控器改的。请帮忙看下哪里出了问题?
SW1和SW2对应的两个码值分别为00FF06F9和00FF0DF2,是我手上一个红外遥控器的开机、关机码值,但是一直没能成功。是不是这个38K调制模块使用方式不正确,还是代码哪里有问题?


#include <reg52.h>
#include <intrins.h>

sbit InfraredSend = P1^4;        //红外发射引脚
sbit SW1 = P3^0;        //独立按键定义
sbit SW2 = P3^1;

unsigned char KeyCode[23][4] ={{0x00,0xff,0x06,~0x06},{0x00,0xff,0x0d,~0x0d},{0x00,0xff,0x18,~0x18},{0x00,0xff,0x1a,~0x1a},{0x00,0xff,0x1b,~0x1b},        //Mute Code, Power Code, 1 Code, 2 Code, 3 Code
                                                             {0x00,0xff,0x14,~0x14},{0x00,0xff,0x16,~0x16},{0x00,0xff,0x17,~0x17},{0x00,0xff,0x10,~0x10},{0x00,0xff,0x12,~0x12},        //4 Code, 5 Code, 6 Code, 7 Code, 8 Code
                                                       {0x00,0xff,0x13,~0x13},{0x00,0xff,0x08,~0x08},{0x00,0xff,0x0c,~0x0c},{0x00,0xff,0x0f,~0x0f},{0x00,0xff,0x0a,~0x0a},        //9 Code, -/-- Code, 0 Code, Cycle Code, Video Code
                                                       {0x00,0xff,0xf1,~0xf1},{0x00,0xff,0x02,~0x02},{0x00,0xff,0x04,~0x04},{0x00,0xff,0x00,~0x00},{0x00,0xff,0x07,~0x07},        //Hode Code, Channel+ Code, Volume- Code, Menu Code, Volume+ Code
                                                       {0x00,0xff,0x06,~0x06},{0x00,0xff,0xfc,~0xfc},{0x00,0xff,0x0b,~0x0b}};                                                                                                //Channel- Code, Enter Code, Display Code


void Delay100US(unsigned char x);        //参数为1时延时100us
void Delay10US(unsigned char x);        //参数为1时延时10us

void main(void)
{
        unsigned char i,Bit,Byte,KeyCodeSend;
        while(1)
        {
                SW1 = 1;
                SW2 = 1;
                if(SW1 == 0)        //1键按下,发射一组数据,四个字节
                {
                        InfraredSend = 1;//发射引导码9ms
                        Delay100US(90);
                        InfraredSend = 0;
                        Delay100US(45);                //4.5ms.引导码
                        for(Byte = 0;Byte < 4;Byte++)        //开始发射四个字节内容
                        {
                                KeyCodeSend = KeyCode[0][Byte];
                                for(Bit = 0;Bit < 8;Bit++)
                                {
                                        InfraredSend = 1;//发射0.56ms
                                        Delay10US(56);
                                        // CarrierWave38K(21);                //发射0.56ms
                                        if(KeyCodeSend & 0x01)        //由数据来判断高1.69ms还是0.56ms
                                                Delay10US(169);
                                        else
                                                Delay10US(56);
                                        KeyCodeSend >>= 1;
                                }        
                        }
                        InfraredSend = 1;//发射0.56ms
                        Delay10US(56);
                        for(i = 0;i < 10;i++)
                                Delay100US(180);        //结束正常控制在189ms
                }

                if(SW2 == 0)        //2键按下,发射一组数据,四个字节
                {
                        InfraredSend = 1;//发射引导码9ms
                        Delay100US(90);
                        InfraredSend = 0;
                        Delay100US(45);                //4.5ms.引导码
                        for(Byte = 0;Byte < 4;Byte++)        //开始发射四个字节内容
                        {
                                KeyCodeSend = KeyCode[1][Byte];
                                for(Bit = 0;Bit < 8;Bit++)
                                {
                                        InfraredSend = 1;//发射0.56ms
                                        Delay10US(56);
                                        // CarrierWave38K(21);                //发射0.56ms
                                        if(KeyCodeSend & 0x01)        //由数据来判断高1.69ms还是0.56ms
                                                Delay10US(169);
                                        else
                                                Delay10US(56);
                                        KeyCodeSend >>= 1;
                                }        
                        }
                        InfraredSend = 1;//发射0.56ms
                        Delay10US(56);
                        for(i = 0;i < 10;i++)
                                Delay100US(180);        //结束正常控制在189ms
                }
               
/* 参考为1时延时100us */
void Delay100US(unsigned char X100us)
{
        unsigned char i;
        while(X100us--)
        {
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                i = 12;
                while(i--);        
        }
}

/* 参数为1时延时10us */
void Delay10US(unsigned char X10us)
{
        while(X10us--)
        {
                _nop_();
                _nop_();               
        }
}



QQ截图20150621131326.jpg (133.51 KB )

QQ截图20150621131326.jpg

相关帖子

沙发
wuxiaohuaer|  楼主 | 2015-6-21 22:28 | 只看该作者
帖子沉的好快,自己顶一下

使用特权

评论回复
板凳
nbsmaps| | 2015-6-22 07:42 | 只看该作者
示波器一看就知道了哪里问题,为什么要从原理去分析呢?费时费力

使用特权

评论回复
地板
gx_huang| | 2015-6-22 10:27 | 只看该作者
看程序就很累,虽然比较规整了。
发射输出程序,2个按键,2段代码,应该封装成一个函数呀,否则,100个按键,就100段代码了。
你这个发射程序,是低位先发射,检查一下是否方向错了。
我的习惯是,字节排列、比特排列,和纸上的一样。
另外,感觉你的发射脚控制可能有问题,发射程序结束后,应该不会发射。
你要确认一下1是发射还是0是发射。你的程序似乎是1是发射载波,又为何程序结束了,还一直发射?

使用特权

评论回复
5
wuxiaohuaer|  楼主 | 2015-6-22 22:12 | 只看该作者
nbsmaps 发表于 2015-6-22 07:42
示波器一看就知道了哪里问题,为什么要从原理去分析呢?费时费力

家里学习的,没有示波器,要不然马上就可以先看一下发射出的波形了

使用特权

评论回复
6
wuxiaohuaer|  楼主 | 2015-6-23 21:27 | 只看该作者
gx_huang 发表于 2015-6-22 10:27
看程序就很累,虽然比较规整了。
发射输出程序,2个按键,2段代码,应该封装成一个函数呀,否则,100个按键 ...

多谢提点,下面这句话提醒我了--“你要确认一下1是发射还是0是发射。你的程序似乎是1是发射载波,又为何程序结束了,还一直发射?”。
后来我看了下,确实是发射数据的0码前,没有把载波关掉。晚点放上调整后代码。
封装发射输出函数也是非常好的建议,后面码值多了可以考虑,多谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

11

帖子

1

粉丝