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

📄 spy主控程序ok.c

📁 此程序主要测试50HZ~3KHZ音频范围幅频特性测试程序.程序包含主控程序和显示程序.
💻 C
📖 第 1 页 / 共 4 页
字号:

#pragma vector=TIMER2_OVF_vect   //定时器0中断函数50us中断一次
__interrupt void timer2(void)
{ 
  TCCR2=0;TIMSK_TOIE2=0; //关中断
  TCNT2=253; //重新赋计数器初值
  yihaomiao++;  //中断次数标志+1
  if(yihaomiao>20) { yihaomiao=1; }
  TCCR2=0x06;//启动定时器2
}

*/


//定时器T0:普通模式;允许中断,用来控制扫频状态时的速度
void ini_t0(void)   //23.6ms中断
{
TCNT0=0;    // T=1/11.0592MHZ=0.0904224537us,采用1024分频(TCCR0=0X05)所以TCNT数值改变一次时间就变化为TT=1024*0.0904224537=92.5925925888us
TCCR0=0;    //23.6ms/0.0925925925888ms=255  256-255=1=TCNT 
TIMSK_TOIE0=1;
}


void init_port(void)  //I/0口初始化
{ DDRC=0xC0;   //=0为输入,=1为输出
  DDRD=0xFC;
  DDRA=0xFC;
  DDRB=0xFF;
  PORTC=0xFF;
  PORTA=0xFC;
  PORTA_Bit2=1;  //切换CD4066开关为内AD采样模式
  PORTA_Bit3=0;
  PORTA_Bit4=0; 
  PORTA_Bit5=0; //切换到全压状态输出
  
  PORTB_Bit4=0;  //为了调试用
  PORTB_Bit3=0;  //为了调试用
  PORTB_Bit2=0;  //为了调试用
  PORTB_Bit1=0;  //为了调试用
  
}



    void main(void)
     {//uchar i;
      //uchar jj;
       init_port();  //I/O口初始化
       usart_init(71);  //异步串口初始化,9600 BAUD RATE
       adc_init();   //A/D转换初始化函数
      
       ini_t0();   //定时器0初始化 5.9ms中断一次 
        __enable_interrupt(); // 启动全局中断
     //  ini_t2();   //定时器0初始化 50us中断一次 
       

    while(1)
{   

 loop2:  if(swept_flag) //判断当前还处于扫频状态么?
         { 
           if(single_cycle==2) //判断当前状态为循环扫频么?
           { 
           // key=0xff;
            key=kbscan();//调用键盘扫描
            
            if(key==0x3e)//是暂停键按下了么?
             {  
                    ++start_pause;  
                    if(start_pause>2) {start_pause=1;}  
                    if(start_pause==2) //是暂停功能键按下么?
                      { start_pause=0;  
                        swept_flag=0; //置为非扫频状态标志
                        TCCR1B=(0<<CS12)|(0<<CS11)|(0<<CS10); //关频率产生PWM定时器1,CS10=0,CS11=0,CS12=0 为无时钟源,所以T/C1停止             
                      //TCCR0=0;  //关闭扫频时间控制定时器0, 
                        saopin=0; //清扫频标志位
                        goto loop2;
                        }
                     else   goto loop3; 
                   }      
               }
            loop3: if(saopin==1)    //扫频状态位置位了么? //否则位单次扫频 
                    { 
                      PORTA_Bit2=0;  //切换CD4066开关为内AD采样模式
                      PORTA_Bit3=1;
                      PORTA_Bit4=1; 
                      YS=65535;  
                      do{__delay_cycles(1);} while(--YS!=0); //延时5ms,有待信号幅值稳定下来在进行AD测量   
                      AD(); //启动AD转换函数,
                      PORTB_Bit1=!PORTB_Bit1; //灯亮,为了调试用
                      Ui=voltage*2.5; //记录扫频议切换到内部发出幅值
                      PORTA_Bit2=1;  //切换CD4066开关为外AD采样模式
                      PORTA_Bit3=0;
                      PORTA_Bit4=0;
                      YS=65535; 
                      do{__delay_cycles(1);} while(--YS!=0); //延时5ms,有待信号幅值稳定下来在进行AD测量  
                      AD(); //启动AD转换函数,
                      Uo=voltage*2.5; //记录扫频议切换到外部发出幅值
                      send_buf[1]=0x92; 
                      BL.zancun=1000000/((*PL)*1.4467592592);
                      send_buf[2]=BL.zancun&0x00ff; //取得低8位
                      send_buf[3]=(BL.zancun&0xff00)>>8; //取得高8位
                      send_sp(send_buf,4); //先发送频率低8位,在发送频率高8位
                      
                      BL.u_ratio=(Uo/Ui)*10;   //求得幅值比  乘十是保留一位小数点
                      aa_u[u_number++]=BL.u_ratio;//记录幅值比
                      YS=65535;
                      do{__delay_cycles(1);} while(--YS!=0); //延时0.9ms,以使显示刷新 '' __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位
         
                      
                      if(*PL==f_sectmax) //判断本频段扫频完了么?
                      { 
                        if(single_cycle==2) //判断当前状态为循环扫频么?
                         {  switch(f_sect)//根据按下的次数写相应的幅值标志位
                              { case 1: { PL=aa;   //使其指针指向频段aa首地址
                                          u_number=0;
                                          f_sectmax=229;//把本频段最大值赋给标志变量
                                         } break;
                                case 2: { PL=bb;   //使其指针指向频段bb首地址
                                          u_number=0;
                                          f_sectmax=345;//把本频段最大值赋给标志变量
                                        } break;
                                case 3: {PL=cc;   //使其指针指向频段cc首地址
                                         u_number=0;
                                         f_sectmax=690;//把本频段最大值赋给标志变量
                                        } break;
                               default:      break;
                              }
                           saopin=1;
                           swept_flag=1;
                           goto loop2;
                         }
                        if (single_cycle==1) //判断当前状态为单次扫频么?
                          { swept_flag=0;//置为非扫频状态标志 
                            start_pause=0;//复位开始键按下标志
                            //f_sect=1;// 置默认扫频频段标志为A频段
                            TCCR1B=(0<<CS12)|(0<<CS11)|(0<<CS10); //关频率产生PWM定时器1,CS10=0,CS11=0,CS12=0 为无时钟源,所以T/C1停止 
                            saopin=0; //清扫频标志位 
  //------------以下SWITCH语句为了使在单次扫完时使频率和幅值指针复位为0,使得在查询时光标从零开始------------------------//               
                             switch(f_sect)//根据按下的次数写相应的幅值标志位
                              { case 1: { PL=aa;   //使其指针指向频段aa首地址
                                          u_number=0;
                                          f_sectmax=229;//把本频段最大值赋给标志变量
                                         } break;
                                case 2: { PL=bb;   //使其指针指向频段bb首地址
                                          u_number=0;
                                          f_sectmax=345;//把本频段最大值赋给标志变量
                                        } break;
                                case 3: {PL=cc;   //使其指针指向频段cc首地址
                                         u_number=0;
                                         f_sectmax=690;//把本频段最大值赋给标志变量
                                        } break;
                               default:      break;
                              }
 //------------------------------------------------------------------------------------//
                            //u_number=99;
                            goto loop2;
                          }   
                       } 
                      PL++; //频率指针加一 
                      OCR1A=*PL; //更新PWM频率修改参数  
                      PORTB_Bit2=!PORTB_Bit2; //灯亮,为了调试用 
                       goto loop2;
                        
                 }
                goto loop2;
            }   
          
          
          
          
        key=kbscan();//调用键盘扫描
    
          if(key==0x3d) //频率键按下了么?
           {  ++f_sect; //++frequency;
             if(f_sect>3)
               {f_sect=1;}
              switch(f_sect)//根据按下的次数写相应的幅值标志位
               {
                case 1: { PL=aa;   //使其指针指向频段aa首地址
                          u_number=0;
                          f_sectmax=229;//把本频段最大值赋给标志变量
                         } break;
                case 2: { PL=bb;   //使其指针指向频段bb首地址
                          u_number=0;
                          f_sectmax=345;//把本频段最大值赋给标志变量
                        } break;
                case 3: {PL=cc;   //使其指针指向频段cc首地址
                         u_number=0;
                         f_sectmax=690;//把本频段最大值赋给标志变量
                         } break;
                default:      break;
               }
             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_Bit4=!PORTB_Bit4; //灯亮,为了调试用 
                    ++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=10;} break;
                          case 2: {plus=20;} break;
                          case 3: {plus=35;} 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=1; //先切换到1/2状台输出
                       reso_num=99;
                       for(i=0;i<100;i++)//使X9C104调到0
                       { X9C104_down(); }
                       reso_num=0;
                       
                       j=255; 
                       do{__delay_cycles(1);} while(--j!=0); //延时23us,有待信号幅值稳定下来在进行AD测量
                       AD(); //启动AD转换函数,
                       diss(voltage);//显示监视值 
                       YS=65535; 
                       do{__delay_cycles(500);} while(--YS!=0); //延时23us,有待信号幅值稳定下来在进行AD测量
                       Uad1=voltage*2.5; //记录AD值   
                        
                       diss(Uad1);//显示监视值
                        
                       for(i=0;i<50;i++)  //调节X9C104增大一次        
                       { 
                          X9C104_up();
                       } 
                       YS=65535;
                       do{__delay_cycles(200);} while(--YS!=0); //延时23us,有待信号幅值稳定下来在进行AD测量
                       AD(); //启动AD转换函数,
                       
                       diss(voltage);//显示监视值  

⌨️ 快捷键说明

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