目录

一、功能介绍

二、程序实现

1、测试文件test.c

2、定时器T0的配置文件Timer0_Init.h和Timer0_Init.c

2.1定时器配置的步骤        

2.2头文件Timer0_Init.h

2.3定时器T0的初始配置Timer0_Init.c

3、独立按键模块Independentkey.h和Independentkey.c

3.1头文件Independentkey.h

3.2独立按键键值检测Independentkey.c

4.延时函数Delay.h和Delay.c

1.头文件Delay.h

2.延时函数Delay.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分频,那么一个计数(定时脉冲周期)的时间为(1/12*10^{-6})*12s=1us,最大有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。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