找回密码
 立即注册

QQ登录

只需一步,快速开始

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

一个红外实验课程的问题,求指点迷津

[复制链接]
跳转到指定楼层
楼主
ID:48374 发表于 2013-3-4 16:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
// 主函数读出 码值,给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口灯全亮后, 无论怎么按键,就是木有变化
         求逻辑上的改错,,,,求 各位师兄指点迷津,跪求。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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