总结:
一,一开始就想做出来,导致出现错误不知道是那个地方。
二,由于一开始方向错误,导致时间用了很久。
三,由于不能调试,不知道怎样检查错误之所在。
四,后面自己有写了子函数一个一个的调。
五,由于一开始我调用了POW函数,不知道为什么这个函数居然占用了大量的空间,导致程序反映很慢
这还不说,由于代码有点长,居然编译不过,找了好久才找出原因,后来只有自己写一个函数了,所以以后
尽量不要乱调用函数,能自己写代码就自己写。哎!!!
最后总结:一,把任务模块化,从最简单的开始。
二,一定要先想好了,才开始敲键盘
三,最事情一定要注意细节,由于输入的最大值超过了65535,而我调用函数的时候却返回了一个int
导致自己始终不知道那个地方出错了,要是一个变量我应该很容易想到溢出,但是函数返回值溢出第一次碰见。本程序完整版的下载地址:http://www.51hei.com/f/suishoujisu.rar
//本单片机红外直接由外部中断1连起来的为红外输入你的工资,再通过税收的公式算出你要交的税//按一下外部中断0,表示输入完成
#includeunsigned a[5],b[5],flag; unsigned char table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; int wei; long temp=0 ; double recond; sbit hwx=P3^3; //定义红外接收脚, char cout; unsigned char l_lhj[66] ; //定义66位数组变量来存储接收的时间参数 void delay (void) //空5个指令 { unsigned char i=13; while(i) i--; } void delay1() { int i=100 ; while(i--); } long power( int i) //10的i次方函数 { long sum=1; unsigned char j; for(j=0;j=2) { for(i=0;i =cout-1) break; P1++; } } void main() { EA=1; EX0=1; EX1=1; IT0=1; IT1=1; while(1) { if(flag==0) show(); else { display(); //显示整数 displayf() ; //显示小数 } } } void zhongduan() interrupt 0 { flag++; intandfloat(); //整数和小数分开 tax();//税收函数 chuli(temp); //处理整数 EX0=0; } void hongwai(void) interrupt 2
//外部中断 1 ,INT1(P3^3)连接红外线接收IC数据脚 { unsigned char i,j,tmp ; unsigned int tmp2; EX1=0; // hwx=1; j=33; i=0; tmp2=0; while(!hwx){ tmp2++; if(tmp2==1000) break; } if(tmp2<1000){ //小于1000个记数的判断为干扰退出接收 EX1=1; return; } //P2=0x76; //数码管输出显示H,作为红外接收的指示 while(j){ tmp=0; l_lhj[i]=1; while(!hwx){ //检测高低电平的变化 l_lhj[i]++; //没变继续加1 delay();
//加入延时,是因为我们采用8位二进来存储,如果不加延时,时间量将计满 tmp++; //此变量为防止干扰带来的死循环 if(tmp==250) break; } i++; tmp=0; l_lhj[i]=1; //时间量从1开始 while(hwx){ //检测高低电平的变化 l_lhj[i]++; //没变继续加1 delay(); //同上 tmp++; if(tmp==250) break; } i++; j--; } i=255; //加入循环延时,处理数据 while(i){ tmp=255; while(tmp){ P2=0XF0; tmp--; } i--; } tmp=0; //这里显示了全部的四段码,包括地址位两段,控制位两段,每段用点分开 for(i=35;i<51;i++,i++) //同上,这里处理控制位前8位 { tmp>>=1; if(l_lhj[i]>30) tmp+=0x80; } b[cout]=tmp%16; cout++; EX1=1; }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』