10年前学习单片机记得是从AT89C51开始的,回想起那时候做遥控器解码等很多东西用到它,用到TR1,很多接触单片机的人我想对这个语句非常的收悉,TR1 = 1; 或 SETB TR1 .这是当年用Keil编译器的语句,10年后的我改变了对Keil的看法,觉得它太肆无忌惮了,虽然很方便,语句也很简洁,可是我感觉计算机语言不应该那么随意,应该规范化,这样才容易移植.自从我接触AVR单片机,一直用的是IAR编译器,自从IAR编译器后,我才知道什么才是计算机语言.比如刚才那句TR1 = 1; 应该这样写TCON_bit.TR1 = 1;至少在IAR中是这么约定的,TCON_bit代表一个结构,TR1是它的一个成员,这样更容易理解而且如果移植到其他平台上,TR1发生冲突的几率至少会少很多以下是我回到8051写的timer1
程序,它设定了一个时间,MCU_OSC在宏里已经定义,它指定了MCU的工作频率,MCU_SPEED指定了MCU的工作速度,STC有两种模式6T和12T,nReship_timer1是一个全局变量,它指定了timer1的重装值,在timer1的中断函数里重新装载到TR1里.我准备再做一个音频指示灯,10年前的作品现在重新做一次,我手头还有很多STC12C2052AD,让他们发挥出当年的色彩.
/*********** 设定定时器1为定时器 ***********************/
bool set_timer1_us(unsigned long time)
{
float scale = 1000000.0 / MCU_OSC * MCU_SPEED;// 计算分辨率(us)
if(scale * 0xFFFF < time)
{
err0 = 1;// 标记错误
err1 = 0;
return false;
}
TMOD_bit.M01 = 1;
TMOD_bit.M11 = 0;// 设置为16位定时器模式
nReship_timer1 = 0x10000 - (unsigned int)(time / scale);//计算重装载值
IE_bit.ET1 = 1;// 打开定时器1中断
TCON_bit.TR1 = 1;// 打开定时器1
return true;
}
|