定义TCON中的位
/* sfr TCON = 0x88; */ /* T0/T1 控制寄存器 */
#define B_TF1 7 /* T1 溢出标志 */#define B_TR1 6 /* T1 启动控制 */
#define B_TF0 5 /* T0 溢出标志 */
#define B_TR0 4 /* T0 启动控制 */
#define B_IE1 3 /* INT1 中断标志 */
#define B_IT1 2 /* INT1 触发方式 0:低电平, 1:下奖沿 */
#define B_IE0 1 /* INT0 中断标志 */
#define B_IT0 0 /* INT0 触发方式 0:低电平, 1:下奖沿 */
软件部分
void isrT1(void) interrupt T1_VECTOR // 3
{
TCON &= ~(1<<(B_TF1)); // clear flag
...
}
void isrT0(void) interrupt T0_VECTOR // 1
{
TCON &= ~(1<<(B_TF0)); // clear flag
...
}
结果出现了T0,T1定时出现概率性不准。经过一番吐血,原来是&指令搞得鬼。
在T0中断中, TCON &= ~(1<<(B_TF0));如果此时 TF1刚好产生,经过这句话后,TF1会被清零。
同理在T1中断中也会发生。
改善措施:采用位操作指令:TF0 = 0; 与 TF1 = 0;就避开此问题。
同理在IO操作也会遇到类似的问题。 输出端口 读操作的输入源有两种:
一种是从端口数据寄存器读取,另一种是直接读引脚电平。
用读取指令来区分: 读-改-写指令是读寄存器,而其它指令读引脚电平。
读改写指令有:
ANL、ORL、XRL、DJNZ、INC、DEC、JBC、CPL、CLR、SETB、MOV PX.Y, C