MOV R2, #07H ;重新设置移位次数 SJMP Exit_Timer1_ISR Right_Shift:
RR A ;右移控制 MOV P1, A
DJNZ R2,Exit_Timer1_ISR ;判断左移流程是否结束,若结束,转入右移控制
CLR 00H ;清0左、右移控制标志 MOV R2, #07H ;重新设置移位次数 Exit_Timer1_ISR: RETI
END
C51参考程序如下: 1)查询方式实现
#include
#include
/*---------------------利用T1实现定时的子函数------------------*/ void DELAY(void) //延时函数 1S { uint i = 0;
TMOD = 0x00; //T1工作模式1 TH1 = 0x3c; TL1 = 0xb0; TR1 = 1; while(i<20) { if(TF1==1) //查询T1溢出标志 { TF1 = 0; i++; } } }
/*---------------------循环左移子函数------------------*/ void Left_Shift(void)
{ P1 = LED; DELAY(); //延时一秒 LED = _crol_(LED,1); //循环左移一位 }
/*---------------------循环右移子函数------------------*/ void Right_Shift(void) { LED = _cror_(LED,1); //循环右移一位 P1 = LED; DELAY(); //延时一秒 }
/*---------------------主函数------------------*/ void main(void) { uchar j; while(1) { for(j=0;j<7;j++) { Left_Shif (); } for(j=0;j<7;j++) { Right_Shift (); } } }
2)中断方式实现
#include
#include
/*---------------------定义全局变量------------------*/ uchar LED = 0xfe; uchar i = 0; uchar t = 0;
/*---------------------T1初始化子函数------------------*/ void Timer1_init(void) { TMOD = 0x00; //T1工作模式1 TH1 = 0x3c; TL1 = 0xb0; ET1 = 1; EA = 1; TR1 = 1; }
/*---------------------LED循环显示子函数------------------*/ void Shift(void) { P1 = LED; t++; if(t<=7) { LED = _crol_(LED,1); //循环左移一位 } else if(t<15) { LED = _cror_(LED,1); //循环右移一位 } else {t = 0;} }
/*--------------------T1中断服务子函数------------------*/
void Timer1_int(void) interrupt 3 using 1 //定时T1中断服务程序 { i++; f(i==20) { i = 0; Shift (); } }
/*--------------------主函数------------------*/ void main(void) //主函数 { Timer1_init(); //T1初始化
}
while(1) ;
例8.4 连续输入5个单次脉冲使单片机控制的LED灯状态翻转一次。要求用单片机定时/计数器计数功能实现实现。 解:采用T1实现,硬件如图8.8所示。
图8.8 信号灯的计数控制
采用T1的方式2的计数方式,初始值设置为FBH,当输入5个脉冲时,即溢出标志TF1,通过查询TF1或中断方式判断TF1标志,进而对P1.0LED灯进行控制。 汇编语言参考程序如下 : 1)查询方式实现
ORG 0000H
MOV TMOD, #60H ;设定定时器1模式2,计数功能 MOV TH1, #0FBH
MOV TL1, #0FBH ;设置计数器初值(256-5) SETB TR1 ;启动计数 Check_TF1:
JBC TF1, Timer1_Overflow ;查询是否计数溢出 AJMP Check_TF1 Timer1_Overflow:
CPL P1.0 ;当统计5个脉冲,LED灯状态翻转
AJMP Check_TF1 END
2)中断方式实现 ORG 0000H AJMP MAIN ORG 001BH
AJMP Timer1_ISR
MAIN: MOV TMOD, #60H ;设定定时器1模式2,计数功能
MOV TH1, #0FBH
MOV TL1, #0FBH ;设置计数器初值(256-5)
SETB ET1 SETB EA
SETB TR1 ;启动计数 SJMP $ Timer1_ISR: CPL P1.0 ;当统计5个脉冲,LED灯状态翻转
RETI END
C51参考程序如下: 1)查询方式实现 #include
void timer_initial(void) { TMOD = 0x60; //设定定时器1模式2,计数功能 TH1 = 0xfb; //5个脉冲以后溢出 TL1 = 0xfb; TR1 = 1; //开始计数器 }
void main(void) { timer_initial();
while(1) { while(TF1==0);
TF1 = 0;
Led = ~led; //不断查询是否溢出,没有溢出,就等待溢出了;溢出了,
//清空溢出标志,led取反
}
}
2)中断方式实现 #include
#define uchar unsigned char #define uint unsigned char
相关推荐: