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

📄 spy主控程序ok.c

📁 此程序主要测试50HZ~3KHZ音频范围幅频特性测试程序.程序包含主控程序和显示程序.
💻 C
📖 第 1 页 / 共 4 页
字号:
#define   ENABLE_BIT_DEFINITIONS
//为了使用类似1<<RXEN的表示方法来设置某一位,必须如上进行定义,参见文件iom16.h
#include<iom16.h>
#include<stdio.h>
#include<inavr.h>
#include<math.h>
#include "iomacro.h"

#define _NOP()	asm("nop")
#define some_nop() asm("nop");asm("nop");asm("nop");asm("nop");
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

#define  UD    PORTC_Bit6
#define  INC   PORTC_Bit7
#define  CS2   PORTB_Bit0

#define  DII  PORTB_Bit7 //定义数码液晶接口
#define  CLKK   PORTB_Bit6 //定义数码液晶接口
#define GETBITT(A,B) ((A&(1<<B))?1:0)

//测试字节A中第B位,是1返回1,是0返回0*
#define GETBIT(A,B) ((A&(1<<B))?1:0)
//将A,B中较小的返回
#define MIN(A,B) ((A<=B)?A:B)
//将A,B中较大的返回
#define MAX(A,B) ((A>=B)?A:B)
uint voltage=0;//采样到信号幅值
uchar swept_flag=0; //扫频状态标志  =1为扫频状态    =0为非扫频状态
uchar saopin=0;  //扫频标志位
uchar f_sect=0;  //频段标志
uint f_sectmax; //频段最大值

uchar reso_num=0;   	/*增益数字电位器抽头位置0~99*/

uchar ZDCSBZ=0;//定时器0中断次数标志inter_degree
//uchar yihaomiao=0;    //一毫秒倒标志
uint YS;
uchar FWBZ=2;  //一个标志位,供查询向上键时使用     
    //  公式:(1/f)/1.4467592592=x

                      //50hz  80   110   140  170  200  230  260  290  320
uint  __flash aa[100]={13823,8639,6283,4936,4065,3455,3004,2657,2382,2159,   //此行已减过一了
                       1974, 1818,1685,1570,1470,1381,1303,1233,1171,1114,
                       1062, 1015,973, 933, 897, 863, 832, 803, 776, 750,
                       727,  704, 683, 664, 645, 627, 611, 595, 580, 566,
                       552,  539, 527, 515, 504, 493, 482, 472, 463, 454,
                       445,  436, 428, 421, 413, 406, 399, 392, 385, 379,
                       373,  367, 361, 355, 350, 345, 340, 335, 330, 325,
                       320,  315, 312, 308, 304, 300, 296, 292, 288, 285,
                       281,  278, 274, 271, 268, 265, 262, 259, 256, 253,
                       250,  248, 245, 242, 240, 237, 235, 233, 230, 229   
                      };  //   50hz~3khz
            
uint __flash  bb[100]={13823,10016,7854,6459,5485,4766,4214,3776,3421,3127,
                       2879, 2668, 2485,2326,2186,2062,1952,1852,1762,1681,
                       1606, 1538, 1476,1418,1365,1316,1270,1227,1187,1149,
                       1114, 1081, 1049,1020,992, 966, 941, 917, 894, 873,
                       852,  832,  814, 796, 779, 763, 747, 732, 718, 704,
                       690,  677,  665, 653, 641, 630, 619, 609, 599, 589,
                       580,  571,  562, 553, 545, 537, 529, 521, 514, 507,
                       500,  493,  486, 480, 474, 468, 462, 456, 450, 445,
                       439,  434,  429, 424, 418, 414, 409, 405, 400, 396,
                       392,  388,  383, 379, 375, 372, 368, 364, 360, 345
                      } ; //50hz~2khz
uint __flash  cc[100]={13823,11616,10016,8804,7854,7088,6459,5932,5485,5100,
                       4766, 4473, 4214, 3983,3776,3590,3421,3267,3127,2998,
                       2879, 2769, 2668, 2573,2485,2403,2326,2254,2186,2123,
                       2062, 2005, 1952, 1901,1852,1806,1762,1721,1681,1643,
                       1606, 1572, 1538, 1507,1476,1447,1418,1391,1365,1340,
                       1316, 1292, 1270, 1248,1227,1206,1187,1168,1149,1131,
                       1114, 1097, 1081, 1065,1049,1035,1020,1006,992, 979,
                       966,  953,  941,  929, 917, 905, 894, 883, 873, 862,
                       852,  842,  833,  823, 814, 805, 796, 788, 779, 771,
                       763,  755,  743,  739, 732, 725, 718, 710, 704, 690
                      };  //50hz~1khz
uint __flash *PL; //频率变化量指针
uchar u_number=0; //幅值变化出入队列指针

//-------------------------------------------------------------------------------------------------------//
/*send_buf[0]值为:是否为有用数据(0X1B),send_buf[1]值为:数据类型命令,
 send_buf[2]值为:真正要传送的数据,send_buf[3]值为:数据传送完毕命令0XFF
 send_buf[1]=0x92,为扫频时发出的频率值   
 send_buf[1]=0x94,为扫频时发出的幅度值  
 send_buf[1]=0xa0,为查询时发出的频率值 
 send_buf[1]=0x80,为查询时发出的幅度值 
 send_buf[1]=0xc0,为扫频频段号命令
 send_buf[1]=0xc1,为扫频格式:单次/循环命令
 send_buf[1]=0x11,为扫频议发出的幅值      
 */
