当前位置: 首页 > 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&=bTMOD|=0x01;//高四位保持,低四位0001TL0=0X18;//低四位(65536-1000)%256设置1毫秒定时器TH0=0XFC;//高四位(65536-1000)/256设置1毫秒定时器TF0=0;//TF0初始化,溢出为1,平时为0TR0=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的位数)}}}

http://www.lryc.cn/news/542029.html

相关文章:

  • 一台服务器将docker image打包去另一天服务器安装这个镜像
  • QT串口通信之二,实现单个温湿度传感器数据的采集(采用Qt-modbus实现)
  • 基于SpringBoot的校园消费点评管理系统
  • 【小沐学Java】VSCode搭建Java开发环境
  • 《操作系统 - 清华大学》8 -4:进程管理:进程控制结构
  • RPC 框架项目剖析
  • C++ Boost面试题大全及参考答案
  • 关于Transparent native-to-ascii conversion
  • js数据类型检测
  • go 模块管理
  • 记一次复杂分页查询的优化历程:从临时表到普通表的架构演进
  • 基于 Python 的项目管理系统开发
  • java面试场景问题
  • JS宏实例:数据透视工具的制作(四)
  • 5. Go 方法(结构体的方法成员)
  • 20250223学习记录
  • WPS携手DeepSeek:开启智能办公新时代
  • 无需服务器,浏览器跑700+AI模型?!
  • WSL2下ubuntu开启NFS服务
  • 深入了解 DevOps 基础架构:可追溯性的关键作用
  • k2路由器登录校园网
  • 构建知识图谱的关键:高效三元组抽取技术在文本挖掘中的应用
  • 超高清大图渲染性能优化实战:从页面卡死到流畅加载
  • 当使用vcpkg安装的qt5时,在VS调用出现libcrypto-*-x64.dll不是有效路径时
  • 在 Vue 中处理跨域请求:全面解析与实践指南
  • 标量化rknn的输入输出向量转换处理
  • 认知重构 | 自我分化 | 苏格拉底式提问
  • Java集合之ArrayList(含源码解析 超详细)
  • Java笔记18
  • LangChain大模型应用开发:构建Agent智能体