刚刚学完计时器兴奋的不得了,那就赶紧写个最常见的计时器压压惊。当上手代码发现自己竟然忘了数码管怎么用的了(狗头),不管了不管了对着原理图一顿操作。en? ,那个那个60进制的时间表示用动态数码管怎么实现呢,是不是要用两个中断,就当我想要寻求大佬的时候我负隅顽抗了一下,从9到0的一个倒计时我总能写出来吧,果真我真的行。
上代码`
# include <reg51.h>
typedef unsigned long u16;
typedef unsigned char u8;
u8 num[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit L1= P2^2;
sbit L2= P2^3;
sbit L3= P2^4;
u16 a=9;
void InitTimer0(void)//1ms
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void shumaguan()
{
L1=0;
L2=0;
L3=0;
P0 = num[a];
}
void main ()
{
InitTimer0();
while(1);
}
void zhongduan () interrupt 1
{
static i=0;
TH0 = 0xFC;
TL0 = 0x18;
i++;
if(i==1000){
i=0;
if(a==0){
while(1);
}
a--;
shumaguan();
}
}
果真啊,男人怎么能不行呢,我看着我的杰作满满自得。但是。。。。。。。。
中断函数就一个他是怎么重复执行的呢???
n hours later:
void InitTimer0(void) 我认为这个玩意不能用c语言中简单的函数来处理,和要结合单片机中的硬件来理解,这个函数启动了单片机中的计数的硬件,就如一个机器人往一个缸里倒水,是什么时候水真的满了,然后就会启动中断,而在中断这呢他又把机器人辛辛苦苦装满的水又给他倒到了一开始的水平,可怜的机器人只能重新来过,然后我们就利用这一个过程不断的循环来计时。
然后呢我就想既然如此那么要while(1);这条语句有什么用呢,我就放心的把它删了,结果小灯不亮了,呵呵我又陷入沉思难不成机器人是在这个while中动的??