用单片机中断程序测量信号时间间隔的程序

c语言单片机程序实例:低频频率计_C语言中文网
&&/&&&&/&&
实例目的:学时定时器、计数器、中断应用
说明:选用24MHz的晶体,主频可达2MHz。用T1产生100us的时标,T0作信号脉冲计数器。假设晶体频率没有误差,而且稳定不变(实际上可达万分之一);被测信号是周期性矩形波(正负脉冲宽度都不能小于0.5us),频率小于1MHz,大于1Hz。要求测量时标1S,测量精度为0.1%。
解:从测量精度要求来看,当频率超过1KHz时,可采用1S时标内计数信号脉冲个数来测量信号频,而信号频率低于1KHz时,可以通过测量信号的周期来求出信号频率。两种方法自动转换。
对于低于1KHz的信号,信号周期最小为1ms,也就是说超过1000us,而我们用的定时器计时脉冲周期为0.5us,如果定时多计或少计一个脉冲,误差为1us,所以相对误差为1us/1000us=0.1%。信号周期越大,即信号频率越低,相对误差就越小。
从上面描述来看,当信号频率超过1KHz后,信号周期就少于1000us,显然采用上面的测量方法,不能达到测量精度要求,这时我们采用1S单位时间计数信号的脉冲个数,最少能计到1000个脉冲,由于信号频率不超过1MHz,而我们定时脉冲为2MHz,最差多计或少计一个信号脉冲,这样相对误差为1/1000,可见信号频率越高,相对误差越小。
信号除输入到T1(P3.5)外,还输入到INT1(P3.3)。
unsigned int us100;&&&&&&&&&&&&& //对100us时间间隔单位计数,即有多少个100us。
unsigned char S
unsigned int K64;&&&&&&&&&&&&&&& //对64K单位计数,即有多少个64K&&&&&
unsigned char oldT0;
unsigned int oldus, oldK64, oldT1;
&&&&&&&&&&&&&& //存放频率值,单位为Hz
bit HighLow=1;&&&&&&&&&&&&&&&&&& //1:表示信号超过1KHz;0:表示信号低于1KHz。
void InitialHigh( void )
&&&& IE=0; IP=0; HighLow=1;
TMOD = (TMOD & 0xf0) | 0x02; TH0=-200; TL0=TH0; PX0=1; T0=1;
&&&& TMOD = (TMOD & 0x0f) | 0x50; TH1=0; TL1=0; T1=1; ET1=1;
&&&& Us100=0; Second=0; K64=0;
&&&& oldK64=0; oldT1=0;
&&&& TCON |= 0x50;&&&&& //同时置 TR0=1; TR1=1;
&&&& EA = 1;
void InitialLow( void )
&&&& IE=0; IP=0; HighLow=0;
TMOD = (TMOD & 0xf0) | 0x02; TH0=-200; TL0=TH0; ET0=1; TR0=1;
&&&& INT1 = 1; IT1=1; EX1=1;
&&&& Us100=0; Second=0; K64=0;
&&&& oldK64=0; oldT1=0;
&&&& EA = 1;
void T0intr( void ) interrupt 1
{&&& if( HighLow==0 ) ++us100;
if( ++us100 &= 10000 )
{ && unsigned int tmp1, tmp2;
TR1=0; tmp1=(TH1&&8) + (TL1); tmp2=K64; TR1=1;
fcy=((tmp2-oldK64)&&16) + (tmp1-oldT1);
oldK64=tmp1; oldT1=tmp2;
void T1intr( void ) interrupt 3& {&&& ++K64;&& }
void X1intr( void ) interrupt 2
{&&& static unsigned char sts=0;
switch( sts )
case 0: sts = 1;
case 1: oldT0=TL0; oldus=us100; sts=2;
&&&& unsigned char tmp1, tmp2;
&&&& TR0=0; tmp1=TL0; tmp2=us100; TR0=1;
&&&& fcy = 1000000L/( (tmp2-oldus)*100L + (256-tmp1)/2 );
&&&& Second ++;
&&&& Sts = 0;
void main( void )
if( HighLow==1) InitialHigh(); else InitialLow();
&&&& While(1)
if( Second != 0 )
Second = 0;
//display fcy &引用前面的数码管驱动程序,注意下面对T0中断服务程序的修改
&&&& for( i=0; i&8; i++ ){ Display(i, fcy%10); fcy /= 10; }
if( HighLow==1 )
if( fcy&1000L ){ InitalLow();} &
&&&&&&&&&&&&& else
&&&&&&&&&&&&& &&&& if( fcy&1000L ){ InitalHigh();}
//修改T0的中断服务程序,让它在完成时标的功能时,同时完成数码管显示刷新
void T0intr( void ) interrupt 1
&&&& static unsigned char ms = 0;
&&&& if( HighLow==0 ) ++us100;
if( ++us100 &= 10000 )
{ && unsigned int tmp1, tmp2;
TR1=0; tmp1=(TH1&&8) + (TL1); tmp2=K64; TR1=1;
fcy=((tmp2-oldK64)&&16) + (tmp1-oldT1);
oldK64=tmp1; oldT1=tmp2;
&&&& if( ++ms &= 10 ){ ms=0; DisplayBrush(); } //1ms数码管刷新
推荐文章 TOP10查看: 3451|回复: 11
可以使用计数器计数的方法,获取外部输入信号的高电平持续时间?
你好,请问我可以使用计数器计数的方法,获取外部输入信号的高电平持续时间?
 可以的,你可以在检测到上升沿或高电平后开始定时,等到低电平或是下降沿后停下来,看 看时间是多少
回帖助人的奖励!
 楼上说得对,可以反相以后,利用中断来启动检测。然后循环检测来判断时间。或者直接采用循环判断也行。
我送个程序你看看
定时器T0的模式2测量正脉冲宽度
#include&reg51.h&& &//包含51单片机寄存器定义的头文件
sbit ui=P3^2;&&//将ui位定义为P3.2(INT0)引脚,探测输入电压
/*******************************************
函数功能:主函数
******************************************/& & & &
void main(void)
& & TMOD=0x0a;& &// TMOD=B,使用定时器T0的模式2,GATE置1
& & EA=1;& && && &//开总中断
& & ET0=0;& && &&&//禁止定时器T0中断& &&&
& &TH0=0;& && &&&//计数器T0高8位赋初值
& &TL0=0;& && &&&//计数器T0低8位赋初值
& &TR0=1;& && &&&//启动T0
& & & &&&while(1)& && &
& & & && &&&while(ui==0) ;&&//INT0为低电平,T0不启动
& & & & & & & && &
& & & && & TL0=0;& &//INT0为高电平, T0启动, TL0清0做准备
& & & & & & & &
& && && &&&while(ui==1) ; //在INT0高电平期间等待,计时结果送TH0\TL0& & & &
& && && & P1=TL0;& & //INT0一旦为低电平就将计时结果送P1口(或其他变量存储),根据机器周期可以计& && && && &&&
& && && && && && && && &&&算出INT0上高电平存续的宽度,当然如果高电平时间太长,也可以算上TH1。
& && && && && && && && &&&
& & & & //While(1);
计数器和定时器是一家人,但仅靠这家人是完不成任务的,必须与中断这家联姻&
定时器T0的模式2测量正脉冲宽度
#include&reg51.h&& &//包含51单片机寄存器定义的头文件
sbit ui=P3^2;&&//将ui位定义为P3.2(INT0)引脚,表示输入电压
/*******************************************
函数功能:主函数
******************************************/& & & &
void main(void)
& & TMOD=0x0a;& &// TMOD=B,使用定时器T0的模式2,//GATE置1
& & EA=1;& && && &//开总中断
& & & &&&ET0=0;& && &&&//禁止定时器T0中断& &&&
& & & &&&TH0=0;& && &&&//计数器T0高8位赋初值
& & & &&&TL0=0;& && &&&//计数器T0低8位赋初值
TR0=1;& && &&&//启动T0
& & & &&&while(1)& && & //无限循环,不停地将TL0计数结果送P1口
& & & && &&&while(ui==0) ;&&//INT0为低电平,T0不能启动
& & & & & & & && &
& & & & & & & &&&TL0=0;& &//INT0为高电平, T0已启动, TL0清0做准备
& & & & & & & &
while(ui==1) ; //在INT0高电平期间等待,计时结果送
//TH0\TL0& & & & & & & &
P1=TL0;& & //INT0一旦为低电平就将计时结果送P1口或其他变量//存储,根据机器周期可以计算出高电平存续的时间当//然如果高电平时间太长,也可以算上TH0。
& & & & //While(1);
定时器/计数器是一家人,单凭这家人是完不成任务的,还得去求人家INT0
回帖助人的奖励!
dingmingzhou 发表于
定时器T0的模式2测量正脉冲宽度
#include& &//包含51单片机寄存器定义的头文件
sbit ui=P3^2;&&//将ui位 ...
太感谢了,程序条理清晰,注释的非常详细,很容易让人理解。真是帮了我的大忙,再次表示感谢,祝您身体健康万事顺利。晚上我在烧录到单片机里面去,测试一下。
我不是以前就上传过答案么
回帖助人的奖励!
/**********************************************************************
//楼主:也不知你实验的怎样了。不过别高兴太早,这个程序是我粘来的,近日细琢磨一下,认为它还有些问题:
//1、既不查询中断标志,也不用中断服务,更甚者没开任何中断源!而开个总中断干什么呢?
//2、程序使用的是T0的工作方式2,它是自动重装的8位计数器。所以注释中说&可以算上TH0&以及存入&TH0&之类的注释,是何意?& &哎,什么人弄得!
//我把它改吧改吧,你试验一下行不?愿讨论。
/*************************************************************************/
#include&reg51.h&& &//包含51单片机寄存器定义的头文件
sbit&&ui = P3^2;&&//将ui位定义为P3.2(INT0)引脚,探测输入电压&&
void main(void)
&&{& & & &
& &TMOD=0x09;& &// 使用定时器T0的模式1,GATE置1。定时模式。&&
while(1)& && &
& & & && &TL0=0;& && & & & //定时器低8位清零& & & &
& & & && &TH0=0;& &&&//定时器高8位清零& & & && &
& & & && & while(ui);&&& & & & //为了完整测量一个高电平,必须准确寻找一个完整的高电平。
& & & && && && && && &&&//因此,如果此时P3.2脚上的电平为高,由于此时的TR0=0,
& & & && && && && && &&&//定时器T0不能启动。从下一个高电平开始。
& && && && &TR0=1;& & & & //& & & & 在P3.2脚 为低电平时& & & & ,让TR0=1,做准备。
& && & while(!ui) ;& & & & //& & & &&&在P3.2脚低电平期间,等待。& & & &
& & & && & while(ui) ;&&//&&程序到这一步时,P3.2脚已为高电平,同时启动T0定时,并等待 P3.2脚变低。
& & & & & & & && &&&TR0=0;& & //&&P3.2脚变低时,关闭定时器T0.
& & & && &P1=TL0;&&
& & & && &P2=TH0;& & & && & //显示 。TH0\TL0两个寄存器可以存储最大65536个数。
& & & &&&}
回帖助人的奖励!
/**********************************************************************
//楼主:也不知你实验的怎样 ...
正在做电赛的东西,抱走了哈~~~
我觉得可以,利用输入捕捉,前提是你要知道你计数是上升沿触发还是下降沿触发和上升沿都触发。
太好了。。。多谢楼主。。楼主好人。
无效楼层,该帖已经被删除
Powered by您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
基于单片机的低频弱信号检测.doc 21页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:200 &&
你可能关注的文档:
··········
··········
摘要微型计算机简称微机由于其具备人脑的某些功能所以也俗称微电脑是由大规模集成电路组成的体积较小的电子计算机典型的微型计算机包括运算器控制器储存器输入输出接口四个部分如果把运算器与控制器封装在一小块芯片上则称该芯片为微处理器如果将它与大规模集成电路制成的储存器输入输出接口印制在电路板上臃肿线连接起来就构成了微型计算机把微型计算机集成在一个芯片上就构成了单片微型计算机即单片机从ntel公司于基于单片机的测频系统设计在现实生活中有着广泛的应用关键词单片机运算放大器反相器1绪论 12设计要求 22.1课程设计的目的及意义 22.2课程设计的任务与要求 22.2.1设计任务 22.2.2设计要求 22.3课程设计的技术指标 23系统硬件设计 33.1AT89C51单片机简介 33.1.1AT89C51内部原理 33.1.2AT89C51管脚功能 43.2LM324运算放大器简介 53.3数码管显示电路简介 63.4系统原理图设计 84系统软件设计 94.1测频原理 94.2软件流程图 104.3程序代码 105系统仿真结果 135.1仿真结果 135.2结果分析 146总结 15致谢 16参考文献 17 1绪论频率是电子技术中最基本的参数,频率测量是电子测量领域最基本的测量之一,并且与许多电参量的测量都有着十分密切的关系。频率信号抗干扰性强,易于传输,可以获得较高的测量精度。随着数字电子技术的发展,频率测量在科技研究和实际应用中的作用日益重要,频率测量方法的优化也越来越受到重视。传统的频率计通采用组合电路和时序电路等大量的硬件电路构成,产品不但体积较大,运行速度慢,而且测量低频信号时不宜直接使用。现在单片机迅速发展速度非常迅速,采用单片机和相关硬软件实现频率测量,不但测量精度高,而且无常也很小。除此之外单片机也广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域。单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点。广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。利用单片机控制使得仪器仪表数字化、智能化、微型化。且功能比起采用电子或数字电路更加强大用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理、电梯智能化控制、各种报警系统?与计算机联网构成二级控制系统等。可以这样说?现在的家用电器基本上都采用了单片机控制。从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备等。现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件。现在的通信设备基本上都实现了单片机智能控制。从手机、电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话、集群移动通信、无线电对讲机等。单片机在医用设备中的用途亦相当广泛。例如医用呼吸机?各种分析仪、监护仪、超声诊断设备及病床呼叫系统等等。2设计要求1.课程设计是要完成给定课题的设计任务,根据题目要求进行电路设计,通过调试仿真和硬件调试验证达到课题所要求的各项技术指标。2.通过课程设计掌握单片机系统电路的设计方法,培养分析问题和解决问题的能力。3.掌握proteus仿真软件和KeiluVision编程4.了解单片机接口技术及其工作原理。2.2课程设计的任务与要求2.2.1设计任务用过零检测法,结合单片机技术,对低频弱信号做测频检测,并将估计值输出显示。2.2.2设计要求1.认真分析和领会课程设计题目含意,查阅和运用相关技术资料,提倡独立思考,锻炼动手能力。2.仔细观察实验现象,认真做好实验记录,要准确、规范、独立地完成实验内容,自觉培养严谨求实的科学作风。3.认真完成课程设计论文(应包含电路图、元器件清单、仿真调试及验证结论、设计总结等内容)。2.3课程设计的技术指标3系统硬件设计AT89C51单片机简介AT89C51内部原理图3.151系列单片机内部组成功能图CPU又称微处理器或中央处理器是单片机的核心部件它决定了单片机的主要功能特性程序存储器ROM是只读存储器的简称是一种只能读出事先所存数据的固态半导体存储器用来存放用户程序可分为ROM、OTPROM和FlashROM等随机存储器RAM是随机存储器的简称用来存放运行程序的地址和数据由于可编程并行输入输出I/O口定时计数器定时计数器用于单片机内部精确定时或对外部信号或脉冲计数通常单片机内部有多个定时计数器中断系统时钟电路3.1.2AT89C51管脚功能51系列单片机最常用的是40引脚集成电路芯片,由于单片机是一个芯片,体积较小,为了增其功能,许多引脚具有两个功能,其引脚功能如
正在加载中,请稍后...

我要回帖

更多关于 单片机中断程序 的文章

 

随机推荐