#include "reg52.h"
void Timer0Init(void) //10毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
sbit led = P3^6;
void main()
{
int cnt =0;
led = 1;
//1配置定时器0工作模式位16位计时
TMOD = 0x01;
//2给初值,定出10ms来
TL0 = 0x00;
TH0 = 0xDC;
//3开始计时
TR0 = 1;
TF0 =0;
while(1){
if(TF0 ==1) // 当爆表时,硬件自动修改bit2(TF0)上面的数据,改成1
{
TF0 = 0;// 不用中断的时候要用然间清零
cnt++;// 统计报表的次数
TL0 = 0x00;// 因为爆表了所以要重新配置定时器
TH0= 0xDC; //
if(cnt == 100) // 当报表100次,就经过了1s
{
cnt = 0; // 每经过100 次就是1s,重新让cnt 从0 开始,计算下一个1s
led = !led; // 每经过1s 反转LED的状态
}
}
}
在配置定时器的时候 直接用TMOD = 0x01; 会破坏到定时器1 的状态
为了避免影响到定时器1 所以要用按位运算。
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
按位与 运算 (&) 当两个对应的数据都是1 的时候 结果为1
TMOD &= 0xF0; //设置定时器模式 这一步的目的是把低四位变成0,高四位不变
按位或运算(|) 两个数据有1 结果为1,其他结果为0
TMOD |= 0x01; //设置定时器模式 这一操作保持高四位不变,将低四位变为01,这就配置好定时器了
清零用与 置1 用或
所以 在配置寄存器的时候推荐用按位操作,清零的时候,对应需要清零的位与上0,不需要清零的位与上1。
置1 的时候,需要置1的位上 或上1,不需要置1 的位 或上0