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

51单片机第18步_将TIM0用作13位定时器

本章重点学习将TIM0用作13位定时器。

1、定时器0工作在模式0框图

2、定时器0工作在模式0举例

1、Keil C51中有一些关键字,需要牢记:

interrupt 0:指定当前函数为外部中断0;

interrupt 1:指定当前函数为定时器0中断;

interrupt 2:指定当前函数为外部中断1;

interrupt 3:指定当前函数为定时器1中断;

interrupt 4:指定当前函数为串口中断;

 using 0:表示当前函数使用第0组寄存器;

using 1:表示当前函数使用第1组寄存器;

using 2: 表示当前函数使用第2组寄存器;

using 3: 表示当前函数使用第3组寄存器;

51单片机内有4个工作组寄存器,每个工作组的寄存器是R0--R7。

R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。

using 0表示设置 RS1=0,RS0 =0,用第0组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(00H)....R7(07H);

using 1表示设置 RS1=0,RS0 =1,用第1组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(08H)....R7(0FH);

using 2表示设置 RS1=1,RS0 =0,用第2组寄存器,R0--R7的在数据存储区里的实际地址是08H-0FH。R0(10H)....R7(17H);

using 3表示设置 RS1=1,RS0 =1,用第3组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(18H)....R7(1FH);

2、13位T0定时器中断程序

#include <REG51.h>  //包含头文件REG51.h,使能51内部寄存器;

//定时器的方式控制寄存器TMOD: GATE1,C/T1,M1_1,M1_0,GATE0,C/T0,M0_1,M0_0

//GATE1=1,表示T1是受INT1脚(P3.3)控制运行;

//C/T1=0,表示T1的时钟源为fosc/12;C/T1=1,表示T1的时钟源为T1脚(P3.5);

//GATE0=1,表示T0是受INT0脚(P3.2)控制运行;

//C/T0=0,表示T0的时钟源为fosc/12;C/T0=1,表示T0的时钟源为T0脚(P3.4);

//下面说明T0的工作方式

//M0_1:M0_0=00,表示T0为13位定时器/计数器;

//M0_1:M0_0=01,表示T0为16位定时器/计数器;

//M0_1:M0_0=10,表示T0为8位自动重装载定时器/计数器;

//M0_1:M0_0=11,表示T0分为两个8位计数器;

//下面说明T1的工作方式

//M1_1:M1_0=00,表示T1为13位定时器/计数器;

//M1_1:M1_0=01,表示T1为16位定时器/计数器;

//M1_1:M1_0=10,表示T1为8位自动重装载定时器/计数器;

//M1_1:M1_0=11,表示T1没有此工作方式;

//定时器的控制寄存器TCON: TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0

//TF1=1,表示T1溢出到0x0000,CPU响应中断后,由硬件自动清除;

//当GATE1=0时,TR1=1,表示启动T1开始工作,当GATE1=1时,Timer1由INT1脚(P3.3)和TR0控制;

//TF0=1,表示T0溢出到0x0000,CPU响应中断后,由硬件自动清除;

//当GATE0=0时,TR0=1,表示启动T0开始工作,当GATE0=1时,Timer0由INT0脚(P3.2)和TR0控制;

#define OSC_FREQ            12000000L    //定义晶振频率为12MHz;

#define instruction_period  1            //定义指令周期为1us;

#define T0_Load_Value       8192-5000L*instruction_period  //配置T0为5000us中断一次;

sbit LED = P1^0;

.uynsigned int Time0Count;

//函数功能: Timer0的中断服务函数,每5000us中断一次;

void timer0_interrupt_program() interrupt 1 using 1

{ TL0=T0_Load_Value&0x1F;     //手动装载最低5位值;

  TH0=T0_Load_Value>>5;       //手动装载剩下的8位值;

  Time0Count++;

  if(Time0Count%1000==0) //500ms时间到

LED=~LED;

}

//函数功能: Timer0初始化;

void timer0_initializtion(void)

{ TMOD&= 0xF4;

//配置Timer0为方式0(13位定时器),同时设置GATE0=0,即不允许外部INT0脚控制Timer0;

  TL0=T0_Load_Value&0x1F;     //手动装载最低5位值;

  TH0=T0_Load_Value>>5;       //手动装载剩下的8位值;

  TR0=1;                //当GATE0=0时,TR0=1,表示启动T0开始工作;

  ET0=1;                //允许Timer0中断;

  EA=1;                 //开总中断允许位;

  Time0Count=0;

}

void main(void)

{ timer0_initializtion(); //Timer0初始化;

  while(1);

    {

}

}

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

相关文章:

  • 构建现代医疗:互联网医院系统源码与电子处方小程序开发教学
  • 2024亚太赛(中文赛)数学建模竞赛选题建议+初步分析
  • 10 - Python文件编程和异常
  • AI绘画-Stable Diffusion 原理介绍及使用
  • 2024年过半,新能源车谁在掉链子?
  • 离线查询+线段树,CF522D - Closest Equals
  • CTF常用sql注入(二)报错注入(普通以及双查询)
  • LabVIEW汽车ECU测试系统
  • 3个让你爽到爆炸的学习工具
  • Java 重载和重写
  • ode45的例程|MATLAB例程|四阶龙格库塔定步长节微分方程
  • “第六感”真的存在吗?
  • 软信天成:您的数据仓库真的“达标”了吗?
  • TCP/IP模型每层内容和传输单位
  • EtherCAT通讯介绍
  • 14-4 深入探究小型语言模型 (SLM)
  • ai智能语音机器人化繁为简让沟通无界限
  • c++ primer plus 第15章友,异常和其他:友元类
  • 面试题002-Java-Java集合
  • 数组越界情况
  • 工作日常学习记录
  • C#中的容器
  • rust + mingw安装教程
  • 【sqlite3】联系人管理系统
  • 秋招Java后端开发冲刺——并发篇2(JMM与锁机制)
  • 记录一次Chrome浏览器自动排序ajax请求的JSON数据问题
  • 【嵌入式——FreeRTOS】任务
  • 网关,路由器,交换机
  • sublime 3 背景和字体颜色修改
  • leetcode 403周赛 包含所有1的最小矩形面积||「暴力」