‘壹’ 51单片机内置定时器制作计时的误差怎么产生的。
首先,单片机定时器的记数的频率是由单片机的时钟频率所决定的,而单片机的时钟频率是由外部晶振或内部震荡电路所决定的。不管是外部晶振还是内部晶振,本身都是有误差的!然后又受外部的温度、湿度、电磁干扰的影响,他们的频率也是在变化的。这是无法避免的。然后,人在操作时也是有误差的,例如51单片机工作在模式1的16位的定时器。当发生定时中断后,要重装定时器的初值,而执行这两条指令也是要花时间的。这个误差很小,可以忽略。最后就是当你 的中断函数过长,其执行时间已经超过了定时周期,这时候将会丢失中断。因为在发生下一次中断的时候,而CPU还在执行本次的中断服务程序。由于同优先级的中断不能被打断,所以就会丢失中断信号,这是产生了错误,而非误差,所以中断函数尽量短!
‘贰’ 用51单片机汇编语言检测上升沿和下降沿
这里只讲原理,不关注速度。实际设计工作中,已经有很多单片机能够识别io端口上升沿和下降沿中断,且方式不止一种。
sbit
io_inp=p2^1;输入端
bit
old_bit;输入端电平记忆
unsigned
char
low_high;上升下降沿标志,0=无变化,1=上升沿,2、下降沿
void
io_rest(void)
{
if(old_bit=!io_inp)
{
old_bit=io_inp;
if(io_inp=1)
low_high=1;
else
low_high=2;
}
}
void
main(void)
{
old_bit=io_inp=p2^1;
while(1)
{
low_high=0;
io_rest(void);
//在此应用
}
}
(2)单片机下降沿计数误差分析扩展阅读:
直接使用肢猛汇编指令编写单片机程序,对硬件的控制更加直接,可以直接操作物理地址,寄存器,端口等;历坦桥其它更高级的语言(如:C语言)对硬件的控制是依赖于类库来实现的。并且,对于一些对程序大小和运行速度有非常严苛要求的项目而言,都必须使用汇编指令。
C语言只是为了方便编写,与机器打交道的信山其实都是2进制得代码,汇编语言就是这些代码好记忆的名称和规则,只是比C语言难理解些。
‘叁’ 单片机怎么检测上升沿与下降沿
您是问硬件的方式?还是软件的方式?
如果是硬件的方式,那么,各种兄岁单片机很不相同,需要具体看它的资料。
一般来说,某些引脚,例如:外中断引脚、定时器的计数触发引脚、捕获引脚等等,都可以用来检测上升沿与下降沿。
以捕获(有的单片机资料如80196,将它称作“高速输入”)引脚为例:
捕获引脚可以与某个定时器相关联,在捕获引脚上遇到上升沿或下降沿时,硬件就自动记录下当时定时器的读数,并产生中断请求。您可以在中断服务程序中做所需的相应操作。
至于是上升沿捕获,还是下降沿捕获,还是二者都能捕获,可以由用户自己选择配置。
如果是用软件的方式来检测,那道理就简清败单了。用查询方式:只要将要检测的信号接到某个输入端口的某个位,在程序中反复读取该位的输入,一旦遇到“上次是0此次羡正睁是1”的情况,就说明检测到了上升沿,遇到“上次是1此次是0”的情况,就说明检测到了下降沿。
‘肆’ 单片机外部中断0接收外部脉冲的问题。。
单片机外部中断0, 有两种情况
1 是 设置错配和误 如果设置 成低电平 中断 那么 只要 低电平 进入中断服务程序,中断结束
还是 低电平 继续 进入中断服务程序,产生重复计数,检查中断设野卖盯置。
2 脉冲信号波形不好,产生多个下降沿, 可以加滤波电容 (颂和103 & 104 )
‘伍’ 基于51单片机的频率测量及测量误差
可以用对单位时间内 脉冲个计数的方法来实现,用2个 定时/计数器 ,一个作为定时器,定时50 ms,累积10次或20次,即0.5S或1S
另外一个作为计数器,对外部脉冲计数
误差与晶振频率准确度有关,测量与时间有关的量,你本身的时间当然要准确。如果所测信号频率高,可以测0.2s或0.5S内的脉冲数,可以防止溢出,如果频率低,可以测1S或2S内的脉冲数,以减小误差,但响应速度慢一些。
程序比较简单,以下供参考
void init()//初始化设置
{
TMOD=0x15;//定时器0作为计数器,定时器1作为定时器用
TH0=0;//计数器清0
TL0=0;
EA=1;//开总中断
ET1=1;//允许定时器1中断
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR0=1;//启动计数器
TR1=1;//启动定时器
aa=0;
}
void main()//主程序
{
init();//初始化
while(1)//循环程序
{
dd=bb*256+cc;//0.5S的计数值
ee=2*dd;//换算为1秒钟的计数值
if(aa==1)
{
if(TH0>12)//预判断,50ms内TH0>12,1s内计数值将超过可计数的最大值65535
fm=1;//报警
}
display4(ee);//显示
fm=0;//报警停止
}
}
void timer1()interrupt 3//注意:定时器1的中断序号为3
{
aa++;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(aa==10)//中断10次,共0.5S
{
TR0=0;//暂停计数
aa=0;
bb=TH0;//读出计数器数据
cc=TL0;
TL0=0;//计数器清0
TH0=0;
TR0=1;//重新启动计数器
}
}
‘陆’ 单片机,什么是下降沿
单片机中的下降沿,并非是一般意义的下降沿。
单片机工作时,它会自动的,每隔一个机器周期,检测一次引脚上的电压。
当,前一次检测,是高电平,后一次,却检测到了低电平,
单片机,就认为是收到了一个《下降沿》。
在单片机中,所说的《下降沿滑滑散》,必须有一个高电平、有一个低电平。
高电平、信氏低电平的持续时间,都必须超过一个机器周期。
否则,单片机就检测不到。
高、低之间的《斜坡》,不要超过一个机器周期,让液否则,单片机就难以检测。
‘柒’ 谁能详细说一下单片机中误差怎么产生的,要非常详细的
不知道你说的是什么误差?如果是时间或执行时间上的误差,一般应该是晶振造成的,晶振频率会有误差,这就造成了延时和指令执行时间的误差。