单片机_定时器/计数器

1.P0~P4口

四个并行口均可作为输入输出接口使用,但又有各自的特点。因PO口是数据线和低八位的地址线,因此不用它作输入/输出接口,而是用它传输数据和低八位的地址信息。

2.读取数据:

一般的读指令为读引脚状态,为保证可靠输入,需先输出高电平(复位后为高)

3.定时器
计数输入信号来自内部振荡信号,在每个机器周期内定时器的计数器做一次“+1”运算。因此定时器亦可视为计算机机器周期的计数器。

4.计数器 
计数输入信号来自外部引脚T0(P3.4)、T1(P3.5)上的计数脉冲,外部每输入一个脉冲,计数器做一次“+1”运算。


定时器/计数器需写入计数初值,且规定其工作方式。

1.方式控制寄存器TMOD 

2.控制寄存器TCON


五、定时器/计数器初始化编程

1.确定工作方式——对方式寄存器TMOD赋值。

2.预置定时或计数初值,直接将初值写入TL0、TH0或TL1、TH1中。
3.根据需要对中断允许寄存器有关位赋值,以开放或禁止定时器/计数器中断。
4.启动定时器/计数器,使TCON中的TR1或TR0置“1”,计数器即按确定的工作方式和初值开始计数或定时

GATE:门控信号
      GATE=0,TRi=1时即可启动定时器工作 ;
      GATE=1, TRi=1 INTi=1才可启动定时器工作。
C/T:定时器/计数器选择位
      C/T=1,为计数器方式;
      C/T=0,为定时器方式。
M1 M0  工作模式选择位
      M1M0=00    工作方式0(13位方式)。
      M1M0=01    工作方式1(16位方式)。
      M1M0=10    工作方式2(8位自动再装入方式)。
      M1M0=11    工作方式3(T0为2个8位方式)

六、计数初值的计算

设计数器最大计数值为M,选择不同的工作方式,最大计数值M不同。
    方式0:M=213=8192
    方式1:M=216=65536
    方式2、3:M=28=256
 置入计数初值X可计算如下:
① 计数方式时:
     X=M-计数值(X即为计数值的补码)
     例如:要计100个数,则计数初值X=M-100
② 定时方式时:
     (M-X)×T=定时值
     故,X=M-定时值/T
其中T为计数周期,是单片机时钟的12分频,即单片机机器周期。当晶振为6MHz时,T=2μs,当晶振为12MHz时,T=1μs。


七、串行口

MCS-51系列单片机有一个全双工的串行接口,可进行异步串行接收和串行发送,可编程选择四种工作方式,波特率可由用户设置。
通过引脚RXD(P3.0串行数据接收端)和引脚TXD(P3.1串行数据发送端)与外界进行通信。

八、特殊功能寄存器

数据缓冲器 SBUF 


串行口控制寄存器 SCON

特殊功能寄存器 PCON

九波特率发生器
① 定时器T1作波特率发生器,改变计数初值就可以改变串行通信的速率,称为可变波特率。
② 以内部时钟的分频器作波特率发生器,因内部时钟频率一定,称为固定波特率

十、单片机如何接收数据

在接收方式下,串行数据通过RXD(P3.0)进入单片机。当接收控制器检测到接收端RXD的负跳变时,启动接收过程,则串行口按照程序设定的格式、以一定的频率(波特率)接收一帧数据,接收完毕,数据存入接收缓冲器SBUF中,并置RI为1。

在发送方式下,通过CPU执行  MOV  SBUF, A指令启动发送过程,数据由TXD(P3.1)一位一位的发出,发送完最后一位,将TI置1。


方式0
方式0为同步移位寄存器输入/输出方式,可外接移位寄存器,以扩展I/O口,也可接同步输入/输出设备。
RXD作为移位寄存器的输入输出口,TXD提供移位时钟脉冲,频率为振荡器频率的1/12。移位数据的发送和接收以8位为一组,低位在前,高位在后。

串行口小结:

在串行通信编程中,如果是方式1和方式3,必须对定时计数器T1进行初始化以选择波特率。发送过程是先发送后检查TI;接收过程是先检查RI后接收。无论发送或接收前应先清状态TI或RI,无论是查询方式或中断方式,发送或接收后都不会自动清状态标志,必须用程序清零TI和RI。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
定时器/计数器是嵌入式系统中常用的模块,可以用来实现计时、延时、PWM输出等功能。下面介绍一些常见的定时器/计数器的定时实验。 1. 延时实验 使用定时器/计数器实现延时功能,一般是通过设置定时器/计数器的初值和计数模式来实现的。以 8051 单片机定时器为例,可以使用以下代码实现延时 1 秒: ```c #include <reg51.h> void delay() { TMOD = 0x01; // 设置定时器0为模式1,使用定时器模式 TH0 = 0x3C; // 设置定时器初值,定时1s TL0 = 0xAF; TR0 = 1; // 启动定时器 while(TF0 == 0); // 等待定时器溢出 TR0 = 0; // 停止定时器 TF0 = 0; // 清除溢出标志 } void main() { while(1) { P1 = 0x55; // P1口输出0x55 delay(); // 延时1s P1 = 0xAA; // P1口输出0xAA delay(); // 延时1s } } ``` 2. 计时实验 使用定时器/计数器实现计时功能,一般是通过设置定时器/计数器的时钟源和计数模式来实现的。以 AVR 单片机定时器为例,可以使用以下代码实现计时 1 秒: ```c #include <avr/io.h> #include <avr/interrupt.h> volatile uint32_t timer_count = 0; // 计时器计数值 ISR(TIMER1_COMPA_vect) // 定时器1比较匹配中断服务程序 { timer_count++; // 计数器加1 } int main() { DDRB = 0xFF; // PB口设置为输出 TCCR1A = 0x00; // 定时器1模式设置为普通计数模式 TCCR1B = 0x0D; // 定时器1时钟源设置为外部时钟,分频系数为1024 OCR1A = 15624; // 定时器1比较值,计数1s TIMSK1 = (1 << OCIE1A); // 允许定时器1比较匹配中断 sei(); // 开启全局中断 while(1) { if(timer_count >= 1000) // 如果计时器计数值达到1s { PORTB = ~PORTB; // PB口翻转 timer_count = 0; // 计数器清零 } } return 0; } ``` 3. PWM输出实验 使用定时器/计数器实现 PWM 输出功能,可以通过设置定时器/计数器的时钟源、计数模式和比较匹配值来实现。以 STM32 单片机定时器为例,可以使用以下代码实现 PWM 输出: ```c #include "stm32f10x.h" int main() { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 定时器分频系数为72 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 定时器计数值为1000 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500 - 1; // 比较匹配值为500 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); while(1); return 0; } ``` 以上是一些常见的定时器/计数器的定时实验,可以根据自己的需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值