单片机定时器中断改变全局变量
/*电子表:以24小时计时方式工作,使用定时器,每秒数码管显示进1*/#include<reg52.h>//52单片机头文件#include<math.h>#define...
/*电子表:以24小时计时方式工作,使用定时器,每秒数码管显示进1*/
#include<reg52.h> //52单片机头文件
#include<math.h>
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit dula=P2^6; //数码管段选锁存端
sbit wela=P2^7; //数码管位选锁存端
uchar h1,m1,s1; //时分秒全局变量
uchar tt; //定时器0进入中断的次数
uchar code table[]={ //数码管共阴极段选显示码0~F
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init();
void time_add(uchar,uchar,uchar); //时间增加
void display(uchar,uchar,uchar); //显示时分秒
void delay(uint);
void main()
{
init(); //初始化
while(1)
{
display(h1,m1,s1);
}
}
void init()
{
tt=0;
h1=0;
m1=0;
s1=0;
TMOD=0x01; //使用定时器0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void dingshi0() interrupt 1 //定时器0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
time_add(h1,m1,s1); //问题:为什么h1,m1,s1变量的值始终没有变化??
}
}
void time_add(uchar h,uchar m,uchar s) //时间增加程序(以秒为单位)
{
s++; //秒数+1
if(s==60) //计满60秒分位进1
{
s=0; //秒位清0
m++;
if(m==60) //计满60分时位进1
{
m=0;
h++;
if(h==24) //计满24小时时位清0
{
h=0;
}
}
}
}
(数码管dispaly()和延时函数略去)
问题叙述:数码管显示一直是0时0分0秒,不秒进,也就是说时分秒全局变量h1,m1,s1的值始终没有变化。
可是如果把时间增加函数time_add()写成无参函数后却可以实现秒进,这是怎么回事?百思不得其解,各位大神求教啊(写的详细清楚些,分不是问题) 展开
#include<reg52.h> //52单片机头文件
#include<math.h>
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit dula=P2^6; //数码管段选锁存端
sbit wela=P2^7; //数码管位选锁存端
uchar h1,m1,s1; //时分秒全局变量
uchar tt; //定时器0进入中断的次数
uchar code table[]={ //数码管共阴极段选显示码0~F
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init();
void time_add(uchar,uchar,uchar); //时间增加
void display(uchar,uchar,uchar); //显示时分秒
void delay(uint);
void main()
{
init(); //初始化
while(1)
{
display(h1,m1,s1);
}
}
void init()
{
tt=0;
h1=0;
m1=0;
s1=0;
TMOD=0x01; //使用定时器0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void dingshi0() interrupt 1 //定时器0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
time_add(h1,m1,s1); //问题:为什么h1,m1,s1变量的值始终没有变化??
}
}
void time_add(uchar h,uchar m,uchar s) //时间增加程序(以秒为单位)
{
s++; //秒数+1
if(s==60) //计满60秒分位进1
{
s=0; //秒位清0
m++;
if(m==60) //计满60分时位进1
{
m=0;
h++;
if(h==24) //计满24小时时位清0
{
h=0;
}
}
}
}
(数码管dispaly()和延时函数略去)
问题叙述:数码管显示一直是0时0分0秒,不秒进,也就是说时分秒全局变量h1,m1,s1的值始终没有变化。
可是如果把时间增加函数time_add()写成无参函数后却可以实现秒进,这是怎么回事?百思不得其解,各位大神求教啊(写的详细清楚些,分不是问题) 展开
展开全部
int h1,m1,s1; //时分秒全局变量
int tt; //定时器0进入中断的次数
void main()
{
init(); //初始化
while(1)
{
display(h1,m1,s1);
}
}
void dingshi0() interrupt 1 //定时器0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
s1++; //秒数+1
if(s1==60){ s1=0; m1++;}//计满60秒分位进1,秒位清0
if(m1==60){ m1=0; h1++; }//计满60分时位进1
if(h1==24){ h1=0; }//计满24小时时位清0
}
}
在中断内,你可以直接写成这样
只用全局变量更方便
再有,你苦恼的问题是因为函数每次调用的时候
都是以0为数据传递的,错误在串口初始化部分以及你调用函数的时候
你的变量S,没有全局变量声明,切也没有局部变量声明
所以每次调用函数的时候,S都是以0开始,最多加到1,之后又从0开始递增
int tt; //定时器0进入中断的次数
void main()
{
init(); //初始化
while(1)
{
display(h1,m1,s1);
}
}
void dingshi0() interrupt 1 //定时器0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
s1++; //秒数+1
if(s1==60){ s1=0; m1++;}//计满60秒分位进1,秒位清0
if(m1==60){ m1=0; h1++; }//计满60分时位进1
if(h1==24){ h1=0; }//计满24小时时位清0
}
}
在中断内,你可以直接写成这样
只用全局变量更方便
再有,你苦恼的问题是因为函数每次调用的时候
都是以0为数据传递的,错误在串口初始化部分以及你调用函数的时候
你的变量S,没有全局变量声明,切也没有局部变量声明
所以每次调用函数的时候,S都是以0开始,最多加到1,之后又从0开始递增
追问
知道怎么改,但还是不明白为什么不能这样写啊
h1,m1,s1是定义全局变量啊,为什么不能作为参数调用呢?改成无参函数倒是可以
追答
void main()
{
init();//初始化后,h1,m1,s1变量的值为0
while(1)
{
display(h1,m1,s1);//
}
}
void dingshi0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
time_add(h1,m1,s1);//此处三个变量都是0,传给函数
}
}
void time_add(uchar h,uchar m,uchar s)//此函数接收后,将变量名换成了局部变量 h,m,s
{
s++;
if(s==60)//下面这些语句,只是判断和改变局部变量 h,m,s
{ //跟全局变量 h1,m1,s1没任何关系
s=0;//所以你的显示部分,始终显示的是 00,00,00
m++;
if(m==60)
{
m=0;
h++;
if(h==24)
{
h=0;
}
}
}
}
这回明白了吧!!!!!!!!!!!!!!!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询