uchar send_buf[4]={0x1b,0x00,0x00,0x00,}; /*串口发送缓冲区*/
uchar  buff[5]={0xff,0xff,0xff,0xff,0x03};//数码液晶显示缓冲区
uchar  infomationn[] = { 0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0xFF };//数码
typedef union
{
 uint zancun;  //发送频率值前的暂存变量
 uint u_value;  //当前扫频或查询时的幅值
 uint plus_out; //幅值调节后实际输出的幅值
 uint u_ratio; //扫频时幅值处理之后的比值.
 uchar pp;  //x9c104调节级数
 }GENVA;
 GENVA BL;

//-----------------------------------------------------------------------------------------------------//

uint aa_u[100]; //定义在扫频中各频点对应下信号幅值存储的缓冲区。
uint Uad1,Uad2,Uad3;// Uad1为电位器调到最小处的AD值, Uad2电位器增大一次的AD值, Uad3按调节的级数后的AD值.
float Ui;//记录扫频议切换到内部发出幅值
float Uo; //记录扫频议切换到外部发出幅值
uint Uz; //电位器增大一次电压的增值
uint plus;//预输出幅值等级(mv)


                       
//-------------键盘扫描变量--------------------//
uchar key,keydata=0xff,keyold=0;
uchar keynumber=0;
//---------------------------------------------------------------------------------------------------------//
//plus_adjust=1 为输出plus=5mv,
//plus_adjust=2 为输出plus=10mv,
//plus_adjust=3 为输出plus=20mv,
//plus_adjust=4 为输出plus=50mv,
//plus_adjust=5 为输出plus=100mv,
//plus_adjust=6 为输出plus=200mv,
//plus_adjust=7 为输出plus=350mv,
//plus_adjust=8 为输出plus=500mv,
uchar plus_adjust=0;   //幅值或增益调节键 0X1F
//---------------------------------------------------------------------------------------------------------//
uchar start_pause=0;  // 开始/暂停键 =1为开始功能 ,  =2为暂停功能   0X3E
uchar frequency=0;   //频率调节键  0X3D
uchar single_cycle=0; //单次/循环键  =1为单次扫频状态,=2为循环扫频状态   0X3B
uchar query_up;    //查询向上键   0X2F
uchar query_down;  //查询向下键  0X37
//--------------------------------------------------------------------------------------------------------//

//----------------------------------------------------以下是四位液晶数码显示程序------------------------------------------------------------//


void sendd(uchar a)
{
	
		uchar i;
		for(i=0;i<8;i++)
		{
			 CLKK =0;
			DII=GETBITT(a,i);
			_NOP();
			_NOP();
			_NOP();
			_NOP();
			_NOP();
			_NOP();
			CLKK=1;
			_NOP();
			_NOP();
			_NOP();
			_NOP();
			_NOP();
			_NOP();
			CLKK=0;
			_NOP();
			_NOP();
			_NOP();
			_NOP();
			_NOP();
			_NOP();
		}
	
}


void sss()
{
uchar i;
for(i=0;i<5;i++)
{
sendd(buff[i]);
}
}


void diss(uint value)
{ uchar arr[4]={0,0,0,0};
  uchar m=0,j;  
  uint val;  
  
 arr[0]=value/1000;
 val= value%1000; 
 
 arr[1]=val/100;
 val= val%100; 
 
 arr[2]=val/10;
 val= val%10; 
 
 arr[3]=val; 
 
 if(arr[0]>=1) m=4;
 else if(arr[1]>=1) m=3;
 else if(arr[2]>=1) m=2;
 else if(arr[3]>=1) m=1;
 else m=0; 
  
  if(m==0) {buff[1]=0xff;buff[2]=0xff;buff[3]=0xff;buff[4]=0x03;} //为了显示一个'0'
	 else 
	   { for(j=0;j<4-m;j++) arr[j]=10; 
	     for(j=0;j<4;j++) buff[1+j]=infomationn[arr[j]];
        }
 //buf[3]=buf[3]&0xFE; 
  sss();
}

//-------------------------------------------------------------------------------------------------------------------//


//-------------------------以下是按键扫描程序---------------------------------//
uchar kbscan(void)
{
PORTC_Bit0=1;PORTC_Bit1=1;PORTC_Bit2=1;PORTC_Bit3=1;PORTC_Bit4=1;PORTC_Bit5=1; 

 keyold=PINC&0x3F; //读键盘   把第一次读出的键值赋予老键值变量

  YS=60000;
  do{__delay_cycles(2);} while(--YS!=0); //延时5.9ms,以使显示刷新 '' __delay_cycles(1)''延时一个机器周期即:1/11.0592MHZ0.0904224537us
  keydata=PINC&0x3F; //再(第二次)次读键盘
  
   if((keyold==keydata)&&(keydata!=0x3f)) //判断第二次读键值和第一次相等么?
     {keynumber=3;
      do{YS=15536;
         do{__delay_cycles(1);} while(--YS!=0);
         keydata=PINC&0x3F; //再读键盘
         keynumber--;
      
        }
       // while(keydata==keyold);
      while((keydata==keyold)&&(keynumber!=0));  //直到按键松开才有返回值
      //while((keydata==keyold)||(keynumber==0));  //直到按键松开才有返回值
      if(keynumber==0) {YS=15536;
                        do{__delay_cycles(1);} while(--YS!=0);     
                        return (keydata);
                        }
      else  return (keyold); //有键按下,返回键值
     }
    return(0);  //没有键按下返回0
}      
   
//------------------------------------------------------------------------------------//
  
void usart_init( unsigned int baud )  //串口初始化函数
{

⌨️ 快捷键说明

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