logo资料库

基于51单片机的红外遥控计算器程序(附电路图.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
/*************************基于 51 单片机的红外遥控计算器程序****************/ /****本程序用基于 TC9012 遥控器可直接操作,电路图,遥控器编码图在最后****/ unsigned long int //红外接口标志 //红外用全局变量 #include #include #include #define uint unsigned int #define uchar unsigned char #define lint sbit IR=P3^2; bit irpro_ok,irok; uchar irtime,X,mir,fir; uchar IRcord[4], irdata[33]; uchar DATA1[8]={0,0,0,0,0,0,0,0}; uchar DATA2[8]={0,0,0,0,0,0,0,0}; uchar RESUIT[8]={0,0,0,0,0,0,0,0}; uchar px1=0,px2=0,px3=0,flag=0,flag1=0,flag2=0,flag3=0,f1=0,f2=0,f3=0,f4=0; //各全局变量 uchar temp,key,fang1,fang2; lint void delay(msx); void Init(); void INTInit(); void Ircordpro(); void keyscan(); void delay(uint); void DataOper(); void DataHandle(); void DisplayHandle(); void display(uchar,uchar); void main() { //输入的数及其结果 //ms 延时函数 //系统初始化 //中断初始化 //红外码值处理函数 //键值检测 //延时 //数据运算 //数据接收 //显示处理 //数码管显示函数 //第一个数 //第二个数 //结果 x1=0,x2=0,y=0; INTInit(); P0=0x00; while(1) { keyscan(); DataHandle(); DisplayHandle(); } } void INTInit() { TMOD=0x02; //定时器 0 工作方式 2,TH0 是重装值,TL0 是初值 TH0=0x00; TL0=0x00; //reload value //initial value
ET0=1; TR0=1; IT0 = 1; EX0 = 1; EA = 1; } void Init() { //开中断 // Configure interrupt 0 for falling edge on /INT0 (P3.2) // Enable EX0 Interrupt //初始化,所有数据归零 uchar i; px1=0;px2=0;px3=0; flag=0;flag1=0;flag2=0;flag3=0; f1=0;f2=0;f3=0;f4=0; x1=0;x2=0;y=0; for(i=0;i<8;i++) {DATA1[i]=0;DATA2[i]=0;RESUIT[i]=0;} } void delay(msx) { uint i,j; for(i=0;i<=msx;i++) for(j=0;j<=110;j++); } void display(uchar n,uchar m) { P0=P0&0x80; P0=P0|(n<<4); P0=P0|m; //msx 为延时毫秒数 //n 是第几只数码管,m 是显示的数字是多少 } void tim0_isr (void) interrupt 1 using 1//定时器 0 中断服务函数 {irtime++;} void ex0_isr (void) interrupt 0 using 0//外部中断 0 服务函数 { if(fir) { //4.5ms+4.5ms if(irtime<49&&irtime>=31)mir=0; irdata[mir]=irtime; irtime=0; mir++; if(mir==33){irok=1;mir=0;fir=0;} } else {irtime=0;fir=1;} }
void Ircordpro(void) { unsigned char i, j, k; unsigned char cord,value; k=1; for(i=0;i<4;i++) { //红外码值处理函数 //处理 4 个字节 for(j=1;j<=8;j++) //处理 1 个字节 8 位 { } cord=irdata[k]; if(cord>7) value=value|0x80; else value=value; if(j<8)value=value>>1; k++; IRcord[i]=value; value=0; } if((IRcord[0]=~IRcord[1])&&(IRcord[2]=~IRcord[3])) {X=IRcord[2];fang2=1;} } void keyscan() { //矩阵键值扫描子函数 if(irok){Ircordpro();irok=0;fang1=1;} if((fang1==1)&&(fang2==1)) { fang1=0;fang2=0; switch(X) { case 0x08: key=0;flag=1;break; case 0x01: key=1;flag=1;break; case 0x02: key=2;flag=1;break; case 0x03: key=3;flag=1;break; case 0x05: key=4;flag=1;break; case 0x06: key=5;flag=1;break; case 0x07: key=6;flag=1;break; case 0x09: key=7;flag=1;break; case 0x0A: key=8; flag=1;break; case 0x0B: key=9; flag=1;break; case 0x10: key=10;flag1=1;display(7,0);break; case 0x1A: key=11;flag1=1;display(7,0);break; case 0x16: key=12;flag2=1;Init();break; case 0x11: key=13;flag2=1;DataOper();break;
case 0x15: key=14;flag1=1;display(7,0);break; case 0x19: key=15;flag1=1;display(7,0);break; } } } void DataOper() { uchar i,j,m=0; lint k=0; for(i=0;i<(px1-1);i++) { k=DATA1[i]; for(j=0;j<(px1-i-1);j++) { k=k*10; } x1=x1+k; } x1=x1+DATA1[px1-1]; for(i=0;i<(px2-1);i++) { k=DATA2[i]; for(j=0;j<(px2-i-1);j++) { k=k*10; } x2=x2+k; //把第一个数组中的数处理成十进制数 //把第二个数组中的数处理成十进制数 //根据标志位进行运算 //把各位分离出来存入结果数组中 y=x1+x2; } x2=x2+DATA2[px2-1]; if(f1==1) else if(f2==1) y=x1-x2; else if(f3==1) y=x1*x2; else if(f4==1) y=x1/x2; RESUIT[0]=y/10000000; RESUIT[1]=(y%10000000)/1000000; RESUIT[2]=(y%1000000)/100000; RESUIT[3]=(y%100000)/10000; RESUIT[4]=(y%10000)/1000; RESUIT[5]=(y%1000)/100; RESUIT[6]=(y%100)/10; RESUIT[7]=y%10; while(!RESUIT[m]) m++; px3=m; }
void DataHandle() { //把每次按键的结果记录下来,并存到适当的位置 if((key<10)&&(flag==1)&&(flag1==0)) { DATA1[px1]=key; px1++; flag=0; } else if((key<10)&&(flag==1)&&(flag1==1)) { DATA2[px2]=key; px2++; flag=0; } else if(flag1==1) { switch(key) { case 10 : f1=1;f2=0;f3=0;f4=0;break; case 11 : f1=0;f2=1;f3=0;f4=0;break; case 14 : f1=0;f2=0;f3=1;f4=0;break; case 15 : f1=0;f2=0;f3=0;f4=1;break; // "+" // "-" // "*" // "/" } } } void DisplayHandle() { //将数据显示在数码管上 uchar i,x; if((flag1==0)&&(flag2==0)) { x=px1; if(px1==0) display(7,0); else { for(i=0;i
x=px2; if(px2==0) display(7,0); else { for(i=0;i=px3;i--) { display(i,RESUIT[i]); delay(3); } } }
分享到:
收藏