1.漏洞代码
假如就按上一讲说的书写方式,实现定时50ms间隔的流水灯。
#include #include void main() { LED_Init(); //初始化LED硬件模块 EA = 1; //闭合总中断开关 TMOD = 0x01; //设置定时器0为工作模式1 TH0=( 65536-( (50000*110592)/120000 ) )/256;//设置定时时间为50ms TL0=( 65536-( (50000*110592)/120000 ) )%256; ET0 = 1; //闭合定时器0中断的开关 TR0 = 1; //启动定时器0 while(1); } void TIM0_IRQHandler() interrupt 1 { static u8 i; TH0=( 65536-( (50000*110592)/120000 ) )/256;//重新设置定时时间为50ms TL0=( 65536-( (50000*110592)/120000 ) )%256; P0=~(0x01< i++; if(i>=8)i=0; } 下载进开发板发现根本不是间隔50ms! 进行仿真查看i每次间隔自加所花的时间居然是11ms左右。 2.解析漏洞 首先我们要知道,51单片机能存储最大的一个整型数的大小只有4个字节,也就是最多能记忆这个数到4294967296(2的32次方),而在 “( 65536-( (50000)*110592)/120000 )”中明显不能把“(50000*110592)”给临时存储,因为这个等式的得数已经大过2的32次方。所以我们的定时器才会无法实现准确的50ms定时。如果我们对编程没有一定的积累是很难察觉出这个隐形漏洞的。 解决办法就是,我们的定时最小单位只能是10微秒,也就是定时的时间必须是10微秒的整数倍。书写如下 TH0=( 65536-(5000*110592)/12000 ) )/256; 把之前的“50000”和“120000”都去掉一个零,这样就可以准确的定时50ms了,因为“(5000)*110592)”没有超过2的32次方,读者自行修改本讲提供的代码中的4处之后下载进开发板观察现象是不是又实现50ms的间隔流水了。 3.再次优化书写 上处的5000意为定时的是50ms,也就是5000*10微秒,但我们希望潜意识里假如要定时200微秒,如果写成20我们的思维还要绕个弯再把20默默乘以10才领悟出这是定时200微秒。 倒不如这样,我们看到关键的数字是多少那就是要定时多少微秒。 比如看到关键数字为50000时就知道定时的是50000微秒。 所以我们这样改写:TH0=( 65536-( (50000/10)*110592)/12000 )/256; 这样既保证了“(50000/10)*110592”没有超过2的32次方,也使“50000”更直观的让我们知道要定时的是50000微秒。 但是大家要记住,关键数字必须是10的整数倍,如果想定时个208微秒,“(208/10)”还是等于20,所以定时时间还是200微秒。
上一篇:51单片机-定时器初始化新写法
下一篇:51单片机-代码参考
推荐阅读最新更新时间:2024-11-17 08:13
推荐帖子
- PCB设计原则之接地
- 1地线的共阻抗干扰电路图上的地线表示电路中的零电位,并用作电路中其它各点的公共参考点,在实际电路中由于地线(铜膜线)阻抗的存在,必然会带来共阻抗干扰,因此在布线时,不能将具有地线符号的点随便连接在一起,这可能引起有害的耦合而影响电路的正常工作。 2.如何连接地线通常在一个电子系统中,地线分为系统地、机壳地(屏蔽地)、数字地(逻辑地)和模拟地等几种,在连接地线时应该注意以下几点: 1)正确选择单点接地与多点接地。在低频电路中,信号频率小于1MHz,布线和元件之间的电感可以忽略,
- led2015 PCB设计
- 与2600系列数字源表的程序命令兼容
- 实施新测试设备成本的一个方面包括从现有稳定的软件程序转向支持新产品。当转向2600A系列数字源表时,这方面的成本将大大减少,因为这些仪表与2600系列数字源表的软件程序几乎是100%的命令兼容。下面,介绍一下它们之间的微小差别。Onecostaspectofimplementingnewtestequipmentincludesthecostformigratingexisting,stablesoftwarep
- Jack_ma 测试/测量
- 【Link Node】J-Link调试问题
- 最近在使用LinkNode做项目开发,由于自己一直是使用Keil,对mbed在线编程不是很熟,且不能进行仿真测试,所用打算用keil进行项目开发,在使用过程中发现LinkNode板子本身是带有调试器的,连接电脑能够直接识别为J-Link,所以用来做J-Link调试器应该没有任何问题,但是在我工程环境搭建好后,写了一个简单的led测试程序,在执行下载仿真的时候,J-Link下载失败,具体表现为,一旦调用的J-Link,J-Link设备会丢失,电脑会重新检测到设备连接,多次试验都会出现这个问题,
- wufeijian RF/无线
- am335x裸机调试软件
- 新人请教:刚刚焊接好一块am335x的板子,板上只有串口、网口、USB口,没做其他标准的调试接口,如何与电脑进行第一次通讯啊,使用啥调试软件?am335x裸机调试软件你现在应该想的不是与电脑通讯而是想办法烧个程序进去最起码找个demo程序可以正常运行http://www.ti.com.cn/lsds/ti_zh/...tools_software.pagehttp://m.blog.csdn.net/article/details?id=50701349在这里备注一下
- 1352128849 ARM技术
- 请助,丙烯酸是PCB生产中必需要使用的材料吗?
- 最近在做FPC,厂家说材料里需要用到丙烯酸,请问丙烯酸是PCB生产中必需要使用的材料吗?它的作用是什么?有没有替代品?请助,丙烯酸是PCB生产中必需要使用的材料吗?因为是致癌物质,所以厂家特别找你报备下? 产品里用到,需要知道都有哪些成份不,丙烯酸并不是PCB生产中必需使用的材料,但它在PCB生产中可以发挥多种作用: 工艺准备:用于清洗表面,以便在后续工艺中形成电子组件和PCB之间的紧密结合。 吸附结合:可以将电子元件和PCB板进行紧密结合,增强整体的牢固性。
- Int8 PCB设计
- 【CN0118】利用内置PGA的24位Σ-Δ型ADC AD7191实现精密电子秤设计
- 电路功能与优势本电路为采用AD7191构建的电子秤系统。AD7191是一款引脚可编程、低噪声、低漂移24位Σ-Δ转换器,内置PGA,采用内部时钟。该器件将大多数系统构建模块置于芯片内,因此能够简化电子秤设计。它具有四种输出数据速率和四种增益设置,可利用专用引脚进行选择,这有助于简化与ADC的接口。【CN0118】利用内置PGA的24位Σ-Δ型ADCAD7191实现精密电子秤设计
- EEWORLD社区 ADI参考电路
设计资源 培训 开发板 精华推荐
- 1.23 至 37V DC 至 DC 单路输出电源
- AD5336 并行接口、四路电压输出、10 位 DAC 的典型应用
- OP484ESZ 单电源、3V 低噪声仪表放大器的典型应用
- 一种用于闪光灯相机的 LED 闪光灯 LED 驱动器
- FEBFSL4110LR-CS01U06A-GEVB:6.0 W 辅助电源
- 基于CW32F030C8T6的蔬菜大棚自动控制系统的设计
- 【训练营】智能门锁+982230A
- LTC4085-3/-4 的典型应用 - 具有理想二极管控制器和 3.95V 锂离子充电器的 USB 电源管理器
- C5157209_TXS02612电平转换端口扩展方案验证板
- EEWorld网友国赛经验分享