51单片机-代码参考

最新更新时间:1970-01-01来源: eefocus关键字:51单片机  定时器  计数频率 手机看文章 扫描二维码
随时随地手机看文章

前面的篇章我们都是在普及知识,真正使用好定时器还是需要重新拟定新的书写方案的,我们参考了宋老师的书写方式,在他的代码基础上我们进行小修改成就实用的工程代码。


1.代码解析


void ConfigTimer0(unsigned int ms)

{

    unsigned long tmp;              //临时变量

     

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

    tmp = (tmp * ms) / 1000;        //计算所需的计数值

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

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

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

    T0RL = (unsigned char)tmp;

    TMOD &= 0xF0;                   //清零T0的控制位

    TMOD |= 0x01;                   //配置T0为模式1

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

    TL0 = T0RL;

    ET0 = 1;                        //使能T0中断

    TR0 = 1;                        //启动T0

}


我们先一句句分析宋老师为何是这样一步步书写,首先我们知道,定时器的寄存器计数,每加1计数就是经过(12/11059200)秒。那么计数了11059200次就是经过12秒了。经过1秒计数就是(11059200/12)=921600。这样我们就明白了第一条语句的意思。


那么我们想定时1ms,需要的计数就是(921600/1000)=921.6,需要定时xms就是需要计数921.6x。


如果我们想定时5ms,那么需要的计数值就是921.6*5=4608


填充给TH0和TL0的初始值就是


TH0=(65536-4608)/256


TL0=(65536-4608)%256


当然也可以这样表达,两种书写方式的功能作用都一样


TH0= (unsigned char)(65536-4608)>>8;


TL0= (unsigned char)(65536-4608);


T0RH,T0RL是两个全局变量,为的是在中断函数中可以重新赋初值给寄存器TH0和TL0。


由于中断函数的执行有时需要消耗不同的时间,所以定时时间会有误差导致进入中断函数时会产生与设想时的时间不同,所以需要调整计数值,也就是上面代码中的tmp需要微调节成一个合适的数,上面是固定加了13这个数,但是有时需要灵活改变这个微调值,所以我们改为传入不同的参数来改变这个微调值。


2.我们的代码


我们知道宋老师的代码定时的最小单位为1ms,下一章由于我们要学舵机,需要定时的最小单位是0.1ms,所以我们的代码定时的最小单位必须是0.1ms,也就是100us。看到我们的代码


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         

}


要想定时2ms,传入的参数就是2000,我们的参数是us数,如果传入的是2000,第二条语句就是“(tmp*2)/1000”,与宋老师的代码原理一样。不过需要记住的是我们不能定时小于100us的时间,最低单位只能是100us。


下一讲我们讲解学会如何微调定时时间。


关键字:51单片机  定时器  计数频率 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic545703.html

上一篇:51单片机-隐形漏洞
下一篇:51单片机-微调定时精确时间

推荐阅读

