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-02 10:18

51单片机边沿触发中断响应时刻的测量
  MCS51单片机系列属于8位单片机,它是Intel公司继MCS48系列的成功设计之后,于1980年推出的产品。由于MCS51系列具有很强的片内功能和指令系统,因而使单片机的应用发生了一个飞跃,这个系列的产品也很快成为世界上第二代的标准控制器。51系列单片机有5个中断源,其中有2个是外部输入中断源INT0和INT1。可由中断控制寄存器TCON的IT1(TCON.2)和IT0(TCON.1)分别控制外部输入中断1和中断0的中断触发方式。若为0,则外部输入中断控制为电平触发方式;若为1,则控制为边沿触发方式。这里是下降沿触发中断。 1 问题的引出   几乎国内所有的单片机资料对单片机边沿触发中断的响应时刻方面的定义都是不明确的或
[测试测量]
<font color='red'>51单片机</font>边沿触发<font color='red'>中断</font>响应时刻的测量
基于51单片机的液晶显示屏LCD1602简单计算器程序
/* S16 S12 S8 S4分别是123+ S15 S11 S7 S3分别是456- S14 S10 S6 S2分别是789* S13 S9 S5 S1分别是0 CE =/ */ /* 实现两个数的运算,每个数的位数至少可以八位 (在液晶显示屏LCD1602上显示) */ #include reg52.h typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P2^5; sbit rs=P2^6; sbit e=P2^7; uint8 key=0,num=0; uint8 fuhao=0; //定义具体的那个符号,是加减
[单片机]
增强型51单片机定时器2与串行通讯应用
  这里我们主要说的是波特率和定时器2的应用.   一般来说,我们串口通讯用到的都是异步串行通讯,工作的方式为方式1.   方式1即为发送一个完整的信号为10个bit.起始信号为低电平,终止信号为高电平,串口通讯的两根线在平常时候都是处于高电平状态,当一旦有数据要进行转发的时候,电平拉低,通讯芯片马上对信号进行监听.这样子就能正常收发数据了.   一般来说,我们都是采用定时器1的模式2(自动重装模式)来作为波特率发生器的,同理,定时器1的中断也就被我们遗弃了,因为为了波特率产生的时候不会受到干扰(如果定时器1有中断函数,那么处理中断函数会关闭定时器1中断,这时候波特率发生器就处于关闭状态了).根据STC给我们的文档,定时器1所具有
[单片机]
51单片机蓝牙点灯程序
适用于:stc15f2k60s2型号单片机(其它型号的51单片机如果想用这个程序,就得修改程序的波特率和某一些的地方才能用) 蓝牙模块:hc-05模块 你用手机给蓝牙发个0,led灯亮,发个1,led灯灭。 单片机源程序如下: #include stc15f2k60s2.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar receiveData; sbit led=P0^0; void UartInit(void) //9600bps@ 11.0592MHz { PCON &
[单片机]
<font color='red'>51单片机</font>蓝牙点灯程序
51单片机输出PWM的两种方法
51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。电路图见图一,采用了高速光隔(6N137)输出,并将PWM的信号倒相。 一、原理图 图一 二、固定脉宽PWM输出 用T0定时器完成PWM输出,脉宽固定:65536微妙。T0定时器设置成:16位定时器 PWM: 程序清单:(12MHz) PwmData0 ;T0定时t1所需的定时初值(字) PwmData1 ;T0定时t2所需的定时初值(字) PwmF ;PWM输出标志 ;***********************************************
[单片机]
<font color='red'>51单片机</font>输出PWM的两种方法
基于ISP 的简约型51单片机实验板的设计
0 引言 现在市面上通用的51内核单片机主要有ATMEL公司的AT89S51、AT89S52系列,飞利浦公司的P89C51RXX系列和P89LPC900系列。其中AT公司的52系列是51系列的增强版本,飞利浦公司的P89C51RXX系列的内部功能跟AT89S51基本相同,都是增强型51内核。通过比较选择飞利浦公司的P89C51RA2BN单片机,该单片机内部有8K的FLASH ROM程序存储器,可以满足大部分的实验和小系统设计。而且该单片机跟AT89S52相比,还有内部PCA(可编程计数器阵列),和512字节的数据存储器,7个中断源和集成内部硬件看门狗。该单片机的引脚和普通51单片机完全兼容,可以做为51单片机的代换产品。另外该型
[单片机]
基于ISP 的简约型<font color='red'>51单片机</font>实验板的设计
8051单片机端口结构—P0口
  8051单片机有四个8位并行I/O端口,记作P0,P1,P2和P3.每个端口都是8位准双向口,共占有32条引脚。每一条I/O线都 可以独立的用作输入或输出。   每个端口都包括锁存器,一个输出驱动器,作输出时数据可以锁存,作输入时数据可以缓冲。在无片外扩展存储器的系统中,这四个端口的每一位都可以作为准双向通用I/O端口使用。   在具有片外扩展存储器系统中,P2口送出高8位地址,P0口为双向总线,分别送出低8位地址和数据输入/输出。8051单片机四个I/O端口的电路设计非常巧妙,熟悉I/O端口逻辑电路,不但有利于正确合理地使用端口,而且会对设计单片机外围逻辑电路有所启发。   P0口的每一位由一个输出锁存器 ,二个三态
[单片机]
80<font color='red'>51单片机</font>端口结构—P0口
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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