三楼放代码,暂时不放工程文件,让大家自己折腾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++; } |
|