×
嵌入式 > 技术百科 > 详情

基于单片机的红外税收计算器

发布时间:2020-06-13 发布时间:
|

总结:
一,一开始就想做出来,导致出现错误不知道是那个地方。

二,由于一开始方向错误,导致时间用了很久。

三,由于不能调试,不知道怎样检查错误之所在。

四,后面自己有写了子函数一个一个的调。

五,由于一开始我调用了POW函数,不知道为什么这个函数居然占用了大量的空间,导致程序反映很慢

这还不说,由于代码有点长,居然编译不过,找了好久才找出原因,后来只有自己写一个函数了,所以以后

尽量不要乱调用函数,能自己写代码就自己写。哎!!!


最后总结:一,把任务模块化,从最简单的开始。

                二,一定要先想好了,才开始敲键盘

              三,最事情一定要注意细节,由于输入的最大值超过了65535,而我调用函数的时候却返回了一个int

导致自己始终不知道那个地方出错了,要是一个变量我应该很容易想到溢出,但是函数返回值溢出第一次碰见。本程序完整版的下载地址:http://www.51hei.com/f/suishoujisu.rar 

//本单片机红外直接由外部中断1连起来的为红外输入你的工资,再通过税收的公式算出你要交的税//按一下外部中断0,表示输入完成
 

#include   
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;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;   
} 
 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实时控制.安全.如何加速实现未来工厂落地?