![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
下面是一个用51单片机的P3.5引脚对一个由555定时器构成的多谐振荡器的振荡频率进行测量的程序,求注释
voidcafrequent(void)reentrant定义cafrequent程序求振荡频率{longintl1=0x00;longinth1=0x00;floatt...
void cafrequent(void) reentrant 定义cafrequent程序求振荡频率
{
long int l1=0x00;
long int h1=0x00;
float tt=0; //tt用于计算频率
TMOD=(TMOD&0x0F)|0x90;
TH1=0x00;
TL1=0x00;
ET1=1;
EA=1;
while(fw==1); 测得引脚P3^5为高电平
TR1=1;
while(fw==0); 测得引脚P3^5为低电平
while(fw==1); 测得引脚P3^5为高电平
TR1=0;
l1=TL1;
h1=TH1;
uu=h1*256+l1+inte*65536;
inte=0;
tt=uu/(11.0592*1000000.0/12.0); 求振荡周期
ff=(unsigned long int)(1.0/tt); //频率值 求震荡频率
}
越详细越好~最好每句都能给出注释,求高手帮助! 展开
{
long int l1=0x00;
long int h1=0x00;
float tt=0; //tt用于计算频率
TMOD=(TMOD&0x0F)|0x90;
TH1=0x00;
TL1=0x00;
ET1=1;
EA=1;
while(fw==1); 测得引脚P3^5为高电平
TR1=1;
while(fw==0); 测得引脚P3^5为低电平
while(fw==1); 测得引脚P3^5为高电平
TR1=0;
l1=TL1;
h1=TH1;
uu=h1*256+l1+inte*65536;
inte=0;
tt=uu/(11.0592*1000000.0/12.0); 求振荡周期
ff=(unsigned long int)(1.0/tt); //频率值 求震荡频率
}
越详细越好~最好每句都能给出注释,求高手帮助! 展开
2个回答
展开全部
void cafrequent(void) reentrant 定义cafrequent程序求振荡频率
{
long int l1=0x00;
long int h1=0x00;
float tt=0; //tt用于计算频率
TMOD=(TMOD&0x0F)|0x90; //定时器1工作于模式1(16位计数器),TR1控制运行
TH1=0x00; //计数器初值设为0x0000
TL1=0x00;
ET1=1; //timer1 使能
EA=1; //开中断
while(fw==1); 测得引脚P3^5为高电平
TR1=1; //timer1 开始计数 注:1
while(fw==0); 测得引脚P3^5为低电平
while(fw==1); 测得引脚P3^5为高电平
TR1=0; //timer1 停止计数
l1=TL1; //读当前计数值
h1=TH1;
uu=h1*256+l1+inte*65536; //计算总计数值 这里写成 uu=inte*65536+h1*256+l1 会比较直观一些 注:1
inte=0; //清累计溢出计数
tt=uu/(11.0592*1000000.0/12.0); 求振荡周期
ff=(unsigned long int)(1.0/tt); //频率值 求震荡频率
}
注1:另外还有一个timer1的中断函数你没给出来。该中断函数功能就是当timer的计数值超过0xffff的时候触发中断,在中断内部将对全局变量inte 进行加一操作,以记录timer1的溢出次数,实际也可以理解为16位计数器溢出后的进位,相当于第17位到32位的计数值。
起目的是当被测频率值很低的时候,16位的计数值不足以存放待测频率值的周期,所以需要额外的计数值。
{
long int l1=0x00;
long int h1=0x00;
float tt=0; //tt用于计算频率
TMOD=(TMOD&0x0F)|0x90; //定时器1工作于模式1(16位计数器),TR1控制运行
TH1=0x00; //计数器初值设为0x0000
TL1=0x00;
ET1=1; //timer1 使能
EA=1; //开中断
while(fw==1); 测得引脚P3^5为高电平
TR1=1; //timer1 开始计数 注:1
while(fw==0); 测得引脚P3^5为低电平
while(fw==1); 测得引脚P3^5为高电平
TR1=0; //timer1 停止计数
l1=TL1; //读当前计数值
h1=TH1;
uu=h1*256+l1+inte*65536; //计算总计数值 这里写成 uu=inte*65536+h1*256+l1 会比较直观一些 注:1
inte=0; //清累计溢出计数
tt=uu/(11.0592*1000000.0/12.0); 求振荡周期
ff=(unsigned long int)(1.0/tt); //频率值 求震荡频率
}
注1:另外还有一个timer1的中断函数你没给出来。该中断函数功能就是当timer的计数值超过0xffff的时候触发中断,在中断内部将对全局变量inte 进行加一操作,以记录timer1的溢出次数,实际也可以理解为16位计数器溢出后的进位,相当于第17位到32位的计数值。
起目的是当被测频率值很低的时候,16位的计数值不足以存放待测频率值的周期,所以需要额外的计数值。
追问
uu=inte*65536+h1*256+l1
可不可以帮我详细解释一下这个方程,我是外行。。。
追答
timer1的16位计数器的高8位和低8位分别存放于h1,l1 .
举个例子,比如:h1 = 0x01,l1 = 0x0a; 也就是说16位计数器总值为0x0102 ,是十进制的多少呢?
是 0x01 * 256 + 0x0a = 266,也就是0x0102 = 266。这样应该容易理解了吧。
当16位计数器满了,也就是达到0xffff了,但还要继续计数怎么办?再加一就变0x0000了呀,这时就引入inte变量来继续计数,每一次timer1满了会发生一次中断,在中断里将inte加一,表示timer1又满了一次。将刚才的例子再加上inte里记录的timer1满了的次数所对应的值就是总体计数的个数了。
由于inte要整个16位计数器溢出才加一,所以inte里的1实际代表一个计数器最大值0xffff,在运算的时候就要用inte*0xffff 也就是inte*65536来表示inte所代表的计数值啦
展开全部
void cafrequent(void) reentrant 定义cafrequent程序求振荡频率
{
long int l1=0x00;
long int h1=0x00;
float tt=0; //tt用于计算频率
TMOD=(TMOD&0x0F)|0x90; //定义定时器1的工作模式
TH1=0x00; //定时器1高八位赋初值
TL1=0x00; //定时器1低八位赋初值
ET1=1; //开定时器1中断
EA=1; //开总中断
while(fw==1); 测得引脚P3^5为高电平
TR1=1; //开始计数
while(fw==0); 测得引脚P3^5为低电平
while(fw==1); 测得引脚P3^5为高电平
TR1=0; //停止定时
l1=TL1; //把定时器低八位赋给l1
h1=TH1; //把定时器高八位赋给h1
uu=h1*256+l1+inte*65536;
inte=0;
tt=uu/(11.0592*1000000.0/12.0); 求振荡周期 (11.0592*1000000.0 晶振频率,12分频)
ff=(unsigned long int)(1.0/tt); //频率值 求震荡频率
}
{
long int l1=0x00;
long int h1=0x00;
float tt=0; //tt用于计算频率
TMOD=(TMOD&0x0F)|0x90; //定义定时器1的工作模式
TH1=0x00; //定时器1高八位赋初值
TL1=0x00; //定时器1低八位赋初值
ET1=1; //开定时器1中断
EA=1; //开总中断
while(fw==1); 测得引脚P3^5为高电平
TR1=1; //开始计数
while(fw==0); 测得引脚P3^5为低电平
while(fw==1); 测得引脚P3^5为高电平
TR1=0; //停止定时
l1=TL1; //把定时器低八位赋给l1
h1=TH1; //把定时器高八位赋给h1
uu=h1*256+l1+inte*65536;
inte=0;
tt=uu/(11.0592*1000000.0/12.0); 求振荡周期 (11.0592*1000000.0 晶振频率,12分频)
ff=(unsigned long int)(1.0/tt); //频率值 求震荡频率
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询