51单片机-微调定时精确时间

发布者:GoldenEclipse最新更新时间:2021-10-14 来源: eefocus关键字:51单片机  微调  定时  精确时间 手机看文章 扫描二维码
随时随地手机看文章

1.定时器&蜂鸣器

一般定时器中断函数里的内容最好是能够快速地去执行完,比如只执行几条简单的语句,这样与主函数配合才会使程序更加高效。前期教学里,我们只使用定时器中断负责某个IO引脚间隔跳变或者使一个变量间隔自加1的简单语句。


比如我们现在要实现间隔50ms左右的时间让流水灯左右循环移动的同时,还需要无源蜂鸣器一直响,这样的功能,思路该怎么去思考?


首先我们知道无源蜂鸣器要想鸣叫的比较尖锐,那P1.6需要一个合适的脉冲信号,这个信号笔者打算使P1.6高低电平保持的时间为300微秒不断循环。


所以我们用定时器中断实现P1.6的电平间隔跳变,主函数里负责完成流水灯的任务即可。

8.8A.png


2.代码

#include  

#include //详见第六章第8讲

 

u8 T0RH, T0RL;

void TIM0_Init(u32 us,int trim)//trim:微调

{

    u32 tmp;                       //临时变量

     

    tmp = 11059200 / 12;           //定时器计数频率

    tmp = ( tmp * (us/100) )/10000;//计算所需的计数值

    tmp = 65536 - tmp;             //计算定时器重载值

    tmp = tmp+trim;                //补偿中断响应延时造成的误差

    T0RH = (unsigned char)(tmp>>8);//定时器重载值拆分为高低字节  

    T0RL = (unsigned char)tmp;

    TMOD &= 0xF0; //清0低四位 

    TMOD |= 0x01; //设置定时器0为工作模式1   

    TH0 = T0RH;   //加载T0重载值   

    TL0 = T0RL;

    ET0 = 1;      //闭合定时器0中断的开关        

    TR0 = 1;      //启动定时器0         

 

void main()

{  

    u8 i,dir;

    LED_Init();       //初始化LED硬件模块

    EA = 1;           //闭合总中断开关

    TIM0_Init(300,0); //用定时器0定时300us,不微调

    while(1)

    {

        if(i<8)dir=0;//向左移

        if(dir==0)P0=~(0x01< 

        if(i>=8)dir=1;//向右移 

        if(dir==1)P0=~( 0x80>>(i-7) );//当i大于等于8之后,(i-7)其实也还是在1~7之间变化

 

        i++;

        if(i>=15)i=1;//让i一直在1~14之间变化

        delay_ms(50);

    }

}

 

void TIM0_IRQHandler() interrupt 1

{

    TH0 = T0RH;   //重新加载重载值

    TL0 = T0RL;

    BEEP=!BEEP;

}


可以看到使用定时器中断比外部中断触发还要高效。


3.讲解微调


然后回到上一讲说过的怎么测试然后去微调使定时时间更精确。


拿我们这讲的代码来说,首先在不微调的情况下,也就是传入的参数trim为0,看看定时的时间是多少。


进入软件调试模式,在“BEEP=! BEEP;”设置断点,在没有微调之前观察每次执行“BEEP =! BEEP;”的间隔时间。


8.10.png


按下RST复位之后,先按两次RUN

8.11.png


再按一次RUN


8.12.png


定时时间为0.003285-0.002979= 0.000306s

所以定时时间超了6微秒,则需要给trim一个合适的参数,这里笔者调出了最合适的数为6,所以我们初始化定时器时改为

TIM0_Init(300,6); //用定时器0定时300us,6是微调使定时时间更精确

这样每次跳转到中断函数去执行的间隔时间就为精确的300us了。


当我们要定时十毫秒或者二三十毫秒时,微调的数可能就不是6了,而是20之间或者其他数,所以每次想要精确定时就需要软件调试亲自测试。


关键字:51单片机  微调  定时  精确时间 引用地址:51单片机-微调定时精确时间

上一篇:51单片机-代码参考
下一篇:51单片机-单独文件封装

推荐阅读最新更新时间:2024-11-12 10:20

简易定时电子催眠器电路图
制作与使用 本电路晶体管采用硅三极管,BG1、BG2的B小于100,BG3、BG4的B小于30即可用。电容要求漏电流小,否则会缩短定时时间。AN为小型按钮,可以自制或者用小型开关代用。CZ1门铃按钮插孔,CZ2为耳机插孔。 找一块40*25毫米的敷铜板,按图12.8.2用小刀刻印刷电路板,然后将元件直接焊在铜箔一面。整机可装在袖珍收音
[模拟电子]
简易<font color='red'>定时</font>电子催眠器电路图
定时器准确定时八位时钟
/* 定时器准确定时八位时钟 */ #include reg51.h #include stdio.h #define uchar unsigned char #define uint unsigned int uchar code duanca ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; uchar code weica = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; int i,j,z; sbit LED = P1^0; uint hour = 23,minute = 59,second = 50,t50ms =
[单片机]
<font color='red'>定时</font>器准确<font color='red'>定时</font>八位时钟
STM32定时器应用笔记
众所周知,STM32的定时器功能非常庞大复杂,应用也非常普遍。目前STM32家族已有10条产品线,其中都内置多个定时器外设。尽管STM32各系列的定时器无论从数目上还是特性上可能略有差异,但它们整体上还是具有一些公共特性与相同的操作模式。 ST官方有一篇针对STM32通用定时器的应用笔记,编号为AN4776,内容较为详尽丰富。该笔记主要对STM32通用定时器的基本特性、操作模式及相关应用做了细致清晰的描述。既有对基本概念的详细讲解,又有相关实际应用的原理介绍,同时还配有相关应用的参考工程代码。该笔记值得一读。 这里简单介绍下AN4776应用笔记的基本内容框架。 该笔记主要分两部分。第一部分主要是对STM3
[单片机]
STM32<font color='red'>定时</font>器应用笔记
MCS-51单片机驱动步进电机的程序设计
  1.实验设计 定时器1于方式1,16位,10ms中断一次 40H 10ms计数单元 41H 秒计数单元 42H 分计数单元 43H 时计数单元 定时方式1为10MS:THX=0ECH,TLX=78H 方式0为10MS: THX=63H,TLX=18H 步进电机驱动实验 定时中断程序 正转后反转,显示计数值 步进电机按三相六拍的工作方式运动 X轴 C B A P1.2 P1.1 P1.0 用键盘上方的发光二极管(3FH)对应指示: D2 D1 D0 正转:A-AB-B-BC-C-CA-A 反转:A-CA-C-BC-B-
[单片机]
STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置
本块代码实现了定时器定时触发ADC,多通道采样,并通过DMA进行数据传输到内存的操作。 #include adc.h view plain copy #define DMA_BUFFER_SIZE 6 uint8 sample_finish = 0; int16 adc_dma_tab = { 0 }; uint8 sample_index = 0; //采样点数据 int16 sample_1 = { 0 }; int16 sample_2 = { 0 }; int16 sample_3 = { 0 }; int16 sample_4 = { 0 }; int16 sample_5 = { 0
[单片机]
STM32如何使用定时器实现微秒(us)级延时?
在STM32微控制器中,可以使用定时器实现微秒级延时。具体来说,可以使用定时器的计数器和自动重装载寄存器来生成精确的延时。 以下将详细介绍如何使用定时器实现微秒级延时的步骤: 步骤 1:配置定时器 首先,需要选择一个适合的定时器。大多数STM32微控制器都配备了多个定时器,因此,可以根据需求选择一个可用的定时器。一般来说,TIM2和TIM3定时器是常用的,具备较高的精度和可编程性。 接下来,需要进行定时器的基本配置,包括时钟源、计数模式、分频系数等。可以根据具体需求,选择合适的配置参数。通常情况下,可以选择内部时钟源作为定时器的时钟源,并将分频系数设置为最小,以获得最高的精度。 步骤 2:设置计数周期 接下来,需要设置定时器的计数
[单片机]
利用AT89S51单片机的T0、T1的定时计数器功能
利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。 1. 电路原理图 2. 系统板上硬件连线 (1). 把“单片机系统”区域中的P0.0-P0.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。 (2). 把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。 (3). 把“单片机系统”区域中的P3.4(T0)端子用导线连接到“频率产生器”区域中的WAVE端子上。 3. 程序设
[单片机]
51单片机控制P2口8位LED灯左移C语言程序
此 程序控制 P2.0~P2.7口8个LED(P2.0~P2.7)灯逐个依次点这,又从(P2.7~P2.0)这样的顺序一直到全部被点亮。 #include reg52.h //头文件 void delay(unsigned int x)//延时函数 { while(x--); } void main(void) { unsigned char i;//定义一个无符号字型局部变量i取值范围0~255 delay(50000); P2=0xfe; for(i=0;i 8;i++)//加入for循环,表明for循环大括号中程序循环执行8次 { delay(50000);//调用延时函数,更
[单片机]

推荐帖子

ddk编译dll
请问,怎么用ddk编译dll文件,封装一定功能的函数给程序使用啊。ddk编译dlldefineinyoursourcesfileTARGETTYPE=DYNLINKlz要干嘛?
ljz1023 嵌入式系统
linux内核完全剖析-基于0.12的
这里分享一下赵炯博士的经典书籍:linux内核完全剖析-基于0.12的,其实这本书是0.11的,只是它是修订版,也到0.12了,但是却比0.12的书少很多页,看起来心里没压力呀,呵呵。由于本人是新来的,资源很少,币值也少的可怜,所以这本书就索要一个币值,争取在此处生活下去。希望富人支持。假如有新人也是白手起家,没事,可以联系我,免费赠送。邮箱为:ubuntu2020@163.comlinux内核完全剖析-基于0.12的支持楼主谢谢啦值得学习学习不客气,对你有用就好回复沙发f
wzlong2012 Linux与安卓
招聘嵌入式硬件开发高级工程师
工作地点:深圳做过嵌入式硬件开发2年以上重点大学电子,通信,计算机等相关专业待遇优厚!!!有意者请投简历至:helen.xw@163.com咨询请加MSN:netfall49@hotmail.comQQ:690236961招聘嵌入式硬件开发高级工程师重点大学电子很牛吗?青铜剑等级:发表于:2007-12-0609:49:161楼得分:0重点大学电子很牛吗?-----------------------------------------顶
mjj19680827 嵌入式系统
求一wince6.0的应用程序,供测试用
谁有在wince6.0上写的像小游戏,或者文本等可以下载到模拟器上作测试用的小程序,我不需要原代码,只要编译后的.exe文件即可。先谢谢了!求一wince6.0的应用程序,供测试用急用,自己先顶一下只要是程序都可以吗?引用2楼rattlerattle的回复:只要是程序都可以吗? 恩,只要在wince6的模拟器上可以跑,可测试的功能点尽量多点,但不要太难,给一小孩做功能测试用的例子大家帮帮忙啊引用4楼xmjmengmeng的回复:大家帮帮忙啊 自己动手吧
baandmaandme WindowsCE
PT4121恒流控制器的应用
按照经典电路焊接板子为什么发挥不了片子恒流控制的功能?与DS上给的公式计算不符,采样电阻有什么要求?但是可以PWM控制,请问怎么解决?PT4121恒流控制器的应用PT4121的采样电阻是由芯片的最大电流决定,因此这个采样电阻有功率要求。实际上这个采样就是设定最大输出电流,实际PCB设计时,为可调电流的方便,一般可以设计2个电阻并联方式这个电阻靠近Vin和CSN脚,还有二极管要用肖特基,电感要用功率电感。采样电阻有阻值要求吗?因为我不需要太大电流,所以我用2欧采样电阻有影响吗?电阻是
天际超体 LED专区
这里我发现对串口的问题特别多,大家看看我的一点经验
//rs422overUSART1#includemsp430x14x.h#includefoshan.h//P3.6UTXD1//P3.7URXD1charfe_wt={\'1\',\'D\',\'F\',\'F\',\'E\',\'5\',\'0\',\'1\',\'2\',\'3\',\'0\',13};ucharfe_rd={\'1\',\'D\',\'E\',\'F\',\'E\',\'5\',\'2\',13};ucharflag=0
shenyong 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved