微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手,简单定时器变量问题被卡住了

新手,简单定时器变量问题被卡住了

时间:10-02 整理:3721RD 点击:
/*电子表:以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()写成无参函数后却可以实现秒进,这是怎么回事?百思不得其解,各位大神求教啊

把定时器的时间函数行参改成s,m,h试试。

不对,说错了。是把时间增加函数的行参去了。把里面的s,m,h都改成s1,m1,h1

函数结束后行参自动释放掉的

要不你就把time_add(h1,m1,s1)改为无参数的函数,time_add中的相应变量改为h1,m1,s1。
关于函数传值与传地址的问题先看看这个吧
http://oushangkang.blog.163.com/blog/static/19945179200611316911120/
传值与传地址可以这样理解:
就像我把我写的作文抄了一份给你,你拿去看了之后把有的地方改了,现在我要交作文,而我有一份,所以我直接交了,我交的作文内容并没有变,这就是传值,即值传递。
同理,如果我把我的作文直接给你,你看了后也把有些地方改了,现在我也要交,你只能还给我,我再交,这时我交的就是被你改过的了,这就是传地址,即引用传递。
摘自百度

还是不明白为什么不能这么写啊,是参数传递的问题吗?我知道可以改成无参函数,但那样这个函数就只能用一次了,我程序中还有另一组闹钟时分秒变量要用到这个函数,还得再写一个相同函数,程序会很怪

如果是闹钟的话,那可以在time_add函数中判断时分秒是否到时间了,然后再进行响铃或者别的函数

用指针啊,指针在函数结束之后也不会释放

多谢,总算搞懂了,还真是值传递和引用传递的问题,C语言的盲点啊,总算搞清楚了
时间增加函数定义应该改成time_add(&h,&m,&s);加上&即为地址传递,这样才能真正改变调用此函数的变量值

形参写进去了就读不出来的 除非用指针!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top