借助定时器按键控制LED流水灯左右顺序
这节我也采用模块化编程
首先写定时器的代码,根据开发板手册
图片左上为时钟系统,左下和中部为计数系统,右边为中断系统。
GATE向右进程为非门,左给1右边就输出0,左给0则输出1。再向右进程(月牙形)为或门,有1就输出1,全是0才输出0。再向右为与门,有0就输出0,全是1才输出1。
51单片机中的定时器由两个控制位TR0和TR1,用于启动和停止定时器的计数,赋1是启动定时器T0和T1,赋0时停止。(注意启动定时器的指令一般在初始化程序中)。定时器T0和T1是由两个八位专用寄存器组成,例如T0由TH0和TL0组成。其内部还有特殊功能寄存器TMOD和TCON。TMOD负责控制确定T0和T1的功能和工作模式。TCON用来控制T0和T1启动或停止计数。
这里我为定时器模块写代码,根据流程图为GATE赋0,就可以实现让TR0单独控制。C/T赋0来选择定时器,M1、M0赋0、1来决定定时器工作模式。所以TMOD=0x01执行以上内容,选择模式一(定时器T1不工作、T0工作)。TR0=1启动定时器。
中断系统根据手册从左到右为TF=0,ET0=1,EA=1,PT0=0接通。
- <font face="楷体, 楷体_GB2312" size="6">#include <STC12C5A60S2.H>
- void Timer0_Init(void)
- {
-
- TMOD=0x01;//选择模式
- </font>
复制代码
在按下按键时LEDMode++;if(LEDMode>=2)LEDMode=0;代码可以让LEDMode在01之间反复横跳。
crol和cror函数可以让LED灯左右移动,注意要提前预编译函数库INTRINS.H。
代码如下。
- <font face="楷体, 楷体_GB2312" size="6">#include <STC12C5A60S2.H>
- #include <Timer0.h>
- #include <Key.h>
- #include <INTRINS.H>
- unsigned char KeyNum,LEDMode;
- void main()
- {
- P0=0xFE;
- P20=0;
- P21=1;
- P22=1;
- P11=0;
- Timer0_Init();
- while(1)
- {
- KeyNum=Key();
- if(KeyNum)
- {
- if(KeyNum==1)
- {
- LEDMode++;
- if(LEDMode>=2)LEDMode=0;
-
- }
- }
- }
- }
- void Timer0_Routine() interrupt 1
- {
- static unsigned int T0Count;
- TH0=64535/255;
- TL0=64535%255;</font>
复制代码 64535离计数器溢出差值1000,为1ms,所以使用64535/255,下面T0Count每隔1ms计数加一,到1000就达到了间隔1s的作用。(注意在if语句给T0Count归0。) 按键代码和延迟函数代码也是模块化。
|