简易数字频率计程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{flag3=1;}
/******************************************************/
/*INT1的中断响应程序*/
void int1xy() interrupt 2
{count1=count1+1;
}
/******************************************************/
/*中断程序初始化*/
/******************************************************/
/*T0的初始化,工作模式是方式2,外部计数方式,计数个数是250个*/
void t0init()
{TMOD=0x06;
TH0=6;
TL0=6;
ET0=1;
EA=1;/*TR0没有开*/
/*中断程序*/
/******************************************************/
/*T2的中断响应程序*/
void T2xy() interrupt 5
{ EXF2=0;
count2=RCAP2L-count2;/*低位*/
count3=RCAP2H-count3;/*高位*/
}
/******************************************************/
/*低频部分的精测*/
unsigned long jingche()
{unsigned long c;
unsigned char i,j;
t0init();
if(flag1==3){j=10;}
Delayms(1);
Write_LCD_Command(0x06);
Delayms(1);
Write_LCD_Command(0x0c);
Delayms(1);
}
/****************************************************/
/******************************************************/
/*只是求得测量值*/
void t2cx()
{ flag2=0;
while (P1_1==1);
EXEN2=1;
while (P1_1==0);
TR2=1;
/*flag2判断是否测量完成,不是继续等待*/
}
/******************************************************/
}
if(flag1==0){TR1=1;
while(P1_0==1){if(flag2==1){ TH1=35536/256; TL1=35536%256;flag2=3;TR1=1;i+=1;}
if(i<=5) continue;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){ TH1=35536/256; TL1=35536%256;TR1=1;
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
uchar Busy_Check()
{
uchar LCD_Status;
RS = 0;
RW = 1;
EN = 1;
Delayms(1);
LCD_Status = P0;
EN = 0;
return LCD_Status;
EX1=1;
PT1=1;
while(flag2==0) ;
if (count1>2){ flag1=1; flag2=0; count1=0;}/*flag1=1,>=10khz*/
while(flag1==0) {count1=0;
t1init();
Pb=0;/*第5路信号,不分频了*/
flag2=0;
#define uchar unsigned char
#define uint unsigned int
extern uchar m[9]={0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe};
extern uchar flag1=0;
uint flag2=0;
/*int0的初始化工作于下降沿响应模式*/
//void int0init()
//{EX0=1;
//EA=1;
///IT0=1;
//PT0=1;
//}
/******************************************************/
/*T2工作于频段2和3,测周,测频,测占空比*/
uchar flag3=0;
uchar count2=0;
uint count3=0; /*flag1记录频段划分,flag2用来标识测量是否完成*/
uchar count1=0;/*count1用于记录T0里的脉冲个数*/
unsigned long count4=0;
/******************************************************/
}
void Write_LCD_Command(uchar cmd)
{
while((Busy_Check()&0x80)==0x80);
RS = 0;
RW = 0;
EN = 0;
P0 = cmd;
EN = 1;
Delayms(1);
EN = 0;
}
void Write_LCD_Data(uchar dat)
TR1=1;
EX1=1;
break;
}
if (flag1==0){while (flag2==0);
if (count1>4){flag1=2;flag2=0;count1=0;}/*flag1=2,1khz~10khz*/
}/*如果第一次就测出来,flag1就不为0,然后往下运行*/
while (flag1==0){ t1init();
/*T1的中断响应程序*/
void t1xy() interrupt 3
{TR1=0;
EX1=0;
flag2=1;
PT1=0;
}
/******************************************************/
/*T0的中断响应程序*/
void T0xy() interrupt 1
}
/******************************************************/
/*T1的初始化工作于定时模式*/
void t1init()
{TMOD=0x10;
ET1=1;
TH1=63436/256;/*定时时间是2.1ms*/
TL1=63436%256;
EA=1;/*TR1没有开*/
}/**/
if(flag2==3){flag1=3;flag2=0;TR1=0;}
if(flag2==2){flag1=4;flag2=0;TR1=0;}
}
}/*已经粗测完*/
TR1=0;
}
/******************************************************/
RCAP2L=0;
}
/******************************************************/
/*int1的初始化工作于下降沿响应模式*/
void int1init()
{EX1=1;
EA=1;
IT1=1;
}
/******************************************************/
flag2+=1;/*完成一次脉冲宽度的测量,如果是测占空比,可以重新再开中断,保留count2,和count3的值后。*/
}
/******************************************************/
/*INT0的中断响应程序*/
void int0xy() interrupt 0
count1=0;
}
/******************************************************/
/*T2的初始化工作于捕获模式*/
void t2init()
{T2CON=0x01;
ET2=1;
EA=1;
TH2=0;
TL2=0;/*TR2,EXEN2没有开*/
RCAP2H=0;
{count1+=1;
count4+=1;
}
/******************************************************/
/***************************************************/
void Delayms(uint ms)
while(RCAP2H<200);/*判断待测周期是不是超过10ms,不是就接着等待,这是为了防止单片机最小工作时间1us这个误差而设的*/
TR2=0;
a=RCAP2L-a;
b=RCAP2H-b;
c=b*256+a;/*这里还没除去周期个数,转换函数里转换*/
count2=0;
count3=0;
return (c);
/*粗测部分的程序*/
void cuce()
{ unsigned char i=0;
int1init();/* int1工作于下降沿模式,每次触发就执行一次中断函数,也就是count1+1*/
t1init();/*t1工作于定时模式*/
Pa=0;
Pb=1;
Pc=1;/*第7路信号,10分频*/
TR1=1;
count1=0; TH1=55536/256; TL1=55536%256; flag2=0;
if (P1_0==0){TR1=1;
while(P1_0==0){if(flag2==1){ TH1=35536/256; TL1=35536%256;flag2=3;TR1=1;i+=1;}
if(i<=5) continue;
if(i<=5) continue;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){flag1=2;flag2=0;TR1=0;}
}/**/
if(flag2==3){flag1=3;flag2=0;TR1=0;}
if(flag2==2){flag1=4;flag2=0;TR1=0;}
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
sbit Pa=P1^2;
sbit Pb=P1^3;
sbit Pc=P1^4;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_1=P3^1;
sbit P3_5=P3^5;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){ TH1=35536/256; TL1=35536%256;TR1=1;
while(P1_0==1){if(flag2==1){ TH1=35536/256; TL1=35536%256;flag2=3;TR1=1;i+=1;}
/*高频部分的精测*/
unsigned long jingce()
{
unsigned long b,a;
unsigned long c=0;
t2init();
t2cx();
while(flag2==0);
a=RCAP2L;
b=RCAP2H;
while(flag2==1);/*等待第二次下降沿的到来*/
{
while((Busy_Check()&0x80)==0x80);
RS=1;
RW=0;
EN=0;
P0=dat;
EN=1;
Delayms(10);
EN = 0;
}
void Initialize_LCD()
{
Write_LCD_Command(0x30);
Delayms(1);
Write_LCD_Command(0x01);
while(P1_0==0){if(flag2==1){ TH1=35536/256; TL1=35536%256;flag2=3;TR1=1;i+=1;}
if(i<=5) conபைடு நூலகம்inue;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){flag1=2;flag2=0;TR1=0;}
/******************************************************/
/*INT1的中断响应程序*/
void int1xy() interrupt 2
{count1=count1+1;
}
/******************************************************/
/*中断程序初始化*/
/******************************************************/
/*T0的初始化,工作模式是方式2,外部计数方式,计数个数是250个*/
void t0init()
{TMOD=0x06;
TH0=6;
TL0=6;
ET0=1;
EA=1;/*TR0没有开*/
/*中断程序*/
/******************************************************/
/*T2的中断响应程序*/
void T2xy() interrupt 5
{ EXF2=0;
count2=RCAP2L-count2;/*低位*/
count3=RCAP2H-count3;/*高位*/
}
/******************************************************/
/*低频部分的精测*/
unsigned long jingche()
{unsigned long c;
unsigned char i,j;
t0init();
if(flag1==3){j=10;}
Delayms(1);
Write_LCD_Command(0x06);
Delayms(1);
Write_LCD_Command(0x0c);
Delayms(1);
}
/****************************************************/
/******************************************************/
/*只是求得测量值*/
void t2cx()
{ flag2=0;
while (P1_1==1);
EXEN2=1;
while (P1_1==0);
TR2=1;
/*flag2判断是否测量完成,不是继续等待*/
}
/******************************************************/
}
if(flag1==0){TR1=1;
while(P1_0==1){if(flag2==1){ TH1=35536/256; TL1=35536%256;flag2=3;TR1=1;i+=1;}
if(i<=5) continue;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){ TH1=35536/256; TL1=35536%256;TR1=1;
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
uchar Busy_Check()
{
uchar LCD_Status;
RS = 0;
RW = 1;
EN = 1;
Delayms(1);
LCD_Status = P0;
EN = 0;
return LCD_Status;
EX1=1;
PT1=1;
while(flag2==0) ;
if (count1>2){ flag1=1; flag2=0; count1=0;}/*flag1=1,>=10khz*/
while(flag1==0) {count1=0;
t1init();
Pb=0;/*第5路信号,不分频了*/
flag2=0;
#define uchar unsigned char
#define uint unsigned int
extern uchar m[9]={0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe};
extern uchar flag1=0;
uint flag2=0;
/*int0的初始化工作于下降沿响应模式*/
//void int0init()
//{EX0=1;
//EA=1;
///IT0=1;
//PT0=1;
//}
/******************************************************/
/*T2工作于频段2和3,测周,测频,测占空比*/
uchar flag3=0;
uchar count2=0;
uint count3=0; /*flag1记录频段划分,flag2用来标识测量是否完成*/
uchar count1=0;/*count1用于记录T0里的脉冲个数*/
unsigned long count4=0;
/******************************************************/
}
void Write_LCD_Command(uchar cmd)
{
while((Busy_Check()&0x80)==0x80);
RS = 0;
RW = 0;
EN = 0;
P0 = cmd;
EN = 1;
Delayms(1);
EN = 0;
}
void Write_LCD_Data(uchar dat)
TR1=1;
EX1=1;
break;
}
if (flag1==0){while (flag2==0);
if (count1>4){flag1=2;flag2=0;count1=0;}/*flag1=2,1khz~10khz*/
}/*如果第一次就测出来,flag1就不为0,然后往下运行*/
while (flag1==0){ t1init();
/*T1的中断响应程序*/
void t1xy() interrupt 3
{TR1=0;
EX1=0;
flag2=1;
PT1=0;
}
/******************************************************/
/*T0的中断响应程序*/
void T0xy() interrupt 1
}
/******************************************************/
/*T1的初始化工作于定时模式*/
void t1init()
{TMOD=0x10;
ET1=1;
TH1=63436/256;/*定时时间是2.1ms*/
TL1=63436%256;
EA=1;/*TR1没有开*/
}/**/
if(flag2==3){flag1=3;flag2=0;TR1=0;}
if(flag2==2){flag1=4;flag2=0;TR1=0;}
}
}/*已经粗测完*/
TR1=0;
}
/******************************************************/
RCAP2L=0;
}
/******************************************************/
/*int1的初始化工作于下降沿响应模式*/
void int1init()
{EX1=1;
EA=1;
IT1=1;
}
/******************************************************/
flag2+=1;/*完成一次脉冲宽度的测量,如果是测占空比,可以重新再开中断,保留count2,和count3的值后。*/
}
/******************************************************/
/*INT0的中断响应程序*/
void int0xy() interrupt 0
count1=0;
}
/******************************************************/
/*T2的初始化工作于捕获模式*/
void t2init()
{T2CON=0x01;
ET2=1;
EA=1;
TH2=0;
TL2=0;/*TR2,EXEN2没有开*/
RCAP2H=0;
{count1+=1;
count4+=1;
}
/******************************************************/
/***************************************************/
void Delayms(uint ms)
while(RCAP2H<200);/*判断待测周期是不是超过10ms,不是就接着等待,这是为了防止单片机最小工作时间1us这个误差而设的*/
TR2=0;
a=RCAP2L-a;
b=RCAP2H-b;
c=b*256+a;/*这里还没除去周期个数,转换函数里转换*/
count2=0;
count3=0;
return (c);
/*粗测部分的程序*/
void cuce()
{ unsigned char i=0;
int1init();/* int1工作于下降沿模式,每次触发就执行一次中断函数,也就是count1+1*/
t1init();/*t1工作于定时模式*/
Pa=0;
Pb=1;
Pc=1;/*第7路信号,10分频*/
TR1=1;
count1=0; TH1=55536/256; TL1=55536%256; flag2=0;
if (P1_0==0){TR1=1;
while(P1_0==0){if(flag2==1){ TH1=35536/256; TL1=35536%256;flag2=3;TR1=1;i+=1;}
if(i<=5) continue;
if(i<=5) continue;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){flag1=2;flag2=0;TR1=0;}
}/**/
if(flag2==3){flag1=3;flag2=0;TR1=0;}
if(flag2==2){flag1=4;flag2=0;TR1=0;}
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
sbit Pa=P1^2;
sbit Pb=P1^3;
sbit Pc=P1^4;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_1=P3^1;
sbit P3_5=P3^5;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){ TH1=35536/256; TL1=35536%256;TR1=1;
while(P1_0==1){if(flag2==1){ TH1=35536/256; TL1=35536%256;flag2=3;TR1=1;i+=1;}
/*高频部分的精测*/
unsigned long jingce()
{
unsigned long b,a;
unsigned long c=0;
t2init();
t2cx();
while(flag2==0);
a=RCAP2L;
b=RCAP2H;
while(flag2==1);/*等待第二次下降沿的到来*/
{
while((Busy_Check()&0x80)==0x80);
RS=1;
RW=0;
EN=0;
P0=dat;
EN=1;
Delayms(10);
EN = 0;
}
void Initialize_LCD()
{
Write_LCD_Command(0x30);
Delayms(1);
Write_LCD_Command(0x01);
while(P1_0==0){if(flag2==1){ TH1=35536/256; TL1=35536%256;flag2=3;TR1=1;i+=1;}
if(i<=5) conபைடு நூலகம்inue;
flag2=2;i=0;TR1=0;break;
}
if(flag2==0){flag1=2;flag2=0;TR1=0;}