基于单片机的红外税收计算器
时间:08-31
来源:互联网
点击:
总结:
一,一开始就想做出来,导致出现错误不知道是那个地方。
二,由于一开始方向错误,导致时间用了很久。
三,由于不能调试,不知道怎样检查错误之所在。
四,后面自己有写了子函数一个一个的调。
五,由于一开始我调用了POW函数,不知道为什么这个函数居然占用了大量的空间,导致程序反映很慢
这还不说,由于代码有点长,居然编译不过,找了好久才找出原因,后来只有自己写一个函数了,所以以后
尽量不要乱调用函数,能自己写代码就自己写。哎!!!
最后总结:一,把任务模块化,从最简单的开始。
二,一定要先想好了,才开始敲键盘
三,最事情一定要注意细节,由于输入的最大值超过了65535,而我调用函数的时候却返回了一个int
导致自己始终不知道那个地方出错了,要是一个变量我应该很容易想到溢出,但是函数返回值溢出第一次碰见。本程序完整版的下载地址:http://www.51hei.com/f/suishoujisu.rar
//本单片机红外直接由外部中断1连起来的为红外输入你的工资,再通过税收的公式算出你要交的税//按一下外部中断0,表示输入完成
#include reg51.h> unsigned 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;ji;j++)sum=sum*10;return sum;}void display(){int i;P1=0;P2=table[a[wei]];for(i= 1;i=wei;i++){delay1();P2=table[a[wei-i]]; P1++;} }void displayf() //由于只有两位小数,所以就单独显示{int tmp=recond ;P2=P2+0x80;delay1(); P1=wei+1;P2=table[tmp/10] ;delay1(); P1++; P2=table[tmp%10];delay1(); }void intandfloat(){//这个地方要根据你输入数字的位数,如果是4位,i4//如果是五位i5int i; if(cout4);else{if(b[0]>=2){for(i=0;icout ;i++)temp=temp+b[i]*power(cout-1-i); //10的i次方temp=temp-2000; //税收规定:工资-2000}}}void chuli(int temp){int i;for(i=0;;i++){a[i]=temp%10;temp=temp/10; if(temp=0)break;wei++;}}void f(int i) //{ int temp1;//保留变量temp1=temp;temp=temp*0.05*i;//记住整数部分 recond=temp1*5*i; recond=100*(recond-temp*100);//记住小数部分 recond=recond/100; }void tax(){int c ;long b;b=temp;if(b=500)c=1;elseif(b=2000)c=2;elseif(b=5000)c=3;elseif(b=20000)c=4;elseif(b=40000)c=5;elseif(b=60000)c=6;elseif(b=80000)c=7;elseif(b=100000)c=8;switch(c){case 1: f(c); break;case 2: f(c);temp=temp-25;break;case 3: f(c);temp=temp-125;break;case 4: f(c);temp=temp-375;break;case 5: f(c);temp=temp-1375;break;case 6: f(c);temp=temp-3375;break;case 7: f(c);temp=temp-10375;break;case 8: f(c);temp=temp-17375;break; }} void show(){int i;P1=0;for(i=0;icout;i++){P2=table[b[i]];delay1();if(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(tmp21000){ //小于1000个记数的判断为干扰退出接收EX1=1;return;}//P2=0x76; //数码管输出显示H,作为红外接收的指示while(j){ tmp=0;l_lhj[i]=1; while(!hwx){ //检测高低电平的变化l_lhj[i]++; //没变继续加1delay();
//加入延时,是因为我们采用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;i51;i++,i++) //同上,这里处理控制位前8位{ tmp>>=1;if(l_lhj[i]>30)tmp+=0x80;}b[cout]=tmp%16;cout++;EX1=1; }
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)