单片机定时器,编译后数码管不显示
程序如图所示,使用定时器做数码管显示,从0-9。编译成功,仿真的时候数码管不显示,调试发现定时器不工作的样子。烦请各位指点迷津。
![](../imgqa/ele/mcu/mcu-3721rd.com-38411o2olmn4e0qi.jpg)
![](../imgqa/ele/mcu/mcu-3721rd.com-38412cpfb3ynfyiw.jpg)
这是所有的程序么,没发现 void XXXX()interrupt 1中断函数,主的主程序里应让 EA=1 ET0=1 打开中断开关,装载TH0 TL0应在中断函数里填写
好像不是这样写的吧。main函数里应该是初始化函数+显示函数。显示函数里的内容就只有推动数码管显示变量对应的数字。另外有一个中断函数,中断函数里面的内容是中断复位和更改数码管显示变量。
1.没有中断函数,如果shumaguan()是中断函数的话,应该有中断号,其次主函数while中不用调用中断函数。
2.总中断EA T0中断ET0 都没有打开
3.不明白小编为什么中断使硬件自动清零
TF1:定时器1溢出标志位。当定时器1计满溢出时,由硬件使TF1置“1”,并且申请中断。进入中断服务程序后,由硬件自动清“0”,在查询方式下用软件清“0”。
不想用中断去加1,主要是用通过if(TF0==1)判断溢出标志位再重装处置,然后软件清标志位。
我的思路是,初始化函数里面是定时器初始化,主函数一开始调用初始化函数进行系统初始化,while主循环调用shumaguan函数,通过if判断定时器溢出标志TF0,如果溢出,软件清零并重装初值。
shumaguan主要是判断溢出标志位TF0,然后在函数里面对显示函数变量加1,。我就是想用软件查询标志位才没有开中断的。
好吧,我对于查询方式的使用方法忘干净了
现在这个程序的问题应该出在shumaguan函数
其中的两个变量(局部变量)的作用域只限于这个函数,每当shumaguan函数运行变量值+1,当退出shumaguan函数时这俩个变量就失效了,当再次进入shumaguan函数时,两个变量用重新被赋值,重复上面的过程,这两个变量永远不会达到你想要的值,最简单的方法是把这两个变量声明为全局变量,即在main函数前声明即可,你声明的count 、a 这两就是全局变量,还可以在shumaguan函数中用static uchar counter = 0声明为静态局部变量
不用在main函数里判断计时器溢出的=。=
计时器溢出了,单片机会自动跳到对应计时器中断函数去的。
计时器中断,这个我做了,现在主要是想验证软件查询计时溢出标志。
我把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;
}
请大神看看
只在数码管上指定位显示了0
P0=shuma[offset]; //你的shuma[offset]中,offset没有操作,当然没有变化了,参照小编写的那个显示函数就行
#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);你的计数时间到了,变量offset没有加1,它的初始值是零,显示的肯定是零。
}
}
void display(uint offset)
{
wela=0;
dula=0;
P0=0xdd;
wela=1;
delay(1);
wela=0;
P0=shuma[offset];这里的变量offset时间到了没加1,初始值是0显示肯定是0
dula=1;
delay(1);
dula=0;
}
糊涂糊涂了,忘了++了,明天试一下也不知道行不行
对的对的,忘了++
把实验结果告诉大家一下,我怎么调都弄不了软件查询