历史上的今天
返回首页

历史上的今天

今天是: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。


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


推荐阅读

史海拾趣

Aptos Technology公司的发展小趣事

为了加速发展,Aptos积极寻求与行业内外的合作伙伴建立合作关系。通过与微软、阿里云等知名公司的合作,Aptos获得了更多的技术支持和市场资源。这些合作伙伴关系的建立,不仅提升了Aptos的技术实力和市场竞争力,还为其未来的发展奠定了坚实的基础。

Crane Co.公司的发展小趣事

在1870年代,Crane Co.在制造业改善方面争当先驱。公司引入了由R. T. Crane发明的多用途机器,以及移动模具和浇铸金属的传送系统。这些创新技术不仅提高了生产效率,还标志着铸造领域流水线生产的开端。这一时期的变革为Crane Co.在电子行业的发展奠定了技术基础。

CT [ Central Technologies ]公司的发展小趣事

近年来,电子行业经历了多次技术变革和产业重组。面对这些变革,CT公司积极调整战略方向,加大在人工智能、物联网等新兴领域的研发投入。同时,公司还推出了一系列创新产品和服务,以满足市场的新需求。这些举措使得CT公司在行业变革中保持了领先地位,实现了持续稳健的发展。

Central Semiconductor公司的发展小趣事

在电子行业中,产品的更新换代速度极快,许多产品可能会因为技术更新或市场需求变化而停产。然而,Central Semiconductor却看到了其中的商机。公司根据客户需求,继续生产其他厂商已经停产的终老产品,以确保产品的持续供应和生命周期的延长。

这种对停产产品的支持不仅避免了客户因重新设计而带来的昂贵成本和时间消耗,也展现了Central对客户需求的深入理解和满足能力。这种服务模式不仅为Central赢得了客户的忠诚和信赖,也为公司在行业中树立了良好的口碑。

FTDI公司的发展小趣事

Central Semiconductor一直致力于创新分立元器件的研发和生产。公司凭借其深厚的技术积累和市场洞察力,成功开发出一系列具有节省空间、电气规格灵活等特点的创新产品。这些产品不仅满足了客户对高性能、高可靠性的需求,也为Central在竞争激烈的市场中赢得了良好的声誉。

此外,Central还注重根据客户的特殊需求进行定制开发。无论是筛选电气规格、特殊晶圆扩散还是开发定制元器件,Central都能迅速响应并提供满足客户需求的解决方案。这种以客户为中心的服务理念也为Central赢得了众多客户的信任和合作。

功得(CONQUER)公司的发展小趣事

在市场竞争日益激烈的环境下,功得公司意识到仅仅依靠创新是不够的,还需要有高品质的产品来赢得客户的信任。因此,公司开始注重产品质量管理,建立了完善的质量控制体系。功得公司严格把控原材料采购、生产工艺和成品检验等环节,确保每一件产品都符合高标准的质量要求。这种对品质的执着追求,使得功得公司的产品在市场上赢得了良好的口碑,品牌知名度也逐渐提升。

问答坊 | AI 解惑

4-20mA 电流环路隔离器(ISO 4-20mA)

4-20mA 电流环路隔离器(ISO 4-20mA)低成本、小体积,两线制4-20mA电流环路隔离 IC说 明: ISO 4-20mA电流环隔离芯片是单片两线制隔离接口芯片,该IC内部包含有电流信号调制解调电路、信号耦合隔离变换电路等。很小的输入等效电阻,使该IC的输入电 ...…

查看全部问答>

资料——c8051f02x

c8051f02x 中文资料…

查看全部问答>

基于DSP TMS320F2812 测量温度的系统设计问题求教?

各位兄弟,大家好,请问谁做过用TMS320F2812做过PT100测温方面的设计,可否知道采用什么样的恒流源会是电路设计的好一些,分辨率,精度和A/D的关系怎么确定,如果将PT100的分度表烧写到其FLASH里,如何进行。系统搭建我自己老掉链子,而且结构也不 ...…

查看全部问答>

Windows mobile6.1 对应aku是什么型号?

之前有问过相关的问题,但是没能确定,这次再问问! 我得到的bsp包是windows mobile6.1, 我开发环境装了vs2005+sp1 是不是还要装 1、WM6.1 professional SDK 2、WM6.1 Standard SDK 3、AKU a、我要开发的是驱动及应用,AKU是干什么用的? ...…

查看全部问答>

用汇编语言实现以下功能(结合硬件)

直流电动机位置测量与控制系统的设计         设计内容:掌握直流电动机控制系统的硬件设计方法,利用DVCC-DJ4电机控制机电一体实验仪上的硬件电路,通过机械机构将直流电机的角位移转换为直线位移,利用电位器和A/D转换器, ...…

查看全部问答>

嵌入式开发后易出现的问题与解决

在电子消费盛行的今天,很多产品都因为苦心开发的产品被人拷贝,大量出产而把原产品代替。太多人苦于这些。其实我原来也是这个受害者,想到自己的产品被人抄了,自己无能为力,市场证明一切,不是自己说那是假的就有人信,我曾想过改行,后来我想到 ...…

查看全部问答>

2812手册上SPI的范例问题

2812CPU与外设手册中文版(张卫宁编译)514页上有一个SPI数据传输范例,设定的是每字符5个位。原文如下: A.        从设备向SPIDAT写入0D0H,等待主设备移出数据。 B.        主设备将从设备的~SPISTE ...…

查看全部问答>

Linux 红帽的系统,添加中文字库

        大家帮忙看一下,在系统里面英文是可以支持的,中午汉字不 支持,求高人指点一下!…

查看全部问答>

DSP烧录到Flash中去了,仿真可运行,拔掉仿真器,开电重启不能运行

DSP烧录到Flash中去了,仿真可运行,不掉电拔掉仿真器可运行,但是断电重启,不能运行,这时候只要把仿真器(connect)连接起来,程式运行。求解???????????????…

查看全部问答>

TIVA C Launchpad第二周的心得---GPIO

学习目标: 使能PF3为输出端口,通过延时使得Green LED 闪烁。 首先将Luanchpad板上的ICDI的USB端口到电脑,打开电源开关。 然后打开CCS5.5,通过Project--->Import CCS EclipseProjects 导入已经安装好的TivaWare中的examples, C:\\ti\\TivaWa ...…

查看全部问答>