新手上路
- 积分
- 29
- 金钱
- 29
- 注册时间
- 2020-6-16
- 在线时间
- 11 小时
|
1金钱
#include "reg51.h"
#include "intrins.h"
#include "1602.h"
unsigned char t0_hh,t1_hh;
unsigned char dis_buf[11];
sbit RS=P2^2;
sbit RW=P2^1;
sbit LCM1602_E=P2^0;
sbit LCM1602_Busy=P0^7;
sbit led = P2^6;
bit firstex,secondex; (这俩是干啥的,没看懂)
unsigned long count0,count1;
unsigned long count;
unsigned char i,p,q;
//低频数据处理
void deal_data() (这整个函数都看得不是很懂,为啥adata要*10000000再除,count又是啥)
{
unsigned char i;
float adata;
count1=t1_hh*65536+TH1*256+TL1;
count0=t0_hh*65536+TH0*256+TL0;
adata=(float)count1*10000000/count0;
adata=(float)adata*10;
count=(unsigned long)(adata+0.5);
for(i=7;i>0;i--)
{
dis_buf[i]=count%10;
count=count/10;
}
dis_buf[0]=count;
dis_buf[8]=dis_buf[7];
dis_buf[7]=dis_buf[6];
dis_buf[6]=-2;
}
//低频液晶显示
void display()
{
for(i=0;i<11;i++)
{
lcd_char_write(i,1,dis_buf[i]+0x30);
lcd_delay(1);
}
}
//外中断1
void init1() interrupt 2
{
if(firstex==0)
{
TH1=0;
TL1=0;
TH0=0;
TL0=0;
t0_hh=0;
t1_hh=0;
TR1=1;
TR0=1;
EX1=0;
firstex=1;
secondex=0;
}
else
{
TR1=0;
TR0=0;
secondex=1;
EX1=0;
q=q+1;
if (q>2)
{ led=1;
}
else
{ led=0;}
if (q==3) q=0;
}
}
//定时器1中断处理
void timer1() interrupt 3
{
t1_hh++;
}
void timer0() interrupt 1
{
t0_hh++;
if(t0_hh>=20)
{
IE1=0;
EX1=1;
}
}
void main() //主函数
{
lcd_system_reset(); //初始化LCD
TMOD=0x51; //T1计数,T0定时
ET1=1;
ET0=1; //使能T1,T0中断
IT1=1; //设置外部中断1下降沿触发
string_write(0,0,"Frequence Test"); //在第一行写入字符串
EX1=1; //打开外部中断1的中断允许
EA=1; //打开总中断
while(1)
{
if(secondex==1)
{
deal_data();//f存在count
secondex=0;
firstex=0;
EX1=1;
display();
}
}
}
如题,主要是低频数据处理函数里面看的不太懂,望前辈们点拨
|
最佳答案
查看完整内容[请看2#楼]
整个流程就是。 初始化,遇到被测信号的下降沿,打开外部中断,清零所有计数值。关闭外部中断。 等待到t0_hh>=20 (t0计的是基频,所以20个就是一个固定的时间长度T), 满足该条件后,再打开外部中断。等到新的被测信号的下降沿来临,到来时secondex=1; (secondex作为一个标志,代表一个完整的测量) secondex=1时,测量一次完成,在主程序中进行处理。
捕获到的时间长度t0_hh*f0 捕获到被测信号的个数 t1_hh 单个被测 ...
|