历史上的今天
今天是:2024年08月24日(星期六)
2021年08月24日 | 51单片机-代码参考
2021-08-24 来源:eefocus
前面的篇章我们都是在普及知识,真正使用好定时器还是需要重新拟定新的书写方案的,我们参考了宋老师的书写方式,在他的代码基础上我们进行小修改成就实用的工程代码。
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单片机-隐形漏洞
下一篇:51单片机-微调定时精确时间
史海拾趣
|
4-20mA 电流环路隔离器(ISO 4-20mA)低成本、小体积,两线制4-20mA电流环路隔离 IC说 明: ISO 4-20mA电流环隔离芯片是单片两线制隔离接口芯片,该IC内部包含有电流信号调制解调电路、信号耦合隔离变换电路等。很小的输入等效电阻,使该IC的输入电 ...… 查看全部问答> |
|
基于DSP TMS320F2812 测量温度的系统设计问题求教? 各位兄弟,大家好,请问谁做过用TMS320F2812做过PT100测温方面的设计,可否知道采用什么样的恒流源会是电路设计的好一些,分辨率,精度和A/D的关系怎么确定,如果将PT100的分度表烧写到其FLASH里,如何进行。系统搭建我自己老掉链子,而且结构也不 ...… 查看全部问答> |
|
之前有问过相关的问题,但是没能确定,这次再问问! 我得到的bsp包是windows mobile6.1, 我开发环境装了vs2005+sp1 是不是还要装 1、WM6.1 professional SDK 2、WM6.1 Standard SDK 3、AKU a、我要开发的是驱动及应用,AKU是干什么用的? ...… 查看全部问答> |
|
直流电动机位置测量与控制系统的设计 设计内容:掌握直流电动机控制系统的硬件设计方法,利用DVCC-DJ4电机控制机电一体实验仪上的硬件电路,通过机械机构将直流电机的角位移转换为直线位移,利用电位器和A/D转换器, ...… 查看全部问答> |
|
在电子消费盛行的今天,很多产品都因为苦心开发的产品被人拷贝,大量出产而把原产品代替。太多人苦于这些。其实我原来也是这个受害者,想到自己的产品被人抄了,自己无能为力,市场证明一切,不是自己说那是假的就有人信,我曾想过改行,后来我想到 ...… 查看全部问答> |
|
2812CPU与外设手册中文版(张卫宁编译)514页上有一个SPI数据传输范例,设定的是每字符5个位。原文如下: A. 从设备向SPIDAT写入0D0H,等待主设备移出数据。 B. 主设备将从设备的~SPISTE ...… 查看全部问答> |
|
DSP烧录到Flash中去了,仿真可运行,拔掉仿真器,开电重启不能运行 DSP烧录到Flash中去了,仿真可运行,不掉电拔掉仿真器可运行,但是断电重启,不能运行,这时候只要把仿真器(connect)连接起来,程式运行。求解???????????????… 查看全部问答> |
|
学习目标: 使能PF3为输出端口,通过延时使得Green LED 闪烁。 首先将Luanchpad板上的ICDI的USB端口到电脑,打开电源开关。 然后打开CCS5.5,通过Project--->Import CCS EclipseProjects 导入已经安装好的TivaWare中的examples, C:\\ti\\TivaWa ...… 查看全部问答> |




