51单片机学习之旅——定时器

打开软件

1与其它等于其它,0与其它等于0

1或其它等于1,0或其它等于其它

TMOD=TMOD&0xF0;//0xF0=1111 0000进行与操作,高四位保持,低四位清零,高四位定时器1,低四位定时器0

TMOD=TMOD|0x01;//0x01=0000 0001进行或操作,高四位保持,低四位置0001

只配置了定时器0为16位定时器/计数器模式,不影响定时器1的配置TF0=0;//初始状态TF0置0,只有当溢出时,单片机硬件自动置TF0为1,响应中断时,硬件又自动置TF0为0

TR0=1;//配置定时器0时GATE已配置为0,TR0=1允许计时

TH0=(65535-1000)/256;

TL0=(65535-1000)%256;

定时器算配置好了,接下来配置中断,给CPU信号说,来!到点儿了!先别忙那个了,干这个!

ET0=1;

EA=1;

PT0=0;

综上,定时器0初始化函数代码为:

之所以多1是因为65535是从0开始计数,如果从1开始计数,则是1到65536,而我们设置初始值,相当于从1开始计数而不是0,所以TL0=(65536-1000)%256,TH0=(65536-1000)/256

12MHz定时器时钟为12T所以1T就是1MHz

复制代码
void Timer0_Init()//定时器0初始化函数12MHz下配置的12T
{
	TMOD&=0xF0;//高四位保持,低四位清零,a=a&b简写为a&=b
	TMOD|=0x01;//高四位保持,低四位0001
	TL0=0X18;//低四位(65536-1000)%256设置1毫秒定时器
	TH0=0XFC;//高四位(65536-1000)/256设置1毫秒定时器
	TF0=0;//TF0初始化,溢出为1,平时为0
	TR0=1;//允许定时器开始计数
	//打开中断
	ET0=1;
	EA=1;
	//设置优先级
	PT0=0;
}

定时器中断配置好了,接下来是中断后要干事情了,需要中断函数

复制代码
void Timer0_Routine() interrupt 1
{
    static unsigned int T0Count;//用于定时比65536微秒更长的时间比如1秒,设置一个变量
    TL0=0x18;//每次进入中断函数后,初始化函数里的初始值会自动清0,如果不想下次从0开始计数则需要
    TH0=0xFC;//重新给TL0和TH0赋值
    T0Count++;//每进一次中断是1毫秒,累加到T0Count中
    if(T0Count==1000)//1秒等于1000毫秒
    {
        T0Count=0;//先初始化清零
        //下来写想要干的事儿,点灯等等
    }
}

不懂static可以跳转到这里,希望可以帮助到你节约时间

51单片机学习之旅------C语言小知识-CSDN博客

下来把定时器0做模块化

跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客 跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客下来做按键模块化

跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客 跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客同理是delay模块化, 跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客 跳转到这个链接:51单片机学习之旅------模块化编程集_51单片机模版编程-CSDN博客下面是main.c文件内容:

复制代码
#include <REGX52.H>
#include "timer0.h"
#include "key.h"
#include <INTRINS.H>//函数库中有连续左移,右移函数

unsigned char keynumber=0,ledmode=0;

void main()
{
	P2=0xFE;//先让最低位亮一个灯
	Timer0Init();//定时器0中断初始化
	while(1)
	{
		keynumber=key();//读取按键
		if(keynumber)//按键1控制led灯的模式,0模式循环左移,1模式循环右移
		{
			if(keynumber==1)
			{
				ledmode++;
				if(ledmode>=2)
				{
					ledmode=0;
				}
			}
		}
	}
}
	
void Timer0_Routine() interrupt 1
	{
		static unsigned int T0Count;
		TL0=0x18;
		TH0=0xFC;
		T0Count++;
		if(T0Count>=500)
		{
			T0Count=0;
			if(ledmode==0)
			{
				P2=_crol_(P2,1);//_crol_(待移项,需要左移left的位数),最高位与最低位相连成环,一直移
			}
			if(ledmode==1)
			{
				P2=_cror_(P2,1);//_cror_(待移项,需要右移right的位数)
			}
		}
	}

相关推荐
海海不掉头发6 分钟前
软件开发方法第七周笔记_CSDN博客
人工智能·笔记·学习·软件工程
创界工坊工作室17 分钟前
29-基于单片机的万年历设计
stm32·单片机·嵌入式硬件·proteus
Vae_Mars19 分钟前
幂等性学习笔记
笔记·学习·wpf
Xudde.1 小时前
HackMe 靶机渗透测试(Vulnhub Writeup)
笔记·学习·安全·web安全
国科安芯1 小时前
在轨服务与空间机器人任务中跨飞行器CANFD互连的共模与单粒子问题综述
嵌入式硬件·机器人·canfd·低轨卫星·商业航天·抗辐射
沐欣工作室_lvyiyi2 小时前
基于STM32的社区养老控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·社区养老控制系统·保定理工学院·华德学院·淮南师范学院
chengpei1472 小时前
硬改斐讯K2路由器32M Flash编译适配immortalwrt固件
嵌入式硬件·智能路由器
wdfk_prog2 小时前
LWIP教程 16:从 MTU 到 `ip4_frag()` / `ip4_reass()`——IPv4 分片、重组、超时与内存压力
运维·服务器·网络·笔记·学习
snow@li2 小时前
单片机:全景梳理核心原理与体系深度分析
单片机·嵌入式硬件
Xudde.2 小时前
AI-Web1 靶机渗透测试(Vulnhub Writeup)
笔记·学习·安全·web安全