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

news/2024/7/8 10:46:07 标签: 单片机, 嵌入式硬件, 51单片机

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

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

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

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

1), 当定时器0工作于模式3时,定时器1只能工作于模式2,用作波特率发生器。当定时器1工作于模式3时,则停止计数。定时器1工作在模式2框图如下:

2),定时器1用作波特率发生器时,T1引脚(P3.5)只能作为通用IO口使用。

4),波特率加倍:波特率 = (2÷32)×((11.0592×1000000/12)/(256-TH1))

TH1 = 256 - 11.0592×1000000/192/波特率

当TH1=250,波特率为9600bps,可以用来验证计算。

注意:11.0592表示晶振频率,单位:MHz

5),波特率不加倍:波特率 = (1÷32)×((11.0592×1000000/12)/(256-TH1))

TH1 = 256 - 11.0592×1000000/384/波特率

当TH1=253,波特率为9600bps

注意:11.0592表示晶振频率,单位:MHz

6),不建议使用定时器1的工作方式0或工作方式1作为波特率发生器的输入时钟,需要定时器1产生中断,同时还需要手动装载初始值,当波特率很高时,进入中断会占用时间,难以实现。

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.niftyadmin.cn/n/5537104.html

相关文章

探索人工智能在电子商务平台与游戏发行商竞争中几种应用方式

过去 12 年来&#xff0c;电脑和视频游戏的发行策略发生了巨大变化。数字游戏的销量首次超过实体游戏的销量 在20132020 年的封锁进一步加速了这一趋势。例如&#xff0c;在意大利&#xff0c;封锁的第一周导致数字游戏下载量 暴涨174.9%. 展望未来&#xff0c;市场有望继续增…

【Spring Boot】spring boot环境搭建

1、环境准备 JDK安装&#xff1a;确保安装了Java Development Kit (JDK) 1.8或更高版本。JDK是Java编程的基础&#xff0c;Spring Boot项目需要它来编译和运行。Maven或Gradle安装&#xff1a;选择并安装Maven或Gradle作为项目构建工具。Maven通过pom.xml文件来管理项目的依赖…

Ubuntu多显示器设置不同缩放比例

Ubuntu多显示器设置不同缩放比例 设备问题解决方案 设备 笔记本屏幕分辨率为2560 \times 1600&#xff0c;外接显示器的分辨率为3840 \times 2160。 问题 Ubuntu默认的显示器设置中&#xff0c;缩放仅能选择100%&#xff0c;200%&#xff0c;300%&#xff0c;400%。假…

使用selenium定位input标签下的下拉框

先来看一下页面效果&#xff1a;是一个可输入的下拉列表 再来看一下下拉框的实现方式&#xff1a; 是用<ul>和<li>方式来实现的下拉框&#xff0c;不是select类型的&#xff0c;所以不能用传统的select定位方法。 在着手定位元素前一定一定要先弄清楚下拉列表…

应用案例 | 劳易测DCR 55助力电子制造业高效检测

在当今快节奏的电子制造行业中&#xff0c;电子产品的生产过程也日益复杂和精细化。在这个过程中&#xff0c;对各个组件的精确识别和有效追溯显得尤为重要。电子产品无论是部件零组件&#xff0c;还是封装模组&#xff0c;在组装成品前都需要经过严格的测试&#xff0c;包括功…

物联网数据解析实战:掌握CJSON库核心函数,精准处理JSON数据

物联网数据解析实战&#xff1a;掌握CJSON库核心函数&#xff0c;精准处理JSON数据 CJSON库是一个轻量级的JSON解析库&#xff0c;专为C语言设计&#xff0c;适用于嵌入式系统和物联网应用。它提供了简单易用的API&#xff0c;使得开发者能够轻松地解析和生成JSON数据。在本教…

【讲解下AI Native应用中的模型微调】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Elasticsearch 第四期:搜索和过滤

序 2024年4月&#xff0c;小组计算建设标签平台&#xff0c;使用ES等工具建了一个demo&#xff0c;由于领导变动关系&#xff0c;项目基本夭折。其实这两年也陆陆续续接触和使用过ES&#xff0c;两年前也看过ES的官网&#xff0c;当时刚毕业半年多&#xff0c;由于历史局限性导…