在C51中,乘、除、求模运算都是通过调用库函数来实现的,调用库函数的优点在于简化了编程,缺点是代码长度长、调用时间长。适当的使用移位操作来代替乘、除、求模运算可以大大的节省时间和代码长度。
乘除运算在某些特定的时候是相通的,例如乘4可以通过左移2位实现,除4则可以用右移2位实现。求模也可以通过移位的组合来实现。
例1 用移位实现一些复杂的运算
uint x=5;
uint y=x<<2+; //移位实现y=x*5,即y=x*4+x=x<<2+x
uint m=200;
uchar mh,hl;
mh=m>>4; //移位实现mh=m/16
ml=m-((m>>4)<<4); //移位实现ml=m%16,注意(m>>4)<<4!=m
外插一句:中断服务程序一般要求代码简洁,尽量减少在中断服务程序里调用函数,最好就是在中断服务程序里面只设置标志位,而需要在中断时响应的函数放在外面,通过这些标志位来执行。这种方法有利于提高中断响应的效率。
我们在定时器的中断程序初值的重置也可以采用移位的方式完成。
例2 使用移位的方法来实现定时器中断的初值重置
void Timer0int() interrupt using 1
{
//......
uint temp;
uchar TH0temp,TL0temp;
temp=65536-CYCLE;
TH0temp=temp>>8; //temp/256的移位实现
TL0temp=temp-((temp>>8)<<8);//temp%256的移位实现
TH0=TH0temp;
TL0=TL0temp;
//......
}
采用移位的方法对定时器的初值重置特别适用于当定时器中断周期较短而任务较多时的情况。
参考文献
姜志海,赵艳雷.单片机的C语言程序设计与应用[M].北京:电子工业出版社,2010
文章评论(0条评论)
登录后参与讨论