| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4075 人关注过本帖
标题:向各位师兄们讨教个 红外实验 的问题
只看楼主 加入收藏
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
结帖率:62.07%
收藏
 问题点数:0 回复次数:1 
向各位师兄们讨教个 红外实验 的问题
// 主函数读出 码值,给P2口,驱动连接P2口的LED流水灯,看效果
//**********************************************************************
#include <reg51.h>
extern unsigned char datanum[4];
sbit red_line=P3^2;
void init_int0()             //中断初始化,下降沿触发方式
{
        EA=1;
        EX0=1;
        IT0=1;
}
void delay1(unsigned int i)
{
   unsigned char j;
   for(i;i>0;i--)
            for(j=100;j>0;j--);
}
void main()
{
        led_line=1;
        init_int0();
        while(1){
        P2=datanum[2];
        delay1(1000);
        }
}

//*******************************************************
中断部分
1.辨别是开始吗还是结束吗
有按键按下时,P3。2由高到低,触发中断,进入中断程序。第一步 关闭中断后,区分是引导吗还是结束吗,原理是,等待p3.2 口的电平为高,隔2.25ms后去检测P3.2的电平,如果是高电平,则是开始吗,进入码值读取部分,读取完32个位后,等待9MS后,此时的P3.2为高电平 开中断,历程结束。
如果是低电平,则是结束吗,跳过码值读取部分,等待9MS后,开中断,历程结束。
2.码值读取
   由于引导吗读取后,P3.2电平为低的时候,才进入读取吗部分。所以,这个时候只需等待P3.2再次为高电平,等待0.84 ms后 读取P3.2的电平,为低则表示码值为0,为高表示码值为1,辨别完后,由
  于不知道是读了1或者读了0,一律等待P3.2的电平为低电平后再次读取下一个位
//**************************************************************
#include <reg51.h>
sbit red_line=P3^2;
unsigned char i,j;
unsigned char datanum[4]={0,0,0,0};


void close_int0()
{
        EX0=0;
}

void init_xlat0(unsigned char high,unsigned char low)    //时钟初始化的历程
{
        TMOD=9;
        TH0=high;
        TL0=low;
        TF0=0;
        TR0=1;
}


unsigned char guide_wipe()                //引导吗和结束吗的分辨
{
        while(1){
          if(red_line==1){
                           init_xlat0(0xf7,0x35);
                                while(1){
                                        if(TF0==1){
                                                if(red_line==1)
                                                        return(1);
                                                 else
                                                   return(0);
                                        }
                           }
                }
         }
}

unsigned char dist_one_zero()     //1和0的分辨
{
          init_xlat0(0xfd,0xc7);
                while(1){
                        if(TF0==1){
                                if(red_line==1)
                                return(0x80);
                                else
                                return(0);        
                  }
                }
}
void delay(unsigned char a,unsigned char b)   //延时历程
{
        init_xlat0(a,b);
    while(1){
                if(TF0==1)
                        break;
        }
}

void read_datenum_bit(unsigned char c)     //字节读取历程
{
        while(1){
                if(red_line==1){
                                        datanum[c]>>=1;
                                        datanum[c]|=dist_one_zero();
                                        break;
                }
  }
   while(1){
                   if(red_line==0)
                          break;        
        }
}
               

void into_in(void) interrupt 0    //中断历程
{
   close_int0();
        if(guide_wipe()==1){
                while(1){
                   if(red_line==0)
                          break;        
                }
           for(i=0;i<4;i++)
                        for(j=0;j<8;j++){        
                                  read_datenum_bit(i);        
                         }
        }
        delay(0xdc,0xd7);
        EX0=1;
}
        

问题:  程序运行不正常,起先P2口灯全亮后, 无论怎么按键,就是木有变化
         求逻辑上的改错,,,,求 各位师兄指点迷津,跪求。
搜索更多相关主题的帖子: void include 
2013-03-04 16:32
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
三哥:太长了,没耐心仔细看。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2013-03-08 22:36
快速回复:向各位师兄们讨教个 红外实验 的问题
数据加载中...
 
   



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

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