基于51单片机的交通灯设计
一.硬件方案本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示。按键可以控制禁行、深夜模式、复位、东西通行、南北通行、时间加、时间减、切换等功能。共四个二位阴极数码管,东南西北各一个显示时间,四个数码管的阴极都接到STC89C51的P1口,阳极接到74HC245芯片上,通过P0口控制74HC245芯片,起到驱动放大作用。主要硬件:51单片机+最小系统+数码管显示模块+LED指示灯模块+按键模块;二.设计功能(1)本设计采用四方向数码管显示时间的设计,更加符合真实的交通信号灯设计;(2)7个按键:复位、夜间模式、紧急模式、设定时间、时间加、时间减、调试确定键;(3)夜间模式:按下“夜间模式
发表于 2021-10-15
基于<font color='red'>51单片机</font>的交通灯设计
基于51单片机的电子万年历设计
硬件方案随着生活和工作的繁忙,人们在获知时间的同时,对于与人们生活和工作息息相关的信息也不可缺少,比如:温度,日期等;多功能电子时钟的诞生,很好解决了这一问题,它在显示时间的同时,又显示了温度、日期、时间等诸多功能于一身。硬件主要由51单片机+最小系统+LCD液晶显示电路+DS1302时钟电路+蜂鸣器提示音电路+DS18B20温度采集电路+按键电路;二.设计功能(1)本采用STC89C51/52RC(与AT89S51/52、AT89C51/52通用)单片机作为主控制器;(2)时钟芯片采用DS1302,温度传感器采用DS18B20;(3)有一组闹钟和阴历显示功能,有闰年补偿,可以准确及正确的显示时间等信息。(4)可以显示年、月、日
发表于 2021-10-15
基于<font color='red'>51单片机</font>的电子万年历设计
基于51单片机的共阳篮球计分器设计
一.硬件方案本设计采用51单片机作为核心元件,利用两个供阴的三位一体数码管来显示两队的分数,一个四位一体数码管显示时间的计时。显示分数范围可达0~999分,足够赛程计分的需要。四位一体数码管中2个用于显示分钟,2个用于显示秒钟。比赛前,将时间设置好,比赛开始时启动计时,直至倒计时到零为止。计时范围达到0~99分钟,能满足实际赛程计时的需要。为了配合计时器调整时间和计分器校正比分,设计了6个按键,4个用于输入甲、乙两队的分数,另2个用于启动和暂停赛程时间。另外,还设计了定时报警系统,即比赛时间到时,扬声器发出报警声提示赛程结束。硬件主要为:STC89C52单片机+最小系统+数码管显示模块+数码管驱动模块+蜂鸣器模块+按键模块
发表于 2021-10-15
基于<font color='red'>51单片机</font>的共阳篮球计分器设计
基于51单片机的金属探测仪
一.硬件方案本设计的金属探测是根据电磁感应原理制成的,将一金属置于变化的磁场当中时,根据电磁感应原理就会在金属内部产生涡流,涡流产生的磁场反过来又影响原磁场,这种变化可以转换为频率和幅值的变化,供相关电路进行检测。硬件主要组成:51单片机+LM393+LCD1602液晶+电感线圈+ 按键+蜂鸣器;二.设计功能(1)实现金属物质的探测,如硬币,钥匙,金属手机壳等,LED和蜂鸣器实现声光报警。(2)按键设置探测金属的精度,掉电记忆。(3)液晶显示测量值,方便记录和更改。(4)结构简洁,稳固,高效。三.设计原理图(1)原理图主要采用AD软件进行设计,如图:(2)Protues仿真图如下:四.软件设计(1)程序流程图(2)主程序源码
发表于 2021-10-15
基于<font color='red'>51单片机</font>的金属探测仪
基于51单片机的温控风扇-数码管显示-风扇人体感应
一.硬件方案系统采用51单片机作为控制平台对风扇转速进行控制。可由用户设置高、低温度值,测得温度值在高低温度之间时打开风扇弱风档,当温度升高超过所设定的温度时自动切换到大风档,当温度小于所设定的温度时自动关闭风扇。风扇控制状态随外界温度而定,并通过PWM的方式控制风扇的转速。主要由51单片机+最小系统+数码管显示模块+数码管驱动模块+温度采集模块+人体感应模块+风扇模块+按键模块等构成:二.设计功能(1)采用DS18B20温度传感器测温,三级管驱动数码管显示温度和风扇的档位,人体感应模块检测是否有人。(2)共3个按键:1设置、2键加、3键减。按一下设置可以设置上限值,再按下设置下限,均可以按键加减调整;(3)利用PWM调速,当温度
发表于 2021-10-15
基于<font color='red'>51单片机</font>的温控风扇-数码管显示-风扇人体感应
基于51单片机的红外计数器-1602显示
一.硬件方案本设计的主要原理为:红外发射管发射红外线,红外接收管接收红外线,并且接收管当有红外线照射的时候,电阻比较小,当无线外线照射的时候电阻比较大,这样就可以通过一个电压比较器和一个基准电压进行对比,当有光照的时候,红外接收管电阻比较小,那么和其串联的电压分压就会增大,所以电压比较器将会输出一高电平;当无光照射的时候,红外接收管的电阻比较大,这样电压比较器就会输出一个低电平。这个便是外部计数电平信号,这个电平信号送入AT89C51单片机进行计数控制,在经过扩展、显示驱动完成最后的显示过程。硬件主要由:STC89C52单片机最小系统、LCD1602显示屏显示、红外避障传感器、按键、蜂鸣器及电源组成;二.设计功能(1)按键从左边
发表于 2021-10-15
基于<font color='red'>51单片机</font>的红外计数器-1602显示

推荐帖子

三目立体视觉外极线校正及其FPGA实现方法
三目立体视觉外极线校正及其FPGA实现方法
至芯科技FPGA大牛 FPGA/CPLD
各位大虾,有用过IA4421无线收发芯片吗?我有个困绕了我一周的问题,急需大家帮助,先谢了
我的问题就是IA4421我可以给它正确的写入控制字,但是我发送的数据接收不到,哎,郁闷呀,如果你用过,请加我的MSN:shuifengdaoshang@hotmail.com,我会将我的原理图和PCB图,还有我写的程序都发给你。希望你能帮我解决。。各位大虾,有用过IA4421无线收发芯片吗?我有个困绕了我一周的问题,急需大家帮助,先谢了
zhao123ou 嵌入式系统
altium designer winter09
我画板一直都是使用PROTEL99SE软件,是AD09的初学者,想尽快上手.现在有很多客户都发现AD09的PCB和SCH过来,想学习AD09,有试过很多功能和PROTEL99SE是一样的,还是有大部分是不会操作的,求高人指点,或帮忙提供AD09的学习资料,谢谢!altiumdesignerwinter09
zttian PCB设计
【R7F0C809】+软件篇尾声
除了心率模块以及EEPROM,软件部分做到现在已基本趋近尾声。因此,本文主要探讨这两部分的驱动实现。首先,为了保证心率信号的准确采集,我利用逻辑分析仪看了心率信号的大概波形,当然了,肯定没有示波器看的真实,但也足够帮我找到信号的频率。 硬件连接图如下:逻辑分析仪抓到的波形图如下: 由上图可以看出心率信号输出频率大约为1-1.4Hz,换算为一分钟的波形则为60-84。对于成年人来说,正常心率范围在50-110/min,在剧烈运动时这个数值还会更高些。这个心率波形产生的原理是这样的,心率信号经过
人民币的幻想 瑞萨电子MCU
MSP430x13x, MSP430F14x, MSP430F15x, MSP430F16x 示例代码
附件中是TI发布的MSP430x13x,MSP430F14x,MSP430F15x,MSP430F16x示例代码,代码为目前TI更新的最新代码,为了方便下载,我会开贴将各个系列的代码相继整合出来。MSP430x13x,MSP430F14x,MSP430F15x,MSP430F16x示例代码
wstt 微控制器 MCU
兄弟们用过ObReferenceObjectByName吗?
在ntddk.h里怎么找不到这个函数啊,但我看好多程序都调用这个函数了兄弟们用过ObReferenceObjectByName吗?
benf 嵌入式系统
小广播
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved