51单片机-静态变量

发布者:温馨小筑最新更新时间:2021-08-19 关键字:51单片机  静态变量  中断函数 手机看文章 扫描二维码
随时随地手机看文章

1.static

static一般不用在主函数中,大多数在中断函数和封装好的子函数里运用,它的作用是保证在子函数或中断函数中定义的变量每次调用完之后都可以保持调用完时候的值,《手把手教你学51单片机》文档7.2节有这个知识点的讲解,不过我们还是用代码来解释这个static的作用吧。

 

2.举例

我们要实现像第四章第2讲的实验现象让数码管0从0到F循环显示。本次我们用的是函数封装,代码如下

#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

  

unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化

 

void delay_ms(unsigned int x)

{

    unsigned int i,j;

    if(x==1000)

    {

        for(i=0;i<19601;i++)//延时1s

        {

            for(j=5;j>0;j--);

        }

    }

    else while(x--)for(j=115;j>0;j--);

}

  

void SEG0_task()

{

    unsigned char i=0;

    P0=LedChar[i];

    i++;

    if(i>=16)i=0; //让i在0~15之间变化

}

  

void main()

{  

    ADDR3 = 1;//使能三八译码器

    ENLED = 0;// 

   

    ADDR2 = 0;//**************************

    ADDR1 = 0;//只让数码管0显示

    ADDR0 = 0;//**************************

   

    while(1)

    {

        SEG0_task();

        delay_ms(1000);//延时1s

    } 

}


我们看到的是数码管0一直显示0,这是因为主函数的死循环里每次调用“SEG0_task()”时开头i的值都被初始化为0了,虽然第一次调用完这个函数时,已经执行过“i++;”,但是第二次调用该函数时i又被初始化为0了,导致永远执行的是“P0= LedChar[0];”

而我们只要在SEG0_task()函数中加上static的关键字去定义i,就可以使i成为局部静态变量,从而实现变量在函数调用结束之后仍然保持着当前的值,第二次调用该函数时不会被再次初始化为0。

代码修改如下

static unsigned char i=0;


这样就可以实现我们想要的实验现象了。

 

3.回归按键

按键的执行任务也可以封装为函数,同样需要static去定义key_up,因为它需要跟着KEY4变化,而不是每次都被初始化为同一个值。

代码如下


#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

  

sbit LED2  = P0^0;

sbit KEY4  = P2^7;

 

void delay_ms(unsigned int x)

{

    unsigned int i,j;

    if(x==1000)

    {

        for(i=0;i<19601;i++)//延时1s

        {

            for(j=5;j>0;j--);

        }

    }

    else while(x--)for(j=115;j>0;j--);

}

  

void KEY_task()

{

    static unsigned char key_up=1;

    if(key_up==0)

    {      

        if(KEY4==1)//不支持连按

        {

            LED2 = !LED2;

        }

    }

    key_up=KEY4;   //如果不松手,key_up就会等于0 

}

  

void main()

{  

    ADDR3 = 1;//使能三八译码器

    ENLED = 0;// 

   

    ADDR2 = 1;//************

    ADDR1 = 1;//只让小灯显示

    ADDR0 = 0;//************

    P2 = 0xF7;//让K4能具备有被拉低的条件先

     

    while(1)

    {

        KEY_task(); //按键功能任务

        delay_ms(2);//假设这部分是要执行的其他程序

    } 

}


关键字:51单片机  静态变量  中断函数 引用地址:51单片机-静态变量

上一篇:51单片机-不支持连按
下一篇:51单片机-支持连按与全局变量

推荐阅读最新更新时间:2024-11-17 12:37

