普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 1915|回复: 2

中断函数内的变量

[复制链接]

1

主题

2

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2020-8-14 14:56:54 | 显示全部楼层 |阅读模式
请教下老司机一个问题,目标是通过定时器中断,实现每隔12个小时控制单片机的一个脚输出高电压,持续20秒后回到低电压。怎么使中断内的变量能在主函数中正常调用?

#include<reg52.h>

#define u8 unsigned char
#define u16 unsigned int

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit CTRL=P1^4;

unsigned char hour,minute,second,alarm;//定义时分秒,闹钟状态位

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

void DigDisplay();
void Init_Timer0();


void delay(u16 i)
{
    while(i--);
}


void main (void)
{
    Init_Timer0();
    while(1)
    {
        DigDisplay();
        if(alarm==1)
        {
           CTRL=1;        //继电器闭合
           delay();       //电机工作20s
           CTRL=0;        //继电器打开
           alarm=0;
        }
    }
}


void Init_Timer0(void)
{
TMOD |= 0x01;    //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响         
//   TH0=0x00;       //给定初值
//   TL0=0x00;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}

void Timer0_isr(void) interrupt 1
{
static unsigned int num,i;
TH0=(65536-2000)/256;//重新赋值 2ms
TL0=(65536-2000)%256;

// DigDisplay();     // 调用数码管扫描
i++;
if(i==10)            //20ms更新一次
    {
    i=0;
    }
num++;
if(num==500)        //大致1s
   {
    num=0;
    second++;
    if(second==60)       //秒到60,分钟加1
     {
      second=0;   
      minute++;
      if(minute==60)    //分钟到60,小时加1
        {
         minute=0;
         hour++;
         if(hour==12)       //小时到12,回零
           hour=0;
           alarm=1;          //达到12小时激活闹钟
        }
     }

  }
}


回复

使用道具 举报

1

主题

2

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2020-8-14 16:03:15 | 显示全部楼层
自己答复自己了,变量要分清静态/动态,全局/局部
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-20 17:43 , Processed in 0.093947 second(s), 33 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表