2019-07-15 20:54发布
blacksonlgx 发表于 2014-2-17 09:33 不用在main函数里判断计时器溢出的=。= 计时器溢出了,单片机会自动跳到对应计时器中断函数去的。 ...
tangbenchang 发表于 2014-2-15 10:59 shumaguan主要是判断溢出标志位TF0,然后在函数里面对显示函数变量加1,。我就是想用软件查询标志位才没有 ...
tangbenchang 发表于 2014-2-18 10:28 我把shumaguan函数的两个变量都定义为全局变量了,还是不会计数,程序运行起来好像是计数器没有打开的样 ...
最多设置5个标签!
好吧,我对于查询方式的使用方法忘干净了
现在这个程序的问题应该出在shumaguan函数
其中的两个变量(局部变量)的作用域只限于这个函数,每当shumaguan函数运行变量值+1,当退出shumaguan函数时这俩个变量就失效了,当再次进入shumaguan函数时,两个变量用重新被赋值,重复上面的过程,这两个变量永远不会达到你想要的值,最简单的方法是把这两个变量声明为全局变量,即在main函数前声明即可,你声明的count 、a 这两就是全局变量,还可以在shumaguan函数中用static uchar counter = 0声明为静态局部变量
计时器中断,这个我做了,现在主要是想验证软件查询计时溢出标志。
我把shumaguan函数的两个变量都定义为全局变量了,还是不会计数,程序运行起来好像是计数器没有打开的样子,但是如果我打开中断,它就会计数。。
程序在while(1)里面一直重复着数码管函数,而计数是后台运行的,相当于程序一直在执行shumaguan函数,那两个变量定义成局部变量也是可以的吧。
如果你用debug调试会发现,这个子函数的全局变量和局部变量的差别,我已经用你的程序实验过了,只不过我是用LED灯试验的,TF0工作正常
我的程序源码:
#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;
}
请大神看看
一周热门 更多>