⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 小数compute.c

📁 里面包含了多个C语言模块设计题目
💻 C
字号:
#include <AT89X52.h>
#define uint unsigned int 
static unsigned char data dl,temp,de;


static unsigned char data IRCode[3],IRCON,IRCON2;
bit DT=0;
bit flag,flag_p;      /////////// 0  对应串口  1 遥控

uint num_1=0,k=0,i=0,j,num=0,voicer=1,w,sign,jisuan=0,numi,wp,wn,pp;

uint led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint ledp[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;

void ledwork(void);
void computer(void);

 float sum,tempn,nump,ppnum;

void voice()
{         
      P3_7=0;   
      for(j=0;j<4000;j++);
	  P3_7=1;    			
}



void main(void)
{

	P3_7=1;
	TMOD= 0x11;  //////T1 ,  T0  16位模式   
    TH0 = 0xB8;
    TL0 = 0x00;
    PT1=1;
	IT0=0; 
    EA=1;	
    ET0=1;     /////// T0中断
    EX0=1;    
    DT=0;          ///////标志
	TR0=1;
	flag=0;        /////////////////串口控制
	

    ET1=1;
    TH1=0xf1;          /*设置初始值,每隔4ms一次中断*/
    TL1=0x90;
    TR1=1;
  

    	do
	      {	
           
	       if(DT) 
            {
             for(j=0; j<8000; j++); //这里起到按键值正确后会有一个延时,防止重复按键         
             DT = 0;
            }
	        EX0 = 1;	
		   
		    if(jisuan==1)
		      {computer();jisuan=0;}
			  
			   if(voicer==1)
		       {voice();voicer=0;}
		     	      
		    }

	 	 while(1);
      }


void timer1(void) interrupt 3 using 2
{ TH1=0xf1;          /*设置初始值,每隔4ms一次中断*/
  TL1=0x90;
   i++;
   i=i%w;
  ledwork();
   }





//定时器0定时中断
void Timer0(void) interrupt 1 using 1
{
  if(flag)    //////////遥控控制
  {
     TH0=0xFD;
     TL0=0x1E; //设定时值为800us

	 if(IRCON<3)
     {
       if(IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
       {
         IRCON2++;
         IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
         IRCode[IRCON]=IRCode[IRCON]|P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位
       }
       else
       {
         IRCON++; //填满一个字节,指向下一个变量
         IRCON2=0; //计数清零
       }
    }
    else
    {

      flag=0;           ////////////串口控制
                  /////////////////////////暂时不允许int0中断

    	   
      if((IRCode[1]!=0xFF)&&(IRCode[2]!=0xFF))
     {
        if(IRCode[1]==0x55)
        { 		  
          switch(IRCode[2])
          {
            case 0xAB:               //1-8键控制
			k=1;
            break;
            case 0xAC:
			k=2;
            break;

            case 0xAD: 
			k=3;
            break;

            case 0xB2: 
			k=4;
            break;
            
			case 0xB3: 
			k=5;
            break;
            
			case 0xB4: 
			k=6;
            break;

            case 0xB5: 
			k=7;
            break;
            
			case 0xCA: 
			k=8;
            break;

			case 0xCB:
            k=9;
            break;

			case 0xAA:
            k=0;              //////////////  改变参数显示的类型!  ///实现当前检测根数?
            break;

			case 0x2A:
            k=11;    //////music+++++++++++++++++         // 人工的 触发
            break;
            
			case 0x2B:
    		k=12;    //////music------------------   认为是 Man_or_PC 切换

            break;
            
			case 0x52:
            k=13;    //////对比+++++++
            break;
            
			case 0x53:
            k=14;    //////对比--------
            break;

			case 0x32:
            k=15;    //////色彩+++++++
            break;

			case 0x33:
            k=16;    //////色彩-------
            break;

			case 0x2C:
            k=17;    //////亮度+++++
            break;

			case 0x2D:
            k=18;    //////亮度-------
            break;

            case 0xD2:          //按关闭电源键
            P0 = 0xFF;
            k=10;
            
            break;
              }
		  voicer=1;
          jisuan=1;
		  }
      }   
    }
  }  
}



void Int0(void) interrupt 0 using 0
{
   EX0=0; //外部中断0关闭
   DT=1;

   TR0=0; //先 停止 T0 

   flag=1;     ////////遥控控制

   TH0=0xFD;
   TL0=0x1E; //设定时值为800us

   for(IRCON=0; IRCON<3; IRCON++)
   IRCode[IRCON] = 0;
   IRCON = 0;
   IRCON2 = 0; //计数清零


              
   TR0 = 1;     //再启动///////////记数
}


void computer(void)
     {
       	 
	    if(k<=9&&k>=0)		  
       { 
         if(flag_p==1)
           { pp++;
             ppnum=k;
             for(j=0;j<pp;j++)
                ppnum/=10;
            sum=sum+ppnum;}
			else sum=sum*10+k;
        }
	
         else if(k<15&&k>10)
           { flag_p=0;
             sign=k;
             num_1=sum;
		     sum=0;
            }
        else if(k==16)
		    {sum=0;
			nump=0;
            flag_p=0;}
        else if(k==18)
            flag_p=1;

		else if(k==15)
            { flag_p=0;
          switch(sign)
          { 
          case 11:sum=num_1+sum;break; 
          case 12:sum=num_1-sum;break;
          case 13:sum=num_1*sum;break;
	      case 14:sum=num_1/sum;break;
          }	
         }


	numi=(uint)sum;      /*开始算位 ,这也是看是否需要*/
    nump=sum-numi;
    wn=1;
    for(j=1;j<4;j++)
      {     
	   if(numi>0)
	     {wn=j; numi=numi/10;}
	   else break;
	  }

      for(j=0;j<3;j++)
      {
      if(nump>0)
      {nump=nump*10;      
        wp=j+1;
	    nump=nump-(uint)nump;
	   }	  
	    else break;
	  }   

	 w=wn+wp;
	 if(w>4)
	 {
	  wp=4-wn;
	  w=4;
	  }

      tempn=sum;
      for(j=0;j<wp;j++)     
      tempn=tempn*10;
	  num=(uint)tempn;
	  jisuan=0;

}


void ledwork(void)   /*数码管工作函数*/
{   


  if(i==0)   {led1=1;led2=1; led3=1;led0=0;   P0=led[num%10];}

  else if(i==1&&w>=2) {if(wp==1)  P0=ledp[num/10%10];   else P0=led[num/10%10];  
       led2=1; led3=1; led0=1;led1=0;} 

  else if(i==2&&w>=3) {if(wp==2)  P0=ledp[num/100%10];  else P0=led[num/100%10];  
       led1=1;led3=1;led2=0;}

  else if(i==3&&w>=4) {if(wp==3)  P0=ledp[num/1000%10];	else P0=led[num/1000%10]; 
        led2=1; led1=1; led0=1; led3=0;}
   
 } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -