51单片机学习--按键控制流水灯模式&定时器时钟

51单片机学习--按键控制流水灯模式&定时器时钟_第1张图片
51单片机学习--按键控制流水灯模式&定时器时钟_第2张图片

TMOD负责确定T0和T1的工作模式,TCON控制T0和T1的启动或停止计数,同时包含定时器状态
TF1:定时器1溢出标志
TF0:定时器0溢出标志

0~65535 每隔1微秒计数器+1,总时间65535微秒,赋上初值64535,则只有1000微秒即1毫秒

第一步:编写Timer_Init()

首先配置TMOD
51单片机学习--按键控制流水灯模式&定时器时钟_第3张图片
所以初始化TMOD = 0x01; //0000 0001
整体操作:TMOD = TMOD & 0xF0; //低四位清零,高四位不变
TMOD = TMOD | 0x01; //最低位置1,其他位不变

接下来配置TCON
51单片机学习--按键控制流水灯模式&定时器时钟_第4张图片
TF0 = 0;
TR0 = 1;

还要配置TH0和TL0
用64535,存在这两个盒子里,盒子最大只能存八字节也就是256,所以
TH0 = 64535 / 256;
TL0 = 64535 % 256;

最后配置中断系统
51单片机学习--按键控制流水灯模式&定时器时钟_第5张图片
要打开的开关置1
ET0 = 1;
EA = 1;
PT0 = 0;

来看看代码

#include 

void Timer0_Init(void)		//1毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	//中断系统
	ET0 = 1;
	EA = 1;
	PT0 = 0;
}


void main()
{
	Timer0_Init();
	while(1)
	{
		
	}
}


unsigned int T0Count;
void Timer0_Routine() interrupt 1
{
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count ++;
	if(T0Count >= 1000)
	{
		T0Count = 0;
		
		P2_0 = ~P2_0;
	}
}

接下来把定时器模块化
创建Timer0头文件和.c文件存放Timer0_Init()
中断函数保留在主函数中,根据不同的需要进行修改
然后把T0Count 改为静态局部变量,使之生命周期与文件相同,否则执行完一次之后会被初始化

利用按键控制流水灯流动方向的主函数代码:
Key函数读取按键,按一次改变一次流水方向,每500毫秒中断一次,判断流水模式进行移位
crol 是循环左移函数 , _cror_是循环右移函数,需要INTRINS.H头文件

#include 
#include 
#include "Timer0.h"
#include "Key.h"


unsigned char KeyNum, LEDMode;

void main()
{
	P2 = 0xFE; // 1111 1110 点亮最后一位,然后利用循环移位函数_crol_ 和_cror_
	
	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;
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count ++;
	if(T0Count >= 500) //每500毫秒移位一次,LEDMode决定方向
	{
		T0Count = 0;
		
		if(LEDMode == 0) P2 = _crol_(P2, 1);
		if(LEDMode == 1) P2 = _cror_(P2, 1);
	}
}

而定时器时钟只需要在此基础上进行修改,利用之前模块化好的LCD1602模块和Timer0模块,下面给出主函数:

#include 
#include "LCD1602.h"
#include "Timer0.h"
#include "Delay.h"

unsigned int Sec, Min, Hour;

void main()
{
	LCD_Init();
	Timer0_Init();
	
	LCD_ShowString(1, 1, "Clock:");
	
	LCD_ShowString(2, 1, "  :  :");
	
  while(1)
  {
    LCD_ShowNum(2, 1, Hour, 2);
		LCD_ShowNum(2, 4, Min, 2);
		LCD_ShowNum(2, 7, Sec, 2);
  }
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count ++;
	if(T0Count >= 1000)
	{
		T0Count = 0;
		
    Sec ++;
		if(Sec >= 60) Sec = 0, Min ++;
		if(Min >= 60) Min = 0, Hour ++;
		if(Hour >= 24) Hour = 0;
	}
}

51单片机学习--按键控制流水灯模式&定时器时钟_第6张图片

你可能感兴趣的:(51单片机,51单片机,学习,嵌入式硬件,单片机)