分享

教大家自己DIY红外测码器(6位数码管) LCDHOME论坛

 taiji258 2014-07-17
三楼放代码,暂时不放工程文件,让大家自己折腾KEIL,什么?不会KEIL,百度呀,有视频教程,无需精通,只需要把最基本的几个步骤学会即可,打开KEIL,新建工程,选择芯片型号,勾选HEX输出,编译,显示0错误既编译通过,得到HEX文件,烧写就和中九刷机差不多,看图操作一次就会了。
对了,代码好像有点BUG,时间长了,我也忘了是什么BUG了,好像是数码管顺序颠倒了还是日历一次跳两天了,大家自己先试了我在一起分析,就当我埋雷吧。
我看了,我只是在204行少了一个}
但是贴出来的文件被网页屏蔽了3处[ i ],编译就过不起了,具体就在45,46和212行这3处

以下程序是带3个按键和中九遥控反码控制的,要想改遥控,需修改部分参数
#include <AT89X51.H>
unsigned char code dispcode[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0~9
0x88,0x83,0xc6,0xa1,0x86,0x8e, //A~F
0xbf,0xff, //-符号和黑屏
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};   //加了秒点H的0~9
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
                  0xef,0xdf,0xbf,0x7f};
unsigned char dispbuf[8]={16,16,16,16,16,16,16,16}; //
unsigned char dispbitcnt;
unsigned char second=0,minite=0, hour=8,asd=0;
unsigned char years=12,month = 4,date = 17; //年月日
unsigned int tcnt;
unsigned char mstcnt;
unsigned char i,j;
unsigned char irtime,irdata[33],ircode[4]; bit irok;
sbit K1=P1^2;
sbit K2=P1^3;
sbit K3=P1^4;
unsigned int www=0;
unsigned char ff[8];
void int0_init()      
{
IT0=1;  
EX0=1;  
EA=1;
}
//------------------------------------------------------------------------------------
void timer1_init()
{
TH1 = 0x00;//晶振12M 12T 自动重载   256微秒
TL1 =0X00;
ET1=1;               //打开定时器中断
}
//------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------
void ir_process()
{
unsigned char i,j,k=1;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
  ircode<<=1; //
  if(irdata[k]>6) ircode|=0x01; //
  k++;         }
}

}
//------------------------------------------------------------------------------------

void main(void)
{ timer1_init();   //定时器1初始化
int0_init();   //外部中断初始化


TMOD=0x22;   //将定时器1设为2,定时器0设为2 重装模式
TH0=0x06;   // 将H预设为6
TL0=0x06;   //将L预设为6,之后自动重装H,这里为256-6=250微秒
TR0=1;
ET0=1;
EA=1;
while(1)
  {


    if(K3==0)
    {
      for(i=5;i>0;i--)
      for(j=248;j>0;j--);
      if(K3==0)
        {
        second++;
        if(second==60)
          {
            second=0;
          }
        dispbuf[0]=second%10;
        dispbuf[1]=second/10;
        while(K3==0);
        }
    }
    if(K2==0)
    {
      for(i=5;i>0;i--)
      for(j=248;j>0;j--);
      if(K2==0)
        {
        minite++;
        if(minite==60)
          {
            minite=0;
          }
        dispbuf[2]=minite%10;
        dispbuf[3]=minite/10;
        while(K2==0);
        }
    }
    if(K1==0)
    {
      for(i=5;i>0;i--)
      for(j=248;j>0;j--);
      if(K1==0)
        {
        hour++;
        if(hour==24)
          {
            hour=0;
          }
        dispbuf[4]=hour%10;
        dispbuf[5]=hour/10;
        if(dispbuf[5]==0){dispbuf[5]=17;}
        while(K1==0);
        }
    } }
  }

void t0(void) interrupt 1 using 0
{
if(asd==1){www++;}
if(www>=15000) {asd=2;}  
if(asd==2){www++;if(www>=25000){www=0;asd=0;}}
mstcnt++;
if(mstcnt==8)
  {
    mstcnt=0;

    P2=0XFF;P0=0XFF;//
    P0=dispcode[dispbuf[dispbitcnt]]; //
    P2=dispbitcode[dispbitcnt];       //
   


    dispbitcnt++;
    if(dispbitcnt==8)
    {
      dispbitcnt=0;
    }
  }
tcnt++;
if(tcnt==4000) //4000
  {
    tcnt=0;
    second++;
    if(second==60)
    {
      second=0; asd=2;
      minite++;
      if(minite==60)
        {
        minite=0;
        hour++;
        if(hour==24)
          {
            hour=0;
            switch(month)  
{
case 1:case 3:case 5:case 7:
case 8: case 10:case 12:
if(++date>31){date = 1;if(++month>12){month = 1;years++;}}break;
case 2:
if(++date>29){date = 1;if(++month>12){month = 1;years++;}}break;
default:
if(++date>30){date = 1;if(++month>12){month = 1;years++;}}
}
           
          }
    }
  if(asd!=0){
    switch(asd){
case 1:    
    dispbuf[7]=ircode[3]/16; //
    dispbuf[6]=ircode[3]%16;
    dispbuf[5]=ircode[0]/16; //
    dispbuf[4]=ircode[0]%16;
    dispbuf[3]=ircode[1]/16; //
    dispbuf[2]=ircode[1]%16;
    dispbuf[1]=ircode[2]/16; //
    dispbuf[0]=ircode[2]%16;   break;  
case 2:   //显示年月日
    dispbuf[0]=date%10;
    dispbuf[1]=date/10;
    dispbuf[2]=month%10+18;
    dispbuf[3]=month/10;
    dispbuf[4]=years%10+18;
    dispbuf[5]=years/10;
    dispbuf[6]=0;
    dispbuf[7]=2;         break;
default: return; }
  }else{ www=0;   //显示时间
    dispbuf[0]=second%10;
    dispbuf[1]=second/10;
    dispbuf[6]=16;
    dispbuf[2]=minite%10;
    dispbuf[3]=minite/10;
    dispbuf[7]=16;
    dispbuf[4]=hour%10;
    dispbuf[5]=hour/10; //if(dispbuf[5]==0){dispbuf[5]=17;}      
          }
     
  }
}


void int0() interrupt 0   //外部中断0
{
static unsigned char i; //定义静态变量i,由于i需要保持上次进入函数的值
TR1=1;   //打开定时器0计数

if(irtime>30) i=0;
irdata=irtime;  
i++;
  if(i==33)
  {
  ir_process(); //将接收到的32位数据处理,process 处理
  i=0;
  www=0;
  TR1=0;   //关闭定时器0计数
  if(ircode[0]==0x33&&ircode[1]==0xb8&&ircode[2]+ircode[3]==0xff){  
switch(ircode[2]){
    case 0x14:hour++; if(hour==24){hour=0;}   break; //接收机F1键调时
    case 0x94:minite++;if(minite==60){minite=0;}break; //接收机F2键调分
    case 0x54:second++;if(second==60){second=0;}break; //接收机F3键调秒
    case 0x24:asd=2;years++; if(years==30){years=10;} break; //接收机红键调年
    case 0xa4:asd=2;month++; if(month==13){month=1; }   break; //接收机绿键调月
    case 0x64:asd=2;date++; if(date==32) {date=1;}   break; //接收机黄键调日
    default :asd=1;   }
    }else{asd=1;}
  }
}
void TIM1(void) interrupt 3 using 1//定时器1中断
{
//TF2=0;
 
irtime++;      
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多