找回密码
 立即注册

QQ登录

只需一步,快速开始

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

有关红外遥控的程序

[复制链接]
跳转到指定楼层
楼主
ID:108715 发表于 2016-12-11 18:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 啦啦啦1234 于 2016-12-11 18:22 编辑

遥控器按C键控制led1和2亮,P3.3中断,程序不能控制灯,求教高手程序哪里写错了?应该怎么改正?

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

#define Imax 14000    //此处为晶振为11.0592时的取值,
#define Imin 8000    //如用其它频率的晶振时,
#define Inum1 145    //要改变相应的取值。
#define Inum2 700
#define Inum3 3000

sbit led1=P0^0;
sbit led2=P0^1;

uchar Mode=0;
unsigned char Im[4]={0x00,0x00,0x00,0x00};//解码变量
//全局变量
uchar f;
unsigned char m,Tc;
unsigned char IrOK;

void yk()
{
        if(IrOK==1)
        {
                if(Im[2]==0x0d)        //遥控设置键-C键
                {
                        Mode++;
                        if(Mode==3)
                        {
                                Mode=1;
                        }
                        switch(Mode)
                        {
                                case 1:
                                {
                                        led1=0;
                                }
                                case 2:
                                {
                                        led2=0;
                                }

                        }                                 
                }
        }
}

void main()
{
        led1=led2=1;
        while(1)
        {
                yk();
        }
}
//外部中断解码程序_外部中断0
void intersvr1(void) interrupt 2 using 1
{
        TR0=1;
        Tc=TH0*256+TL0;//提取中断时间间隔时长
        TH0=0;
        TL0=0;         //定时中断重新置零

        if((Tc>Imin)&&(Tc<Imax))
        {
                m=0;
                f=1;
                return;
         }       //找到启始码
        if(f==1)
        {
                if(Tc>Inum1&&Tc<Inum3)
                {
                        Im[m/8]=Im[m/8]>>1|0x80; m++;
                }
                if(Tc>Inum2&&Tc<Inum1)
                {
                        Im[m/8]=Im[m/8]>>1; m++; //取码
                }
                if(m==32)
                {
                        m=0;  
                        f=0;
                        if(Im[2]==~Im[3])
                        {
                                IrOK=1;
                                TR0=0;
                        }
                        else IrOK=0;   //取码完成后判断读码是否正确
                }
               //准备读下一码
        }
}

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

使用道具 举报

沙发
ID:153987 发表于 2016-12-11 21:17 | 只看该作者
main函数的while循环里面只有设置led1=0和led2=0,没有设置led1=1和led2=1
回复

使用道具 举报

板凳
ID:108715 发表于 2016-12-11 21:46 来自手机 | 只看该作者
ledaswan 发表于 2016-12-11 21:17
main函数的while循环里面只有设置led1=0和led2=0,没有设置led1=1和led2=1

问题是红外接收完全没反应啊,led1和2都不亮,最起码按键按下要亮了才行啊,我只要他们亮,另外不亮的话在加一个按键专门关闭用就肿了,现在一个都不亮。
回复

使用道具 举报

地板
ID:153987 发表于 2016-12-11 21:51 | 只看该作者
main函数中没有初始化中断,所以你的中断程序是执行不了的
回复

使用道具 举报

5#
ID:70330 发表于 2016-12-12 10:14 | 只看该作者
没有中断初始化程序,另外TR0=1;放的位置不对,应在中断初始化或main()里控制,综上所述,中断没初始化,所以没反应
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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