spy主控程序阶段1.c

来自「此程序主要测试50HZ~3KHZ音频范围幅频特性测试程序.程序包含主控程序和显示」· C语言 代码 · 共 893 行 · 第 1/3 页

C
893
字号
                      
                      send_buf[2]=BL.zancun&0x00ff; //取得低8位
                      send_buf[3]=(BL.zancun&0xff00)>>8; //取得高8位
                      send_sp(send_buf,4); //先发送频率低8位,在发送频率高8位
                      YS=33177;
                      do{__delay_cycles(1);} while(--YS!=0); //延时3ms,以使显示刷新 '' __delay_cycles(1)''延时一个机器周期即:1/11.0592MHZ=0.0904224537us
        
                      send_buf[1]=0x94;  //发送幅值低8位
                      send_buf[2]=BL.u_ratio&0x00ff; //取得低8位
                      send_buf[3]=(BL.u_ratio&0xff00)>>8; //取得高8位
                      send_sp(send_buf,4); //先发送幅值低8位,在发送幅值高8位
         
                      OCR1A=*(++ff); //更新PWM频率修改参数  
                       PORTB_Bit2=!PORTB_Bit2; //灯亮,为了调试用
                       
                       goto loop2;
                        
                 }
                goto loop2;
            }   
          
          
          
          
        key=kbscan();//调用键盘扫描
         
          if(key==0x3d) //频率键按下了么?
           {  PORTB_Bit4=!PORTB_Bit4; //灯亮,为了调试用 
               ++f_sect; //++frequency;
             if(f_sect>3)
               {f_sect=1;}
             if(f_sect==1)  //为50HZ~3KHZ范围   A
                { ff=aa;   //使其指针指向频段aa首地址
                  u_number=0;
                // f_sect=1;// 置扫频频段标志为A频段
                 f_sectmax=229;//把本频段最大值赋给标志变量
                }
             if(f_sect==2)  //为50HZ~2KHZ范围   B
                {ff=bb;   //使其指针指向频段bb首地址
                 u_number=0;
                // f_sect=2;// 置扫频频段标志为B频段
                 f_sectmax=345;//把本频段最大值赋给标志变量
                } 
             if(f_sect==3)  //为50HZ~1KHZ范围    C
                {ff=cc;   //使其指针指向频段cc首地址
                 u_number=0;
                // f_sect=3;  // 置扫频频段标志为C频段
                 f_sectmax=690;//把本频段最大值赋给标志变量
                } 
              
             send_buf[1]=0xc0;  //发送频段号
             send_buf[2]=f_sect;
             
             send_buf[3]=0;
             send_sp(send_buf,4); 
             goto loop2;
           }
          else if(key==0x1f) //幅值调节键按下了么?  
            {      //PORTB_Bit3=!PORTB_Bit3; //灯亮,为了调试用 
                    ++plus_adjust;
                    PORTA_Bit2=0; //切换CD4066开关为内AD采样模式
                    PORTA_Bit3=1;
                    PORTA_Bit4=1;
                     if(plus_adjust>8)
                    {plus_adjust=1;}
                     switch(plus_adjust)//根据按下的次数写相应的幅值标志位
                      {
                          case 1: {plus=5;} break;
                          case 2: {plus=10;} break;
                          case 3: {plus=20;} break;
                          case 4: {plus=50;} break;
                          case 5: {plus=100;} break;
                          case 6: {plus=200;} break;
                          case 7: {plus=350;} break;
                          case 8: {plus=500;} break;
                          default:      break;
                        }
                       PORTA_Bit5=0; //先切换到1/2状台输出
                       for(i=0;i<100;i++) //将增益数字电位器的抽头调至零位
                          { CS2=0;
                            UD=0;
                            INC=1;
                            j=12;
                            do{__delay_cycles(1);} while(--j!=0);
                            INC=0;
                            j=12;
                            do{__delay_cycles(1);} while(--j!=0);
                            INC=1;
                            CS2=1;
                            //  WDR();
                            } 
                       reso_num=0;
                       j=255; 
                       do{__delay_cycles(1);} while(--j!=0); //延时23us,有待信号幅值稳定下来在进行AD测量 
                       AD(); //启动AD转换函数, 
                       Uad1=voltage*2.5; //记录AD值   
                       for(i=0;i<1;i++)  //调节X9C104增大一次        
                       { 
                       X9C104_up();
                       } 
                       j=255;
                       do{__delay_cycles(1);} while(--j!=0); //延时23us,有待信号幅值稳定下来在进行AD测量
                       AD(); //启动AD转换函数,
                       Uad2=voltage*2.5; //记录AD值 
                       Uz=Uad2-Uad1; //求出增量值
                       if(Uad2>plus)  //增大X9C104一次后的电压大于预输出值么?
                        { BL.plus_out=Uad1;
                        
                          send_buf[1]=0x11; 
                          send_buf[2]=BL.plus_out&0x00ff;
                          send_buf[3]=(BL.plus_out&0xff00)>>8;
                          send_sp(send_buf,4); // 先发送为扫频议发出的幅值低8位,在发送为扫频议发出的幅值高8位
                          goto loop2;
                        } 
                        if(Uad2<plus)   //判断增大X9C104一次后的电压小于预输出值么?
                         { //(plus-Uad2)为求出电压差值
                          BL.pp=(plus-Uad2)/Uz; //得出9C104调节级数
                          if(BL.pp>=1)
                            {if(BL.pp<98)
                               { for(i=0;i<BL.pp;i++)  //调节X9C104增大pp次        
                                    {  X9C104_up();  }
                                       j=255;
                                       do{__delay_cycles(1);} while(--j!=0); //延时23us,有待信号幅值稳定下来在进行AD测量
                                       AD(); //启动AD转换函数,
                                       Uad3=voltage*2.5; 
                                       BL.plus_out=Uad3; //输出Uad3
                                       
                                       send_buf[1]=0x11; 
                                       send_buf[2]=BL.plus_out&0x00ff;
                                       send_buf[3]=(BL.plus_out&0xff00)>>8;
                                       send_sp(send_buf,4); // 先发送为扫频议发出的幅值低8位,在发送为扫频议发出的幅值高8位
                                       goto loop2;
                                     
                               }
                              Uz=Uz*2; // 使增量乘2  
                              PORTA_Bit5=1; //切换到全压状态输出
                              BL.pp=(plus-Uad2)/Uz;
                              if(BL.pp>=1)
                                 { for(i=0;i<BL.pp;i++)  //调节X9C104增大pp次        
                                    {  X9C104_up();} 
                                 }
                              else {  X9C104_up();} 
                                 
                               j=255;
                               do{__delay_cycles(1);} while(--j!=0); //延时23us,有待信号幅值稳定下来在进行AD测量
                               AD(); //启动AD转换函数,
                               Uad3=voltage*2.5; 
                               BL.plus_out=Uad3; //输出Uad3
                        
                               send_buf[1]=0x11; 
                               send_buf[2]=BL.plus_out&0x00ff;
                               send_buf[3]=(BL.plus_out&0xff00)>>8;
                               send_sp(send_buf,4); // 先发送为扫频议发出的幅值低8位,在发送为扫频议发出的幅值高8位
              
                               goto loop2;
                             }  
                            BL.plus_out=Uad2; 
                 
                      }
                          
                          BL.plus_out=Uad2;
                        
                          send_buf[1]=0x11; 
                          send_buf[2]=BL.plus_out&0x00ff;
                          send_buf[3]=(BL.plus_out&0xff00)>>8;
                          send_sp(send_buf,4); // 先发送为扫频议发出的幅值低8位,在发送为扫频议发出的幅值高8位  
              
                          goto loop2;
             }  
         else if(key==0x3b) //单次/循环键按下了么?  
         {  
            ++single_cycle;
            if(single_cycle>2)
              { single_cycle=1;}
              
               send_buf[1]=0xc1; // 发送为扫频格式
               send_buf[2]=single_cycle;
               send_buf[3]=0;
               send_sp(send_buf,4); 
             
               goto loop2;
          }
         else if(key==0x3e) //开始/暂停键按下了么?
          { 
           ++start_pause; 
           if(start_pause>2) {start_pause=1;}   
           if(start_pause==1) //是开始功能么?
            { 
              swept_flag=1; //置扫频状态标志位
              PORTA_Bit2=1;  //切换CD4066开关为外AD采样模式
              PORTA_Bit3=0;
              PORTA_Bit4=0;   
             //ff=0; u_number=0; //复位频率和幅值指针,使其还指向本频段的首址
             //diss(start_pause);//显示监视值 
             PORTB_Bit3=!PORTB_Bit3; //灯亮,为了调试用 
             timer1_init();  //启动PWM输出
             //TCCR0=0x05;//启动定时器0
              saopin=1; //置扫频标志位
         
             
             goto loop2;
            }
           }
         else if(key==0x2f) //查询上升键按下了吗?
          {  
             if((*ff)<f_sectmax) //判断当前F值是本频段最大值么?           
              { goto loop2;}
             if((*ff)==f_sectmax) //判断当前F值等于本频段最大值么 此功能为了在查询时能查到本频段的最大值
             {BL.u_value=aa_u[u_number];// 提取幅值点
             
             send_buf[1]=0xa0; 
             BL.zancun=1000000/((*ff)*1.4467592592);
             send_buf[2]=BL.zancun&0x00ff; //发送频率低8位
             send_buf[3]=(BL.zancun&0xff00)>>8;
             send_sp(send_buf,4); 
             YS=5530;
             do{__delay_cycles(1);} while(--YS!=0); //延时0.5ms,以使显示刷新 '' __delay_cycles(1)''延时一个机器周期即:1/11.0592MHZ0.0904224537us
             
             send_buf[1]=0xa2;  
             send_buf[2]=BL.u_value&0x00ff;  //发送幅值比低8位
             send_buf[3]=(BL.u_value&0xff00)>>8;
             send_sp(send_buf,4); 
             
             goto loop2;
             }
              --ff;  //使指针移位
              --u_number;
             // f_value=*ff;  //提取频点
             
             BL.u_value=aa_u[u_number];// 提取幅值点
             
             send_buf[1]=0xa0; //发送频率低8位
             BL.zancun=1000000/((*ff)*1.4467592592);
             send_buf[2]=BL.zancun&0x00ff;
             send_buf[3]=(BL.zancun&0xff00)>>8;
             send_sp(send_buf,4); 
             YS=5530;
             do{__delay_cycles(1);} while(--YS!=0); //延时0.5ms,以使显示刷新 '' __delay_cycles(1)''延时一个机器周期即:1/11.0592MHZ0.0904224537us
             
             send_buf[1]=0xa2;  //发送幅值比低8位
             send_buf[2]=BL.u_value&0x00ff;
             send_buf[3]=(BL.u_value&0xff00)>>8;
             send_sp(send_buf,4); 
             
             goto loop2;
           }  
         else if(key==0x37) //查询下降键按下了吗? 
          {  
             if((*ff)>13823) //判断当前F值是本频段最xiao值么?           
              { goto loop2;}
             if((*ff)==13823) //判断当前F值等于本频段最小值么 此功能为了在查询时能查到本频段的最小值
             {BL.u_value=aa_u[u_number];// 提取幅值点
              
             send_buf[1]=0xa0; //发送频率低8位
             BL.zancun=1000000/((*ff)*1.4467592592);
             send_buf[2]=BL.zancun&0x00ff;
             send_buf[3]=(BL.zancun&0xff00)>>8;
             send_sp(send_buf,4); 
             YS=5530;
             do{__delay_cycles(1);} while(--YS!=0); //延时0.5ms,以使显示刷新 '' __delay_cycles(1)''延时一个机器周期即:1/11.0592MHZ0.0904224537us
             
             send_buf[1]=0xa2;  //发送幅值比低8位
             send_buf[2]=BL.u_value&0x00ff;
             send_buf[3]=(BL.u_value&0xff00)>>8;
             send_sp(send_buf,4);
             
             goto loop2;
             }
              ++ff;  //使指针移位
              ++u_number;
             // f_value=*ff;  //提取频点
             
             BL.u_value=aa_u[u_number];// 提取幅值点
              
             send_buf[1]=0xa0; //发送频率低8位
             BL.zancun=1000000/((*ff)*1.4467592592);
             send_buf[2]=BL.zancun&0x00ff;
             send_buf[3]=(BL.zancun&0xff00)>>8;
             send_sp(send_buf,4); 
             YS=5530;
             do{__delay_cycles(1);} while(--YS!=0); //延时0.5ms,以使显示刷新 '' __delay_cycles(1)''延时一个机器周期即:1/11.0592MHZ0.0904224537us
             
             send_buf[1]=0xa2;  //发送幅值比低8位
             send_buf[2]=BL.u_value&0x00ff;
             send_buf[3]=(BL.u_value&0xff00)>>8;
             send_sp(send_buf,4);
             
             goto loop2;
          }
        else goto loop2;
   }

}



⌨️ 快捷键说明

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