51单片机-隐形漏洞

发布者:VelvetDreamer最新更新时间: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单片机-代码参考

推荐阅读最新更新时间:2024-11-17 08:13

以80C51单片机为例讲述单片机如何运行
前言 要想理解单片机是如何运行程序的,首先需要了解单片机的组成。本文以80C51单片机为例,给大家讲一讲程序在单片机中是如何运行的。 单片机的组成 8051单片机的内部硬件结构包括: 中央处理器CPU:它是单片机内部的核心部件,决定了单片机的主要功能特性,由运算器和控制器两大部分组成。 存储器:8051单片机在系统结构上采用了哈佛型,将程序和数据分别存放在两个存储器内,一个称为程序存储器,另一个为数据存储器在物理结构上分程序存储器和数据存储器,有四个物理上相互独立的存储空间,即片内ROM和片外ROM,片内RAM和片外RAM。 定时器/计数器(T/C):8051单片机内有两个16位的定时器/计数器,每个T/C既可以设置成计数方式
[单片机]
以80C<font color='red'>51单片机</font>为例讲述单片机如何运行
如何用51单片机点亮一个发光二极管
这是每个学51单片机的人都会做的一个实验,而且应该是第一个实验。它是如此的简单、通俗,本来没什么好讲的,但是想到了一些东西,可以放在一起说说,先上图: 这是某实验板上LED部分的原理图,进行LED实验的时候要把J1接上,不然VCC是无法给LED供电的。RP1是一个排阻,我们常见的电阻都是一个一个单独的,而排阻是8个电阻并在一起,这8个电阻有一段是公用的。这个图里面,就把公用端接了VCC。 然后是电阻值102,这里指的不是说电阻值只有102欧姆,而是10*102,也就是1000欧姆。该电阻的主要功能是限制电流,那么流过电阻的电流是多大? 假设VCC为5V,发光二极管的压降是1.7V,那么就有3.3V的电压在电阻上,根据欧姆
[单片机]
如何用<font color='red'>51单片机</font>点亮一个发光二极管
oled显示温度报警的51单片机程序
温度报警限制上下值 由oled显示 制作出来的实物图如下: 单片机源程序如下: #include #include oled.h #define uchar unsigned char #define uint unsigned int unsigned char set=0; unsigned char code table = 0123456789 ; uchar shi,bai,ge,xiaoshu; sbit DSPORT=P3^7; sbit k1=P2^7; sbit k2=P2^6; sbit k3=P3^2; bit N_flag; int shangxian=22; int xiaxian=10;
[单片机]
oled显示温度报警的<font color='red'>51单片机</font>程序
基于51单片机的温度采集系统(Labview做上位机)
做该设计的初衷是为自己的毕设打基础,因为我的毕设要做一个探测机器人,需要对某一地区的各种环境参数进行检测,然后通过WIFI返回到上位机。所以为了搞懂温度传感器以及练习上位机的设计,花了几天时间做了一个很简单的采集系统。今天把它拿出来跟各位小伙伴们分享,希望对各位有所帮助,同时也希望大佬们指出不足,起到一个相互学习,相互促进的作用。该系统原理是:51单片机把ds18b20传感器将采集到的温度值(十六进制)通过串口发送到labview,labview对单片机发来的数据做简单的处理然后显示。 上位机界面 上位机(接受程序) 简单的硬件连接 数据纪录 串口部分: void main() {
[单片机]
基于<font color='red'>51单片机</font>的温度采集系统(Labview做上位机)
AT89S51单片机的详细资料介绍
很多初学51单片机的网友会有这样的问题:AT89S51是什么 书上和网络教程上可都是8051,89C51等!没听说过有89S51 ! 这里,初学者要澄清单片机实际使用方面的一个产品概念,MCS-51单片机是美国INTE公司于1980年推出的产品,典型产品有 8031(内部没有程序存储器,实际使用方面已经被市场淘汰),8051(芯片采用HMOS,功耗是630mW,是89C51的5倍,实际使用方面已经被市场淘汰)和8751等通用产品,一直到现在, MCS-51内核系列兼容的单片机仍是应用的主流产品(比如目前流行的89S51,已经停产的89C51等),各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。 有
[单片机]
51单片机STC89C52】IO口模拟PWM控制SG90舵机
一、PWM PWM ,英文名 Pulse Width Modulation ,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进 行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通 过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的 时间占据整个信号周期的百分比,例如方波的占空比就是50%. 占空比 : 一个周期内,高电平占据时长的百分比 STC89C52没有集成PWM功能,可以通过IO口软件模拟,相对硬件PWM来说精准度略差 二、关于舵机控制原理 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的
[单片机]
【<font color='red'>51单片机</font>STC89C52】IO口模拟PWM控制SG90舵机
51单片机PID算法程序(三)增量式PID控制算法
当执行机构需要的不是控制量的绝对值,而是控制量的增量(例如去驱动步进电动机)时,需要用PID的 增量算法 。 增量式PID控制算法可以通过(2-4)式推导出。由(2-4)可以得到控制器的第k-1个采样时刻的输出值为: (2-5) 将(2-4)与(2-5)相减并整理,就可以得到增量式PID控制算法公式为: (2-6) 其中 由(2-6)可以看出,如果计算机控制系统采用恒定的采样周期T,一旦确定A、B、C,只要使用前后三次测量的偏差值,就可以由(2-6)求出控制量。 增量式PID控制算法与位置式PID算法(2-4)相比,计算量小得多,因此在实际中得到广泛的应用。
[单片机]
<font color='red'>51单片机</font>PID算法程序(三)增量式PID控制算法
51单片机串口通信中字符发送的总结
菜鸟我今天在练习51单片机串口通信时,对字符的发送方式总结了一下,有以下三种方式,若有大侠看到请勿见笑。 /*字符发送方式一*/ #include reg52.h #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table ="I get "; void init() { TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; SM0=0; SM1=1; REN=1; //TI=1; EA=1; ES=1; } void main() {
[单片机]

推荐帖子

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参考电路
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved