当前位置: 首页 > news >正文

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

相关文章:

  • go 日志框架
  • Visual Studio Code 2025 安装与高效配置教程
  • 大语言模型架构:从基础到进阶,如何理解和演变
  • Spring 实战技术文档
  • C++标准库——时间
  • 使用 Grafana 监控 Spring Boot 应用
  • 人工智能三剑客:符号主义、连接主义与行为主义的较量与融合
  • 高清下载油管视频到本地
  • 【C语言】经验漫谈:应用情景下的移位操作巧分析
  • 力扣——杨辉三角
  • ioctl函数讲解
  • 电脑开机一段时间就断网,只有重启才能恢复网络(就算插网线都不行),本篇文章直接解决,不要再看别人的垃圾方法啦
  • 巧妙实现右键菜单功能,提升用户操作体验
  • Docker实战-使用docker compose搭建博客
  • WebXR教学 01 基础介绍
  • 开发指南103-jpa的find**/get**全解
  • 【信息系统项目管理师-案例真题】2012下半年案例分析答案和详解
  • 位运算实用技巧与LeetCode实战
  • JAVAweb-标签选择器,盒模型,定位,浮动
  • linux之perf(17)PMU事件采集脚本
  • “五一”假期银联、网联共处理支付交易234.39亿笔
  • 丁薛祥在学习《习近平经济文选》第一卷专题研讨班上强调,深入学习贯彻习近平经济思想,加强党中央对经济工作的集中统一领导
  • 五一档7.47亿收官:《水饺皇后》领跑;男观众占比增多
  • GOMU超马世锦赛,男女冠军刷新世界纪录
  • 莫斯科一机场实施临时限制措施
  • 市场驱动的系统改造:丹麦零弃风经验研究