51单片机——定时器中断应用(控制LED灯的循环移动)
51单片机:定时器中断应用(控制LED灯的循环移动),按下key1,LED循环右移;按下key2,LED循环左移。循环中间间隔1s。
目录
2、定时器T0的配置文件Timer0_Init.h和Timer0_Init.c
3、独立按键模块Independentkey.h和Independentkey.c
一、功能介绍
用独立按键控制LED灯的循环右移或者左移(中间间隔1s)。按下key1,LED循环右移;按下key2,LED循环左移。间隔时间1s通过设置单片机内部的定时器来实现,当计数记满后,向CPU发出中断请求,中断响应后,CPU开始执行中断程序,完成后再返回执行主程序。
二、程序实现
1、测试文件test.c
#include <REGX51.H>
#include<INTRINS.H>
#include"Timer0_Init.h"
#include"Independentkey.h"
unsigned char LEDMODE=0;
//定时1s中断
void Timer0_ISR() interrupt 1
{
static int count=0;
count++;
TH0=0xfc;
TL0=0x18;
if(count==1000)
{
count=0;
if(LEDMODE==1)//循环右移
P2=_cror_(P2,1);
if(LEDMODE==2)//循环左移
P2=_crol_(P2,1);
}
}
int main()
{
unsigned char keynum=0;
P2=0xfe;
Timer0_Init();
while(1)
{
keynum=Independentkey();
if(keynum!=0)//判断按下
{
if(keynum==1)
LEDMODE=1;//循环右移
if(keynum==2)
LEDMODE=2;//循环左移
}
}
}
2、定时器T0的配置文件Timer0_Init.h和Timer0_Init.c
2.1定时器配置的步骤
①对TMOD赋值。确定是使用定时器T1还是T0,是计数模式(C/T=1)还是定时模式 (C/T=0),还有工作方式的确定。例如:TMOD=0x01(定时器T0,工作方式为1)。
②初始值的确定。将其写入 TH0、TL0 或 TH1、TL1。假如TMOD=0x01时,需要定时1s。因为此时T0工作在方式1,16位的定时器,最大计数2^16=65536。假设系统晶振为12MHz,
默认12分频,那么一个计数(定时脉冲周期)的时间为,最大有65536个计数所以最大定时65536us=0.65536s。最大定时时间不够1s,所以采用定时1ms,重复1000次。定时1ms,初始值为:65536-1000=64536,化成16进制0xfc18,TH0=0xfc,TL0=0x18。
③开放定时器中断。以定时器T0为例:EA=1;ET0=1。
④打开定时器。以定时器T0为例:TR0=1。
2.2头文件Timer0_Init.h
#ifndef __TIMER0_INIT_H__
#define __TIMER0_INIT_H__
void Timer0_Init();
#endif
2.3定时器T0的初始配置Timer0_Init.c
#include <REGX51.H>
void Timer0_Init()//定时器0,工作方式1
{
TMOD=0x01;
TH0=0xfc;//1ms
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
}
//定时1s中断
//void Timer0_ISR() interrupt 1
//{
// static int count=0;
// count++;
// TH0=0xfc;
// TL0=0x18;
// if(count==1000)
// {
// count=0;
//
// }
//}
3、独立按键模块Independentkey.h和Independentkey.c
3.1头文件Independentkey.h
#ifndef __INDEPENDENTKEY_H__
#define __INDEPENDENTKEY_H__
unsigned char Independentkey();
#endif
3.2独立按键键值检测Independentkey.c
#include <REGX51.H>
#include"Delay.h"
unsigned char Independentkey()
{
unsigned char keynum=0;
if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);keynum=1;}
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);keynum=2;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);keynum=3;}
if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);keynum=4;}
return keynum;
}
4.延时函数Delay.h和Delay.c
1.头文件Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int Xms);
#endif
2.延时函数Delay.c
void Delay(unsigned int Xms) //@12.000MHz
{
unsigned char i, j;
while(Xms--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
三、程序效果
按下key1,LED循环右移;按下key2,LED循环左移。循环中间间隔1s。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)