51单片机-隐形漏洞

最新更新时间:2021-10-14来源: eefocus关键字:51单片机  流水灯 手机看文章 扫描二维码
随时随地手机看文章

1.漏洞代码


假如就按上一讲说的书写方式,实现定时50ms间隔的流水灯。


#include  

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

 

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左右。

8.5.png

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单片机-隐形漏洞

上一篇:51单片机-定时器初始化新写法
下一篇:51单片机-代码参考

推荐阅读

51单片机知识重点汇总一,学单片机必须要了解的知识。
主要性能:  与MCS-51单片机产品兼容 、8K字节在系统可编程Flash存储器、 1000次擦写周期、全静态操作:0Hz~33Hz 、三级加密程序存储器 、 32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、 低功耗空闲和掉电模式 、掉电后中断可唤醒 、看门狗定时器 、双数据指针、掉电标识符 。一、STC89C51单片机外部引脚简介电源及时钟引脚:Vcc(40脚)、GND(20脚)、XTAL1(19脚)、XTAL2(18脚)。Vcc、GND——单片机电源引脚,不同的型号单片机接入对应电压电源,常压为+5V,低压为+3.3V。XTAL1、XTAL2——外接时钟引脚。XTAL1为片内震荡电路的输入端
发表于 2022-11-17
单片机led灯闪烁实验总结_玩转51单片机(1):点亮led灯
01新建工程与点亮LED小灯,LED小灯即发光二极管,它具有单向导电性,对于发光二极管而言,需要根据它的压降与额定电流来选择合适的限流电阻,打开Keil4软件,选择Project,New uVision Project选定工程的保存路径,并给工程命名,保存类型默认.uvproj,点击保存出现如下对话框,点击下拉按钮,选择STC MCU Database,点击OK选择STC89C52RC,点击OK选择否点击New,生成一个Text1文件点击 File, Save, 出现如下对话框,将文件命名为后缀为.c的文件,默认保存类型,点击保存点击Target 1前面的加号,在Source Group 1上右击,选择Add Files to Gr
发表于 2022-11-14
单片机led灯闪烁实验总结_玩转<font color='red'>51单片机</font>(1):点亮led灯
51单片机】1602自定义字符原理及示例(”汉“、爱心及摄氏度示例)
原理设置1602屏幕的对比度的时候我们能够看到5*8的点阵,其实液晶显示的都是字符的字模(下图),而CGROM里面都是已经定义好的,只能读不能写,而RAM是可以读写的所以我们只要将我们自定义的字符字模写入对应的CGRAM中就好,CGRAM一共有8个对应的地址分别为(0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78),因为每个字模对应8行所以每写完一个字模以后要加8,按照指令写入CGRAM时需要加0x40所以对应地址就如上了,然而其实CGRAM的实际地址是0x00-0x07所以在后面写入数据的时候需要按照实际地址来写入。CGROM中的字模也是同样的原理 字模代码:1602显示模式为5*7点阵型,字模代码
发表于 2022-11-12
【<font color='red'>51单片机</font>】1602自定义字符原理及示例(”汉“、爱心及摄氏度示例)
51单片机】1602 CGRAM、CGROM及DDRAM的作用
CGRAM : 允许用户自建字模区的空间。从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位无效,4-7全为零(表上的高位)。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000X111,X为无效位,最后三位为000-111共8个。CGROM : 字模存储用空间。你要显示某个ASCII字符时,要显示字符的字模就存在这里。DDRAM : 显示用RAM。直接和屏幕上的点相对应。屏幕上的一个点和DDRAM中的一个位对应。1
发表于 2022-11-12
【<font color='red'>51单片机</font>】1602 CGRAM、CGROM及DDRAM的作用
51单片机】 数据管显示HELLO
软件准备+硬件准备软件:1.Keil软件v6.12(与书中版本保持一致方便学习,如果喜欢别的版本也可以下载别的)2. STC-ISP(将十六进制代码写到单片机上)硬件:TX-1C(书本推荐,并非本人广告)【学习单片机,你起码得有块单片机的板子吧…也不一定是自己的,借别人的也可以】HELLO.程序#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //申明U1锁存器的锁存端sbit wela=P2^7; //申明U2锁存器的锁存端void delayms(u
发表于 2022-11-12
【<font color='red'>51单片机</font>】 数据管显示HELLO
51单片机】数据管的消影问题
数码管的消影未消影代码#include<reg52.h>sbit wela=P2^7; //位选sbit dula=P2^6; //段选void main(){ while(1) { //一直显示 dula=1; P0=0x06; //显示1 dula=0; wela=1; P0=0xfe; //选择第一个数码管 wela=0; } }运行结果原因第一个数码管的1显示较亮但是同时伴随着另外较弱一点段位的显示,可以看出是下面位选的影响(0xfe),然后几个未选择的数码管亮了,可以看出是前面段选带来的影响(0x06->对应位
发表于 2022-11-12
【<font color='red'>51单片机</font>】数据管的消影问题

推荐帖子

再来一本老书
发书了,呵呵,继续第二本!希望对大家有所帮助!再来一本老书
Sonix 模拟电子
AVR(mega8)电子时钟
刚学习AVR单片机,网上搜集资料,制作的一个电子时钟,时间可调,呵呵。AVR(mega8)电子时钟
lhp8203 Microchip MCU
如何分辨LED灯的质量?笨方法
我网上查led灯的价格 发现差别很大 有几分一个灯的,也有0.4~0.5元一个的 请问如何分辨le算同样规格参数的LED,不同厂家价格不一样都很正常,LED的价格在于用什么品牌的发光芯片,好的芯片成本肯定要高了 LED的质量主要是看用的芯片和生产工艺,用眼睛是看不出来区别的,要用老化设备和检测设备 如果你把几个厂家的LED放在老化仪上用大电流老化24小时或者更长时间,你再去测量几个厂家的LED亮度,看那个led发光强度衰减最小,衰减最小那个质量就最好 如果没有测量设备,简单点的方法,
探路者 LED专区
揭秘魅族全新PRO 6 Plus的ADI芯片
以下内容转自ADI中文社区:https://ezchina.analog.com/thread/14789 魅族全新旗舰机PRO6Plus在北京发布,突出的配置和性能惊艳全场!关注过发布会的小伙伴们都发现了,现场爆出音频部分采用的一款定制芯片——ADI高速运放AD45275,该产品结合了低功耗、低噪声、高速度和直流精度性能,采用ADI公司第三代超快速互补双极性(XFCB)工艺制造,使得PRO6Plus在低功耗下也能有出色的音质表现。 关注该芯片的小伙伴们肯定都搜过了吧,
新人不新 模拟电子
【米尔MYS-8MMX】米尔MYS-8MMQ6-8E2D-180-C开箱报告一——直观感受
对一块开发板,特别是之前没用过的板子进行评测,首先是看做工,如果布板乱七八糟,飞线到处都是,或者芯片布放有的挤有的松,那是一看就没兴趣了,关于这一点,米尔一直做得不错;其次是看资料,资料全,写得细,就有兴趣专研,在http://down.myir-tech.com/MYS-8MMX/上资料不错,分类为文档、镜像、工具、源码等,除了包太大,网站下载速度只有100k(到现在还没全部下完)以外,暂时没啥可以诟病的。初略看了一下“MYS-8MMX产品手册V1.0”,比我之前拿
tobot 嵌入式系统
单片机ADC的采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样...
单片机ADC的采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样的信号频率和速率? 单片机ADC的采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样...
QWE4562009 测试/测量
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

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