单片机定时器,编译后数码管不显示

2019-07-15 20:54发布

本帖最后由 tangbenchang 于 2014-2-14 15:48 编辑

程序如图所示,使用定时器做数码管显示,从0-9。编译成功,仿真的时候数码管不显示,调试发现定时器不工作的样子。烦请各位指点迷津。
QQ图片20140214154748.jpg QQ图片20140214154738.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
me860
1楼-- · 2019-07-16 15:46
本帖最后由 me860 于 2014-2-15 17:59 编辑

好吧,我对于查询方式的使用方法忘干净了
现在这个程序的问题应该出在shumaguan函数
其中的两个变量(局部变量)的作用域只限于这个函数,每当shumaguan函数运行变量值+1,当退出shumaguan函数时这俩个变量就失效了,当再次进入shumaguan函数时,两个变量用重新被赋值,重复上面的过程,这两个变量永远不会达到你想要的值,最简单的方法是把这两个变量声明为全局变量,即在main函数前声明即可,你声明的count 、a 这两就是全局变量,还可以在shumaguan函数中用static uchar counter = 0声明为静态局部变量
blacksonlgx
2楼-- · 2019-07-16 16:52
 精彩回答 2  元偷偷看……
tangbenchang
3楼-- · 2019-07-16 18:12
blacksonlgx 发表于 2014-2-17 09:33
不用在main函数里判断计时器溢出的=。=
计时器溢出了,单片机会自动跳到对应计时器中断函数去的。
...

计时器中断,这个我做了,现在主要是想验证软件查询计时溢出标志。
tangbenchang
4楼-- · 2019-07-17 00:07
tangbenchang 发表于 2014-2-15 10:59
shumaguan主要是判断溢出标志位TF0,然后在函数里面对显示函数变量加1,。我就是想用软件查询标志位才没有 ...

我把shumaguan函数的两个变量都定义为全局变量了,还是不会计数,程序运行起来好像是计数器没有打开的样子,但是如果我打开中断,它就会计数。。
程序在while(1)里面一直重复着数码管函数,而计数是后台运行的,相当于程序一直在执行shumaguan函数,那两个变量定义成局部变量也是可以的吧。
me860
5楼-- · 2019-07-17 03:59
tangbenchang 发表于 2014-2-18 10:28
我把shumaguan函数的两个变量都定义为全局变量了,还是不会计数,程序运行起来好像是计数器没有打开的样 ...

如果你用debug调试会发现,这个子函数的全局变量和局部变量的差别,我已经用你的程序实验过了,只不过我是用LED灯试验的,TF0工作正常
xjtuwm@
6楼-- · 2019-07-17 06:09
我也写了一个程序,可是也是好像不计数,定时器也依次打开关闭,变量也定义为全局变量了,还是不行啊,不计数
我的程序源码:

#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

uint offset=0;
uint count=0;

void init_sys();
void shumaguan();
void display(uint offset);
void timer0();
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
     for(y=110;y>0;y--);
}

sbit dula=P2^5;
sbit wela=P2^6;


uchar code shuma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0X89,0X7F,0XBF};


void main()
{
init_sys();
while(1)
{
  shumaguan();
}

}
void init_sys()
{
dula=0;
wela=0;
TMOD=0x01;
TH0=0x3c;
TL0=0xB0;
TR0=1;
}

void init_timer0()
{
   TH0=0x3c;
   TL0=0xB0;
   TR0=1;
}

void shumaguan()
{
//uint count=0;
  if(TF0==1)
   {
    count++;
        TF0=0;
        TR0=0;
        //TH0=0x3c;
    //TL0=0xB0;
        init_timer0();
        }
        if(count==20)
        {
         count=0;
         display(offset);
        }
}

void display(uint offset)
{
wela=0;
dula=0;
P0=0xdd;
wela=1;
delay(1);
wela=0;
P0=shuma[offset];
dula=1;
delay(1);
dula=0;
}

请大神看看

一周热门 更多>