51单片机第21步_将TIM0用作两个8位定时器同时将TIM1用作波特率发生器

本章重点讲解将TIM0用作两个8位定时器,同时将TIM1用作波特率发生器。

定时器T0在方式3时,T1不能产生中断,但可以正常工作在方式0、1、2下,大多数情况下T1将用作串口的波特率发生器。

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

2、定时器1工作在模式2用作波特率发生器框图: 

#define OSC_FREQ     11059200L

//#define BAUD_115200  256 - (OSC_FREQ/192L)/115200L   //

//#define BAUD_38400   256 - (OSC_FREQ/192L)/38400L    //

#define BAUD_Time 1

#if(BAUD_Time==1)

//若波特率加倍,则使用下面参数;

#define BAUD_57600   256 - (OSC_FREQ/192L)/57600L    //255

#define BAUD_28800   256 - (OSC_FREQ/192L)/28800L    //254

#define BAUD_19200   256 - (OSC_FREQ/192L)/19200L    //253

#define BAUD_14400   256 - (OSC_FREQ/192L)/14400L    //252

#define BAUD_9600    256 - (OSC_FREQ/192L)/9600L     //250

#define BAUD_4800    256 - (OSC_FREQ/192L)/4800L  //244

#define BAUD_2400    256 - (OSC_FREQ/192L)/2400L  //232

#define BAUD_1200    256 - (OSC_FREQ/192L)/1200L  //208

#else

//若波特率不加倍,则使用下面参数;

#define BAUD_9600    256 - (OSC_FREQ/384L)/9600L

#define BAUD_4800    256 - (OSC_FREQ/384L)/4800L

#define BAUD_1200    256 - (OSC_FREQ/384L)/1200L

#endif

void Serial_Port_Initialization()

#if(BAUD_Time==1)

PCON = 0x80;//波特率翻倍

#else

PCON = PCON&0x7F;//波特率不翻倍

#endif

SCON  = 0x50; //串行控制寄存器: SM0,SM1,SM2,REN,TB8,RB8,TI,RI

                //SM1:SM0=01,选择方式1,SM2=0,表示非多机通讯,8-bit UART;

//REN=1,使能接收;

  TMOD |= 0x20; //定时器方式控制寄存器:GATE1,C/T1,M11,M10,GATE0,C/T0,M01,M00

                //GATE=0,TR置1便可以启动Timer;GATE=1,TR置1,且INT脚输入高电

//平,才可以启动Timer;

//M11:M10=10,选择方式2,8位自动重装载;

if(PCON &0x80==0x80)TH1   = BAUD_9600;  //TH1:  reload value for 9600 baud @ 11.0592MHz

else TH1   = BAUD_9600;  //TH1:  reload value for 9600 baud @ 11.0592MHz

  TR1   = 1;    //启动Timer1;

  TI    = 1;    //发送UART的第一个字节,为下次发送做准备;

}

3、定时器0工作在模式3应用

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

#include <stdio.h>  //包含头文件stdio.h

       //_getkey();从串口读入一个字符;

   //putchar();向串口发送一个字节;

   //printf();向串口发送一串字节;

//定时器的方式控制寄存器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     11059200L

//#define BAUD_115200  256 - (OSC_FREQ/192L)/115200L   //

//#define BAUD_38400   256 - (OSC_FREQ/192L)/38400L    //

#define BAUD_Time 1

#if(BAUD_Time==1)

//若波特率加倍,则使用下面参数;

#define BAUD_57600   256 - (OSC_FREQ/192L)/57600L    //255

#define BAUD_28800   256 - (OSC_FREQ/192L)/28800L    //254

#define BAUD_19200   256 - (OSC_FREQ/192L)/19200L    //253

#define BAUD_14400   256 - (OSC_FREQ/192L)/14400L    //252

#define BAUD_9600    256 - (OSC_FREQ/192L)/9600L     //250

#define BAUD_4800    256 - (OSC_FREQ/192L)/4800L  //244

#define BAUD_2400    256 - (OSC_FREQ/192L)/2400L  //232

#define BAUD_1200    256 - (OSC_FREQ/192L)/1200L  //208

#else

//若波特率不加倍,则使用下面参数;

#define BAUD_9600    256 - (OSC_FREQ/384L)/9600L

#define BAUD_4800    256 - (OSC_FREQ/384L)/4800L

#define BAUD_1200    256 - (OSC_FREQ/384L)/1200L

#endif

#define TL0_Load_Value       256-100L   //配置TL0为100us中断一次;

#define TH0_Load_Value       256-200L  //配置TH0为200us中断一次;

sbit LED1 = P1^0;

sbit LED2 = P1^1;

uynsigned int Time0TL0Count;

uynsigned int Time0TH0Count;

 //函数功能: TL0计数器的中断服务函数,每100us中断一次;

void TL0_interrupt_program() interrupt 1 using 1

{ TL0=TL0_Load_Value;    //手动装载初值;

Time0TL0Count++;

if(Time0TL0Count>5000)//0.5秒

  LED1=~LED1;

}

