| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1153 人关注过本帖
标题:红外线键盘键值的程序,高手帮忙
只看楼主 加入收藏
ewinhuang
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-4-27
结帖率:0
收藏
已结贴  问题点数:10 回复次数:4 
红外线键盘键值的程序,高手帮忙
最近再编写一个红外线键盘键值的程序。红外线接收口的数据线接单片机的外部中断0口。红外线键盘发送数据,通过串口发送到上位机显示。
我的问题是,我按了一次按键后,上位机能正常显示我所按得键值。但第二次按就没有反应了,第二次程序也没有进入外部中断程序里了。我检查了好久,都不知道哪里出错了···大侠们,帮帮我看看吧。

#include<reg52.h>
sbit red=P3^2;
//sbit led=P1^0;
//sbit led1=P1^1;

bit b_red_start;
bit ok,b_into;
unsigned int time;
unsigned char n;
unsigned char red_temp[33];    //第0个数是存储引导码的时间,后32个存储各个位的用户码和数据码的时间
unsigned char red_data[4];

void deal_red_data();

void init_into()          //初始化
{
    TMOD=0x21;
    SCON=0x40;
    TH1=0xFD;
    TL1=0xFD;
    TH0=0xfe;    //定时0.5ms
    TL0=0x33;   
    IT0=1;
    ES=1;   
    EX0=1;   
    ET0=1;
    EA=1;
    TR0=1;
    TR1=1;        
}
void main()
{   
    time=0;
    n=0;

    init_into();
    while(1)
    {
        if(ok)
        {
            deal_red_data();
            ok=0;
        }

    }
}

void ix0() interrupt 0 using 2       //红外线的接收头数据线连接到单片机的外部中断0口
{
    if(b_red_start)            //测量用户码和数据码
    {
        red_temp[n]=time ;
        time=0;
        n++;
        if(n==33)
        {
            ok=1;
            n=0;
            b_red_start=0;
            b_into=1;        
        }
    }
     
    else if(time>=20&&time<33)//引导码
    {
        n=0;
        b_red_start=1;
        red_temp[n]=time ;
        time=0;
        n++;
        
    }
    else if(b_red_start==0)
    {        
        time=0;                        
    }
//    led=~led;

}

void deal_red_data()      //32位减至处理,前16位是用户码,后16位是数据码和数据码反码
{
    int i, j,k;
    unsigned char temp;
    temp=0;
    k=1;
    for(i=0;i<4;i++)
    {
        for(j=0;j<8;j++)
        {
            temp>>=1;
            if(red_temp[k]>3)
                temp|=0x80;
            else temp=temp;   
            k++;
        }
        red_data[i]=temp;
        temp=0;
        
    }   
    for(i=0;i<4;i++)             //通过串口发送检测到的键值到上位机观察
    {
        SBUF=red_data[i];
        while(!TI) ;
        TI=0;
    }  
            
}

 
void timer0() interrupt 1    using 1
{
    TH0=0xfe;    //定时0.5ms
    TL0=0x33;
    time++;   
}
     
搜索更多相关主题的帖子: 数据线 单片机 红外线 
2011-04-27 17:40
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:5 
这是C区 不是嵌入式

                                         
===========深入<----------------->浅出============
2011-04-27 19:23
boxinchao
Rank: 4
等 级:业余侠客
帖 子:51
专家分:231
注 册:2011-4-13
收藏
得分:5 
有个疑问,“红外线接收口的数据线接单片机的外部中断0口”?数据线接中断管脚??为什么不是接IO口
2011-04-27 19:26
ewinhuang
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-4-27
收藏
得分:0 
回复 3楼 boxinchao
我买回来的板子已经焊接好
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-04-28 11:05
boxinchao
Rank: 4
等 级:业余侠客
帖 子:51
专家分:231
注 册:2011-4-13
收藏
得分:0 
没玩过这个,随便找了点资料,硬件好像没有问题。
第一次ok第二次进不了中断?需要清中断寄存器吗?
2011-04-28 22:43
快速回复:红外线键盘键值的程序,高手帮忙
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025969 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved