微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助红外遥控数码管显示程序的问题

求助红外遥控数码管显示程序的问题

时间:10-02 整理:3721RD 点击:
新手求助51达人 红外遥控数码管显示的问题,我用红外遥控控制数码管显示0-9
红外解码的程序没有问题,可以成功解码,数码管显示的程序是从之前的程序贴过来的,原程序也能正常显示,但用遥控器控制点亮时,按了按键却没有反应,求达人指教!


#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//unsigned char code seg_we[]={0x10,0x20,0x40,0x80};          //11111110 11111101 11111011 11110111
uchar irtime,startflag,bitnum,irreceok;                                  //11101111 11011111 10111111 01111111
uchar irdata[33];
uchar irprosok;
uchar display[4];
uchar ircode[8]        ;
/***********************************************************************
函数功能:延时函数,在数码管显示时使用,不需要很精确
************************************************************************/
void delay_50us(uint t)
{
        uchar j;
        for(;t>0;t--)
                for(j=19;j>0;j--);
}

/*****************************************************
函数功能:延时1ms
***************************************************/
void delay1ms()
{
   unsigned char i,j;       
         for(i=0;i<10;i++)
          for(j=0;j<33;j++);                 
}

void delaynms(unsigned int n)         //nms延时函数,用n的数值设定延时的毫秒数
{
        unsigned int i;
        for(i=0;i<n;i++)
        {
                delay1ms();
        }
}

/**************************************************************************
函数的功能:定时器0的初始化
**************************************************************************/
void timer0init()
{
        TMOD=0x02;
        TH0=0x00;
        TL0=0x00;
        ET0=1;       
        TR0=1;       
        EA=1;       
}
/************************************************************************
外部中断0的初始化
***********************************************************************/
void int0init()
{
        IT0=1;         
        EX0=1;       
        EA=1;       
}
/**********************************************************************
定时器0的功能函数,每中断一次irtime++,用于计时
***********************************************************************/
void timer0() interrupt 1
{
        irtime++;       
}
/***********************************************************************
外部中断0的处理函数,每当有低电平数据过来时,中断一次,(使用次中
断的前提是,信号线必需接在外部中断0上面,也就是P3^2口),函数功能
是,把信号从高低电平变成时间的代码放入irdata【】中
************************************************************************/
void int0() interrupt 0                                       
{
        if(startflag)
        {
                if(irtime>40)       
                {                  
                        bitnum=0;
                }
                 irdata[bitnum]=irtime;         
                 irtime=0;                                                 
                 bitnum++;
                 if(bitnum==33)       
                 {
                         bitnum=0;
                        irreceok=1;
                 }
        }
        else       
        {
                startflag=1;
                irtime=0;
                irreceok=1;
        }
}
/*************************************************************************
函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中
**************************************************************************/
void irpros()
{
        uchar k=17,value,j,i;       
        for(j=0;j<2;j++)
        {
                for(i=0;i<8;i++)
                {
                        value=value>>1;  
               
                        if(irdata[k]>6)         
                        {
                                value=value|0x80;
                         }
                         k++;                         
                }         
                ircode[j]=value;
        }
        irprosok=1;
}
/****************************************************************************
函数的功能是:将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示
***************************************************************************/
void irwork()
{
        display[0]=ircode[0]/16;
        display[1]=ircode[0]%16;
        display[2]=ircode[1]/16;
        display[3]=ircode[1]%16;
}
/*************************************************************************
函数功能:数码管显示程序
**************************************************************************/
void dis8(uchar a)
{
        P2&=0x0F;
                                                               
        P0=seg_du[a];                       
        P2|=0x80;
        delaynms(1);
}

/************************************************************************
主函数功能:用解码的按键控制数码管点亮
************************************************************************/

void main()
{
        timer0init();
        int0init();
        irpros();
        irwork();
        while(1)
        {
                uchar i;
                   i=0;
                if (display[4]==0x08)
                {
                        dis8(i++);
                        if(i==0x10) i=0;
                        delaynms(500);
                }                       
        }
}



求高手指教! 等待高人出现!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top