由于单片机资源有限,中断要求处理时间尽可能的短,求最高效率代码
实现功能:一、延时继电器:
当T0_EN为1的时候,T0_ACC累加,累加至设定值T0_SET停止累加,此时T0_out输出为1;
当T0_EN为0时,TACC=0,T0_OUT=0;
二、计数器:
当C0_EN为上升沿时(由0变为1时),C0_ACC累加,累加至设定值C0_SET停止累加,此时C0_OUT输出为1;
当C0_RST为1时,C0_ACC=0,C0_OUT为0
下面的程序只实现一个延时定时器,和计数器
实际还要各实现128个,所以请高手优化一下。
这是一个中断处理函数,每10ms中断一次
经过本人试验用if else语句,采用条件表达式有代码效率的微弱优势。
本人的水平已无力优化,请高手给个思路
//Timer 0 bit value
bit T0_EN = 0; \\等于1时,计时
bit T0_OUT = 0;\\定时器输出
//Counter 0 bit value
bit C0_EN =0;
bit C0_EN_OLD =0;\\两个变量,判定上升沿
bit C0_OUT=0;\\计数器输出
bit C0_RST =0;\\计数器复位,有的PLC,直接复位ACC
//timer 0 ACC value
unsigned char T0_ACC = 0;\\定时器累加器
unsigned char T0_SET =10;\\设定值,准备在另外的IO函数中处理,这样设定值可引入变量
//counter 0 ACC value
unsigned char C0_ACC = 0;\\计数器累加器
unsigned char C0_SET = 10;\\设定值,准备在另外的IO函数中处理,这样设定值可引入变量
void timer_0_ISR() interrupt 1
{
bit tmp=0;
//timer service program
tmp = T0_ACC<T0_SET;\\由于T0_ACC和T0_OUT均需要判断T0_ACC<T0_SET,引入中间量节省一次运算
T0_ACC = !T0_EN?0:tmp? T0_ACC+1:T0_ACC;
T0_OUT = tmp ? 0:1;
//timer service program end
//counter service program start:
tmp = C0_ACC<C0_SET;\\由于C0_ACC和C0_OUT均需要判断C0_ACC<C0_SET,引入中间量节省一次运算
C0_ACC = !C0_RST&tmp&C0_EN & !C0_EN_OLD?C0_ACC+1:C0_RST?0:C0_ACC;
C0_OUT = C0_RST|tmp?0:1;
C0_EN_OLD = C0_EN;\\将本次值存入上个周期值变量
//couter service program end
}