先说机器周期,最近玩51单片机,发现里面有强大的内部时钟,下载的居然可以随意修改,很骚。比以前的51确实好玩多了。
感觉现在用51做东西完全不比32差了,还不知道性能怎么样。不好意思跑题了。这里先想一个问题,如果我改变了频率,程序中的
延时函数,或者定时器,串口这些频率都变了,需要自己重新算才行。
51单片机的一个机器周期等于12个振荡周期,振荡周期其实就是晶振的周期。所以51单片机的机器周期=freq/12
如果此时单片机晶振频率为24M。那么机器周期就是24/12=2M,所以机器周期的频率就是2M,对应的时间就是500ns,
此时单片机的处理速度就是大约500ns一个指令。
了解了上面的东西,我们可以写一个ms延时函数,经过测试,时间还是挺准的。
void Delay1ms() //@24.000MHz
{
unsigned char i, j;
i = 24;
j = 168;
do
{
while (--j);
} while (--i);
}
定时器的运用:
其实定时器每次计数的周期就是一个机器周期,所以可以算出,如果要做一个1us的定时器中断,只需把计数值写为2即可。
定时器的各种配置就不说了,东西还是挺多的。
//timer init //1us进入
void T0_init()
{
TMOD |=0x1; //T0 mode 1
TH0 =(65536-(2))/256;
TL0 =(65536-(2))%256;
EA =1; //总中断
ET0 =1; //定时器0中断
TR0 =1; //定时器使能
}