展开全部
方案1: 不用定时中断,可以用定时器计数方式吧? 用外部中断,测量下降沿(或上升沿)和下一个下降沿(或上升沿)之间的时间间隔(用定时器计数更精确,如果频率很高也可以用软件模拟的方式 做一个计数), 软件结构:在下降沿中断的同时,保存当前计数值,计数清零并重新启动计数器(如上,既可以是定时器计数,也可以软件计数), 算得计数的时间 + 中断响应的时间 就是T(周期) 倒数 就是频率了
方案2:做一个循环,每次判断电平是否变化否则就 计数+1 如果跳变就保存计数值 做下一次准备 这样测量的值是一个周期内的固定电平的宽度值,如果占空比不是50%或固定的话 就
方案3:改动下方案2,判断的时候同时判断是否由低变高这样是测定一个周期
方案4:使用定时中断,定时为1s,此时计算电平出现变化的次数(最好外部中断计数,不影响其他操作),这样算出的就是频率值,也是最准确的一种测试方法。
方案2:做一个循环,每次判断电平是否变化否则就 计数+1 如果跳变就保存计数值 做下一次准备 这样测量的值是一个周期内的固定电平的宽度值,如果占空比不是50%或固定的话 就
方案3:改动下方案2,判断的时候同时判断是否由低变高这样是测定一个周期
方案4:使用定时中断,定时为1s,此时计算电平出现变化的次数(最好外部中断计数,不影响其他操作),这样算出的就是频率值,也是最准确的一种测试方法。
展开全部
可以使用P1口直接读取高低电平 但程序要写的短小 而且一定要定好时间 如果只有你说的10Hz左右 那在短时间内用IO口读取还是可以
不过用定时器要好些
具体程序 :
sbit we = P1^0;
char chk()
{
uint i;
if(we == 0) i++; we = 1;
}
void dingshi_1s()
//软件定时函数可根据下面的定时方法和晶振频率计算 就不写了
{
}
软件延时与时间计算
在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。
2.1 短暂延时
可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:
void Delay10us( ) {
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。 可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用\[4\],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。
不过用定时器要好些
具体程序 :
sbit we = P1^0;
char chk()
{
uint i;
if(we == 0) i++; we = 1;
}
void dingshi_1s()
//软件定时函数可根据下面的定时方法和晶振频率计算 就不写了
{
}
软件延时与时间计算
在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。
2.1 短暂延时
可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:
void Delay10us( ) {
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。 可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用\[4\],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
最好是用定时器中断做,不然的话不准。
频率高,数单位时间内的脉冲数,频率低,测两个脉冲的间隔
如果不用中断做,你必须保证程序指令的时间在你设计时考虑计算了。10赫兹的频率还不算高,所以用纯软件做还看不出误差。
比如你设置2个状态,端口为1是状态1,端口为0为状态2。每次当状态从1变化到2的时候计数,1秒之内看看能计几个就是频率了
频率高,数单位时间内的脉冲数,频率低,测两个脉冲的间隔
如果不用中断做,你必须保证程序指令的时间在你设计时考虑计算了。10赫兹的频率还不算高,所以用纯软件做还看不出误差。
比如你设置2个状态,端口为1是状态1,端口为0为状态2。每次当状态从1变化到2的时候计数,1秒之内看看能计几个就是频率了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询