栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

51单片机-定时器功能流水灯控制

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

51单片机-定时器功能流水灯控制

因为使用Delay函数延时会一直占用cpu,导致cpu不能够做其他事情,

就需要配置两个和定时器T1,其余在这个实验不需要配置

还需要涉及定时器的功能

具体看手册
TL0 +TH0共 十六位寄存器,TF0 溢出65535个时间脉冲,申请中断,
SYSclk或者T0pin提供时钟,进行12 或6分频,C/T是选择counter还是timer即计数器或定时器。

中断系统

在这里定时器溢出发出中断,cpu转而执行最优中断级别的事件,可以进行中断嵌套。

最新版本请看手册
下面进行流水灯控制
代码如下

#include 
#include "Timer.h"
#include "Delay.h"
#include "Key.h"
#include 



unsigned char Keynumber;//储存按键
unsigned char LEDmode;//判断led的模式是左流水还是右流水

void main()
{
	P2=0xFE;//先初始化P2
	Timer0Init();//初始化定时器0
	
	
	
	while(1)
	{
		Keynumber=Key();
		if(Keynumber)
		{
			if(Keynumber==1)//如果按键1按下
			{
				LEDmode++;
			if(LEDmode>=2)LEDmode=0;//ledmode只有两种模式,按一下按键切换一种模式进行led流水
			}
		}
			
	}//
	         
	
}

static unsigned int Tcount;
void Timer0_Routine() interrupt 1//在这里实现流水灯控制
{
	TL0 = 0x18;		//设置定时初始值,每次执行中断后寄存器就变成0,所以要重新赋初值
	TH0 = 0xFC;		//设置定时初始值
	
	Tcount++;//每次中断+1
	if(Tcount>=500)//即到了1s
	{
			Tcount=0;
		 if(LEDmode==0)//模式一
			 P2=_cror_(P2,1);//循环右移进行流水灯
		 if(LEDmode==1)//模式二
			 P2=_crol_(P2,1);//循环左移
	}
	
}

相关的模块化文件

//定时器模块Timer.c
#include 
//自己配置
//	//TMOD=0x01;//0000 0001 配置工作模式,但是每次操作会覆盖第四位
//	TMOD&=0xF0;//将
//	TF0=0;//中断标志位,当为1时产生中断
//	TR0=1;//定时器是否开启	
//	TH0=64535/256;//定时器赋初值th0为高位,最大可以计数65535,赋初值可以取整1000个时间脉冲
//	TL0=64535%256;
//	ET0=1;//下面都是中断配置
//	EA=1;
//	PT0=0;	
	void Timer0Init(void)		//1毫秒@12.000MHz
{
	
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;//下面都是中断配置
	EA=1;
	PT0=0;	
}


```c
//Delay.c
#include 
void Delayms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
  while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		 xms--;
  }
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983090.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号