用8051单片机设计倒计时牌
;************* 电子定时器的设计******************; ;*MCU: AT892051 ; ;*MCU-crystal: 12M ; ;*Version: 01 ; ;*Last Updata: 2009-5-4 ; ;*Author: HaiZhiZi ; ;*Description: ; ;定时器T0、T1溢出周期为50MS,T0为秒计数用 ; ;S2为功能键、S3为方式选择键 ; ;P1口为字符输出口,采用共阳显示管 ; ;P3.2~P3.5为位选,P1.7为报警发音,P3.7为被控继电器 ; ;****************************************
[单片机]
LCD液晶显示的51单片机简单计算器
概述 LCD液晶显示的51单片机简单计算器可实现完成了两个范围在0到255的数加、减、乘、除运算,其中减法可显示负数,除法只保留整数并由LCD液晶显示。并在实验室实验箱,实现上述功能。完成该任务需要熟悉和了解控制LCD液晶屏的显示的方法,矩阵键盘读取按键值的方法、89C51系列单片机的相关知识、C51编程和数字电子技术的相关知识。 完整代码:https://download.csdn.net/download/weixin_43786907/16524021。 方案 我使用实验室试验箱的2×8矩阵键盘作为的16个按键作为输入分别为0到9、“+”、“-”、“*”、“/”、“=”与复位,由单片机计算并通过LCD显示。 矩阵键盘
[单片机]
LCD液晶显示的<font color='red'>51单片机</font>简单计算器
以89C51单片机为核心器件的自动控制系统编码译码显示实验电路设计
引 言 在日常数字逻辑电路实验中编码译码显示实验电路是编码、译码、显示三个电路的综合运用, 在数字逻辑实验电路中具有重要的地位, 在实验的过程中, 时常会出现显示结果的抖动, 经研究出现这种现象主要原因是:编码电路的编码信号输入采用手工拨盘方式, 产生的编码输入信号往往不稳定; 另外, 电路控制性能较差,不能达到自动复位, 为此有必要对现有电路进行改进,在电路的设计上采用89C51 单片机为控制电路制作而成, 自动提供稳定编码输入信号, 显示结果稳定性和电路控制性能大大提升, 提高了教学实验质量。 1 编码译码显示实验电路的基本结构 编码译码显示电路的基本结构如图1 所示, 主要由控制电路、编码信号发生器、编码译码显示电路等组
[单片机]
以89C<font color='red'>51单片机</font>为核心器件的自动控制系统编码译码显示实验电路设计
51单片机测量PWM脉冲宽度LCD1602显示当前PWM占空比频率
此程序通过两个定时器一个外部中断,测量PWM高电平时间以及周期,计算并在1602显示出占空比 周期 高电平时间,只需让脉冲在P3^2口输入即能测得数据。。 单片机源程序如下: #include reg52.h #include LCD1602.h typedef unsigned char uint8; typedef unsigned int uint16;//数据类型重定义 uint8 count = 0; //计进入外部中断次数 bit flag = 1; //捕获结束标志位 long Pwm_All; //PWM的周期 long Pwm_High; //PWM的高电平时间 占空比=Pwm_Hi
[单片机]
几种常用51单片机的I/O口驱动能力分析
在 控制 系统中,经常用 单片机 的I/O口 驱动 其他 电路 。几种常用 单片机 I/O口 驱动 能力在相关的资料中的说法是:GMS97C2051、AT89C2051的P1、P3的口线分别具有 10mA、20mA的输出驱动能力,AT89C51的P0、P1、P2、P3的口线具有10mA的输出驱动能力。在实际应用中,仅有这些资料是远远不够的。笔者通过实验测出了上述几种单片机的I/O口线的伏安特性(图1、图2),从中可以得到这些I/O口的实际驱动能力。 说明:1、测试方法:所测试的口线输出的信号是周期为4秒的方波。当测试口线为低电平时的驱动能力时,该口线通过 电阻 箱接+5V 电源 ,测出该口线对地的电压,从而计算出通过 电阻 的
[模拟电子]
如何使用8051单片机在7段显示器上显示数字?
在使用 单片机开发 项目的时候,经常会使用到7段显示器。7段显示器可以显示字母和数字,它内部是其实是发光 LED 灯,通过控制不同的 接口 点亮内部LED灯,从而显示出数字。目前,它在许多 电子产品 中用于显示 信息 ,比如:充电宝、直发器等。 7段显示器由8个LED构成,这些LED以顺序方式连接,以方便在打开某些LED组合时显示0到9的数字。点亮时,它一次只显示一位数字。 使用80 51单片机 在7段显示器上显示数字的原理图: 在7段显示器上显示从“0到F”的数字的程序是: #include reg51.h sbit a= P3^0; sbit x= P3^1; sbit y= P3^2; sbit z= P3
[单片机]
如何使用80<font color='red'>51单片机</font>在7段显示器上显示数字?
8051单片机教程第十六课:计数器与定时器
一、计数概念的引入 从选票的统计谈起:画“正”。这就是计数,生活中计数的例子处处可见。例:录音机上的计数器、家里面用的电度表、汽车上的里程表等等,再举一个工业生产中的例子,线缆行业在电线生产出来之后要计米,也就是测量长度,怎么测法呢?用尺量?不现实,太长不说,要一边做一边量呢,怎么办呢?行业中有很巧妙的方法,用一个周长是1米的轮子,将电缆绕在上面一周,由线带轮转,这样轮转一周不就是线长1米嘛,所以只要记下轮转了多少圈,就可以知道走过的线有多长了。 二、计数器的容量从一个生活中的例子看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水滴不断落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。录音机上的计数器最多只
[单片机]
51单片机读写优盘
51单片机读写U盘,一个前辈们都玩剩下的东东了,暑假在家没事干,大学嘛没有暑假作业的,呵呵。故索性也来玩玩如何用51单片机读写U盘,听着名 字真的感觉这么个东东有什么用呢,市场也没有,创新更不提了,但是我想告诫学习单片机的朋友们,由于国内的形式看来,我们只有一步一步的来,玩别人剩下的 东东来提高自己,硬件改一下,程序优化一下都是改进或者可以说是改良吧,要脚踏实地,不要想着直接开发一个多么有前景的项目之类的空想了! 一个系统的学习能让你提高不少,按照硬件开发的基本流程来,这样学习采系统,每一个阶段都需要做一个这样的项目,才能逐渐提高自己的独立开发水品!看一张效果图先吧这是protel的3D效果图: iframe id="iframe
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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