//函数功能: TH0计数器的中断服务函数,每200us中断一次;

void TH0_interrupt_program() interrupt 3  using 1

{

 TH0=TH0_Load_Value;    //手动装载初值;

Time0TH0Count++;

if(Time0TH0Count>5000)//0.5秒

  LED2=~LED2;

}

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

void timer0_initializtion()

{ TMOD&= 0xF4;          //设置GATE0=0,即不允许外部INT0脚控制Timer0;

  TMOD|= 0x03;     //配置Timer0为方式3(两个8位定时器,一个用TL0计数,一个用TH0计数);

  TL0=TL0_Load_Value;    //手动装载初值;

  TH0=TH0_Load_Value;    //手动装载初值;

  TR0=1;                //当GATE0=0时,TR0=1,表示启动Timer0中的TL0开始工作;

  TR1=1;                //设置Timer0的TH0时钟源为晶振频率的1/12,并启动TH0开始工作;

  ET0=1;                //允许Timer0中的TL0溢出中断;

  ET1=1;                //允许Timer0中的TH0溢出中断;

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

Time0TL0Count=0;

Time0TH0Count=0;

}

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

void timer1_initializtion()

{ TMOD&= 0x4F;    //设置GATE1=0,即不允许外部INT1脚控制Timer1;

  TMOD|= 0x20;    //配置Timer1为方式2(8位自动重装载),用于波特率发生器;

  TH1=BAUD_9600;  //TH1:  reload value for 9600 baud @11.0592MHz;

  TL1=TH1;

}

//函数功能:初始化串口,设置波特率为9600bps@11.0592MHz,使能接收,使用8位UART;

void Serial_Port_Initialization()

{ PCON = 0x80;

  SCON=0x50; //串行控制寄存器: SM0,SM1,SM2,REN,TB8,RB8,TI,RI

             //SM1:SM0=01,选择方式1,SM2=0,表示非多机通讯,8-bit UART;

     //REN=1,使能接收;

  timer1_initializtion();

  TI=1;    //发送UART的第一个字节,为下次发送做准备;

  RI=0;

  //ES=1; //使能串口接收和发送中断;

  EA=1; //开总中断

}

void main(void)

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

  Serial_Port_Initialization();

