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的位数)
			}
		}
	}

相关推荐
weixin_535854221 小时前
oppo,汤臣倍健,康冠科技,高途教育25届春招内推
c语言·前端·嵌入式硬件·硬件工程·求职招聘
viperrrrrrrrrr71 小时前
大数据学习(49) - Flink按键分区状态(Keyed State)
大数据·学习·flink
red_redemption1 小时前
自由学习记录(36)
学习
热爱嵌入式的小许2 小时前
STM32 HAL库&标准库+ESP8266+机智云
stm32·单片机·嵌入式硬件·stm32移植机智云·stm32连接机智云·hal库移植机智云·标准库移植机智云
无际单片机编程2 小时前
面对STM32的庞大体系,如何避免迷失在细节中?
java·stm32·单片机·嵌入式硬件·嵌入式开发
黑金IT2 小时前
将Neo4j用于Python学习的创新方法
python·学习·neo4j
StickToForever3 小时前
第4章 信息系统架构(二)
经验分享·笔记·学习·职场和发展
19岁开始学习4 小时前
Go学习-入门
开发语言·学习·golang
ianozo4 小时前
CTF 代码学习日记 PHP
java·学习·php
2301_764602235 小时前
stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)
stm32·单片机·嵌入式硬件