2009_0316 – 使用定时/计时器

这一次的程序写得实在太久了,整整两个星期!其实硬件原理很简单,只是C语言不过关,进度被拖慢了。

首先说说定时器/计数器。其实这就是单片机里专门的一块特殊功能寄存器,说白了,就是一个八位或更高位的能够自动加1的“RAM”,而从0加到2的8次方(八位的慢值)中间所经过的时间,就是计时时间了,这就有点像日本电玩机里那个用手一摇就会在四个滚筒上分别出现0到9这十个数的玩具一样~这就是我对计时器最直观的认识,当然原理绝对不会那么简单,不过我们能知道怎么用就够了。

关于TMOD TCON以及低八位和高八位的设置过几天用到更复杂的形式时再说。

今天用最简单的计时器0的工作方式0,让P1口第一个LED在计数时间之后改变亮灭的状态。亮灭之间的时间用计时器来处理,也就是从初始到溢出的时间,这之后跳转到中断程序,让P1的0口状态翻转

//compose a very easy program using timer_0 as a delay
/*
How to initialize a timer
step1. TMOD
setp2. TH0,TL0
step3. EA = 1,ET0 =1
step4. TCON, TR0 = 1
step5. when TF0 overflows,go to interupt
*/

#include<reg52.h>
sbit P1_0 = P1^0;       //reg52.h文件中只对P1口八个端口全部做了定义,现在单独用第一个口就要单独再声明一次

main()
{
    TMOD = 0x01;
    TH0 = 0x01; TL0 = 0x01;
    EA = 1; ET0 = 1;
    TR0 = 1;

    while(1);
}

void change(void) interrupt 1
{
    P1_0 = !P1_0;
    TH0 = 0x01; TL0 = 0x01;
}

这个程序最精彩的地方就是while(1); 这里运用一个永远无法再跳到下一步去的循环来使程序不断跳到中断程序中。
烧入程序后的效果如下:

  http://www.tudou.com/v/IIaXgA3ZYb8

Leave a comment