📄 spy主控程序ok.c
字号:
#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 + -