三楼放代码,暂时不放工程文件,让大家自己折腾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++;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。