//初始化串口,设置波特率为9600bps@11.0592MHz,使能接收,使用8位UART;

  printf( "Timer0 works in mode3;\n" );

  printf( "TL0 is a timer.\n" );

  printf( "TH0 is a timer,too;\n" );

  printf( "Timer1 works in mode2,It is a baud_rate_generator!\n" );

  while(1);

    {

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第22集《大乘起信论》

请大家打开《讲义》第四十四页&#xff1a; 癸二、显示用 子一、正明用即真如 前面讲到一心的体大跟相大&#xff0c;讲到真如门&#xff1b;这以下讲到用&#xff0c;这当中分三科&#xff0c;先看子一、正明用即真如。这个体大跟相大它是真如门&#xff0c;是一个非因缘所…

Webpack: 核心配置结构

概述 Webpack 是一种 「配置」 驱动的构建工具&#xff0c;所以站在应用的角度&#xff0c;必须深入学习 Webpack 的各项配置规则&#xff0c;才能灵活应对各种构建需求。本文将作为小册应用系列的一个总结&#xff0c;汇总与应用配置相关的各项知识点&#xff0c;包括&#x…

高并发场景下的热点key问题探析与应对策略

目录 一、问题描述 二、发现机制 三、解决策略分析 &#xff08;一&#xff09;解决策略一&#xff1a;多级缓存策略 客户端本地缓存 代理节点本地缓存 &#xff08;二&#xff09;解决策略二&#xff1a;多副本策略 &#xff08;三&#xff09;解决策略三&#xff1a;热点…

XJTUSE-数据结构-homework1

任务 1 题目&#xff1a; 排序算法设计&#xff1a; 需要写Selection、Shell、Quicksort 和 Mergesort四种排序算法&#xff0c;书上讲述比较全面而且不需要进行额外的优化&#xff0c;下面我简要地按照自己的理解讲述。 Selection&#xff08;选择排序&#xff09;&#xff…

vtk学习笔记

tfun和gradtfun的区别 在体绘制&#xff08;Volume Rendering&#xff09;中&#xff0c;vtk.vtkPiecewiseFunction 通常用于定义两种类型的不透明度映射&#xff1a;标量不透明度映射和梯度不透明度映射。虽然这两个函数都使用 vtk.vtkPiecewiseFunction 来创建&#xff0c;但…

【孙子兵法】始计篇 - 原文注解笔记 ① ( 五事 - 道、天、地、将、法 )

文章目录 一、始计篇 原文注解笔记1、兵者&#xff0c;国之大事2、五事道天地将法 一、始计篇 原文注解笔记 1、兵者&#xff0c;国之大事 孙子曰&#xff1a;兵者&#xff0c;国之大事&#xff0c;死生之地&#xff0c;存亡之道&#xff0c;不可不察也。 孙子说 : 战争 , 是国…

Git上传大文件时各种报错解决方案汇总

如何通过LFS向Github添加大文件 https://zhuanlan.zhihu.com/p/699750305&#xff08;测试失败&#xff09; Configuring Git Large File Storage - GitHub Docs HTTP 400 curl 22 The requested URL returned error: 400 send-pack: unexpected disconnect while reading si…

Django ORM 中过滤 JSON 数据

简介 首先,我们假设您有一个名为 MyModel 的 Django 模型,它包含一个 JSONField 类型的字段,名为 data。这个 data 字段可以存储各种 JSON 格式的数据。 过滤 JSON 字段中的键值对 您可以使用双下划线 __ 语法来访问 JSON 字段中的嵌套键值对。例如: # 过滤 data 字段中 &qu…

瓦努阿图将出台数字资产监管法案

亲爱的国民&#xff0c;你们好&#xff01; “瓦努阿图即将在数字资产领域迎来突破性转型&#xff0c;全世界的加密爱好者准备好迎接一波激动人心的信仰充值。” 对&#xff0c;就是它&#xff01;比特币定为国家法定货币&#xff0c;央行开发数字货币钱包&#xff0c;总统新…

关于Redisson分布式锁的用法

关于Redisson分布式锁的用法 Redisson是一个基于Redis的Java分布式对象和服务框架&#xff0c;它提供了多种分布式锁的实现&#xff0c;包括可重入锁、公平锁、读写锁等。Redisson实现分布式锁的核心原理主要依赖于Redis的数据结构和Redisson框架提供的高级功能。以下详细讲解…

深度学习11-20

1.神经元的个数对结果的影响&#xff1a; &#xff08;http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html&#xff09; &#xff08;1&#xff09;神经元3个的时候 &#xff08;2&#xff09;神经元是10个的时候 神经元个数越多&#xff0c;可能会产生…

langchain报错

ImportError: cannot import name ‘BaseModel’ from ‘langchain_core.pydantic_v1’ (/Users/sunwenjun/anaconda3/envs/python310/lib/python3.10/site-packages/langchain_core/pydantic_v1/init.py) pip install -U pydantic pip install -qU langchain-openai

第3章-数据类型和运算符

#本章目标 掌握Python中的保留字与标识符 理解Python中变量的定义及使用 掌握Python中基本数据类型 掌握数据类型之间的相互转换 掌握eval()函数的使用 了解不同的进制数 掌握Python中常用的运算符及优先级1&#xff0c;保留字与标识符 保留字 指在Python中被赋予特定意义的一…

AI时代下的个体创业

核心理念&#xff1a; 少工作&#xff0c;多赚钱&#xff0c;享受生活&#xff1a;减少工作量&#xff0c;提高工作效率&#xff1b;设定主观的赚钱目标&#xff0c;根据兴趣和追求持续获利&#xff1b;平衡工作与生活&#xff0c;实现时间和地点自由。个人成长与试错&#xf…

FireAct:使用智能体(agent)微调大语言模型

1.概述 近年来,针对语言模型(LMs)的研究致力于探索其与外部工具或环境互动的能力,以推进新型语言代理的发展。此类代理具备从环境反馈中汲取新知识、通过语言推理进行连续决策,以及借助自我反思提升任务解决能力的能力。工业界的进展,如ChatGPT插件,凸显了语言代理在实际…

微信小程序的跳转页面

在微信小程序中&#xff0c;要实现从当前页面返回到指定页面的功能&#xff0c;通常不直接使用“返回上一页”的逻辑&#xff0c;而是利用小程序的页面栈管理和navigateBack或者重新定向到目标页面的API。下面我将介绍两种主要的方法&#xff1a; 方法一&#xff1a;使用 navi…

[C++][设计模式][备忘录模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件构建过程中&#xff0c;某些对象的状态转换过程中&#xff0c;可能由于某中需要&#xff0c;要求程序能够回溯到对象之前处于某个点的状态。 如果使用一些公开接口来让其他对象得到对象的状态&#xff0c;便会暴露对象…

pygame下载安装流程

方案一&#xff1a;直接下载 使用cmd打开窗口&#xff1a; 使用命令&#xff1a;pip install pygame即可下载最新pygame安装包 方案二&#xff1a;下载指定版本 我们需要去python官网查看对应包和发布版本&#xff1a; python官网 进去后点击PyPI&#xff0c;查找python发布…

C#异常捕获

前言 在C#中&#xff0c;我们无法保证我们编写的程序没有一点bug&#xff0c;如果我们对于这些抛出异常的bug不进行任何的处理的话&#xff0c;那么我们的软件在抛出这些异常的时候就会崩溃&#xff0c;也就是软件闪退&#xff0c;并且这种闪退由于我们没有进行处理&#xff0…

初阶数据结构之堆讲解

本篇文章带大家学习的是堆&#xff0c;还请各位观众老爷给个三连 正片开始 堆的概念 如果有一个关键码的集合 K { &#xff0c; &#xff0c; &#xff0c; … &#xff0c; } &#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满…