定时器3是一个16位自动重装载,向上计数定时器。用户可以通过配置T3PS[2:0] (T3CON[2:0])选择预分频,并写入重载值到R3H 和R3L寄存器来决定它的溢出速率。用户可以设置TR3 (T3CON.3)来开始计数。当计数跨过FFFFH,TF3 (T3CON.4)置为1,且R3H 和R3L寄存器的内容重载到内部16位计数器。如果ET3 (EIE1.1)置为1,定时器3中断服务程序被执行。当进入中断服务程序,TF3会被硬件自动清零。

定时器3同时也用作串口波特率产生定时器,详细内容请参考章节13.5“波特率”

用户可以设置TR3 (T3CON.3)来开始计数。当计数跨过
FFFFH,TF3 (T3CON.4)置为1,且R3H 和R3L寄存器的内容重载到内部16位计数器。

如果ET3 (EIE1.1)置为1,定时器3中断服务程序被执行。当进入中断服务程序,TF3会被硬件自动清零。

定时器3同时也用作串口波特率产生定时器,详细内容请参考章节13.5“波特率”

波特率

串口的不同模式的波特率时钟源和速度是完全不同的。详见表 13–3. 用于设定不同的波特率。
在模式1或模式3,串口0的波特率时钟源可通过BRCK (T3CON.5)选择定时器1或定时器3。对于串口1,只有采用定时器3作为唯一的时钟源。

当采用定时器1作为波特率发生器,需要关闭定时器1中断。定时器1可配置为计数器或是定时器,三种工作模式都可以。典型应用中,会配置为定时器工作在自动重装载模式(定时器模式2)。如果采用定时器3作为波特率发生器,同样也需要关闭定时器3中断。

对应算式如下:

  1. #ifdef FOSC_160000
  2. RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
  3. RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
  4. #endif
  5. #ifdef FOSC_166000
  6. RH3 = HIBYTE(65536 - (1037500/u32Baudrate)); /*16.6 MHz */
  7. RL3 = LOBYTE(65536 - (1037500/u32Baudrate)); /*16.6 MHz */
  8. #endif
  1. #include "N76E003.h"
  2. #include "SFR_Macro.h"
  3. #include "Function_define.h"
  4. #include "Common.h"
  5. #include "Delay.h"
  6.  
  7. #define RELOAD_VALUE_H (65536-1500)/256
  8. #define RELOAD_VALUE_L (65536-1500)%256
  9.  
  10. /************************************************************************************************************
  11. * TIMER 2 interrupt subroutine
  12. ************************************************************************************************************/
  13. void Timer3_ISR (void) interrupt
  14. {
  15. clr_TF3;
  16. P12 = ~P12; //P0.2 toggle when TF3 interrupt
  17. printf("\n TM3 INT 0x%bX", RH3);
  18. }
  19.  
  20. /************************************************************************************************************
  21. * Main function
  22. ************************************************************************************************************/
  23. void main (void)
  24. {
  25.  
  26. Set_All_GPIO_Quasi_Mode;
  27. InitialUART0_Timer1();
  28.  
  29. RH3 = RELOAD_VALUE_H; //initial counter values
  30. RL3 = RELOAD_VALUE_L;
  31.  
  32. set_ET3; //enable Timer3 interrupt
  33. set_EA; //enable interrupts
  34. set_TR3; //Timer3 run
  35.  
  36. while();
  37. }

上面这个程序利用定时器一产生波特率,利用定时器3来进入中断。

下面这个例程是产生串口波特率的(串口一)

  1. void InitialUART1_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator
  2. {
  3. P02_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
  4. P16_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
  5.  
  6. SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
  7. T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
  8. clr_BRCK; //timer 1
  9.  
  10. #ifdef FOSC_160000
  11. RH3 = HIBYTE( - (/u32Baudrate)-); /*16 MHz */
  12. RL3 = LOBYTE( - (/u32Baudrate)-); /*16 MHz */
  13. #endif
  14. #ifdef FOSC_166000
  15. RH3 = HIBYTE( - (/u32Baudrate)); /*16.6 MHz */
  16. RL3 = LOBYTE( - (/u32Baudrate)); /*16.6 MHz */
  17. #endif
  18. set_TR3; //Trigger Timer3
  19. }
  1. #define HIBYTE(v1) ((UINT8)((v1)>>8)) //v1 is UINT16
  2. #define LOBYTE(v1) ((UINT8)((v1)&0xFF))
  1. SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1

  1.  
  1. T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1

  1. #ifdef FOSC_160000
  2. RH3 = HIBYTE( - (/u32Baudrate)-); /*16 MHz */
  3. RL3 = LOBYTE( - (/u32Baudrate)-); /*16 MHz */
  4. #endif
  5. #ifdef FOSC_166000
  6. RH3 = HIBYTE( - (/u32Baudrate)); /*16.6 MHz */
  7. RL3 = LOBYTE( - (/u32Baudrate)); /*16.6 MHz */
  8. #endif
  1. set_TR3; //Trigger Timer3

  1.  

N76E003之定时器3的更多相关文章

  1. N76E003的定时器/计数器 0和1

    定时器/计数器 0和1N76E003系列定时器/计数器 0和1是2个16位定时器/计数器.每个都是由两个8位的寄存器组成的16位计数寄存器. 对于定时器/计数器0,高8位寄存器是TH0. 低8位寄存器 ...

  2. N76E003之WDT(看门狗定时器)

    N76E003提供一个看门狗定时器(WDT),它可以配置成一个超时复位定时器用于复位整个设备.一旦由于外界干扰设备进入非正常状态或挂起,看门狗可以复位恢复系统.这有用于监测系统运行以提高系统可靠性.对 ...

  3. N76E003之IIC

    I2C 总线提供了一种串行通信方式,用在 MCU 与 EEPROM,LCD模块,温度传感器等等之间控制.I2C 用两条线 (数据线SDA 和时钟线 SCL) 在设备间传输数据.I2C 总线用作主机与从 ...

  4. N76E003之串口

    N76E003包含两个具备增强的自动地址识别和帧错误检测功能的全双工串口.由于两个串口的控制位是一样的,为了区分两个串口控制位,串口1的控制位以“_1”结尾(例如SCON_1).下述详例以串口0为例. ...

  5. N76E003的学习之路(一)

    N76E003是8051内核的一款单片机MCU,它提供丰富的特殊功能模块,包括: 1KRAM其中包括256字节SRAM,768字节XRAM. 最多可达18个标准管脚. 两组标准16位定时器/计数器:定 ...

  6. N76E003学习之路(二)

    最近一直在想N76E003和STM8M003的对比情况,在网上找了不少资料,看了不少文档,具体总结如下: STM8S003F3P6:一共20个脚,最多支持16个GPIO,支持16个外部中断:2个16位 ...

  7. 单片机成长之路(51基础篇)- 024 基于 N76E003 的按键按键状态机

    前端时间要用按键,搞了个状态机(如图): main.c #include <N76E003.H> #include <SFR_Macro.h> //N76E003 SFR寄存器 ...

  8. 单片机成长之路(51基础篇) - 023 N76e003 系统时钟切换到外部时钟

    N76e003切换到外部时钟的资料很少(因为N76e003的片子是不支持无源晶振的,有源晶振的成本又很高,所以网上很少有对N76e003的介绍).有图有真相: 代码如下: main.c #includ ...

  9. 几款一元单片机对比:CMS8S5880、STM8S003、N76E003

    大概17年开始,STM8S003的价格被贸易商炒货,变得很不稳定,一度上涨到2~3元,因为市场需求大增,小家电.无线充和一些简单功能的产品,本人就有在空气净化器.433M触摸开关.数据收发模块.红外控 ...

随机推荐

  1. 自然语言交流系统 phxnet团队 创新实训 项目博客 (十四)

    项目技术借鉴报告: 一.服务器端(Server) 1.分词 分词使用的是庖丁分词.使用盘古分词词库和词素作为辅助.其中包括下载Jar包并且使用. 2.人工神经网络 以网上已有的初级网络为蓝图,结合机器 ...

  2. 【转】]监听SMS消息/编程实现短信拦截

    当设备接收到一条新的SMS消息时,就会广播一个包含了android.provider.Telephony.SMS_RECEIVED动作的Intent.注意,这个动作是一个字符串值,SDK 1.0不再包 ...

  3. 关于Unity中粒子效果的使用

    粒子效果1: 游戏中会有很炫酷的特效,比如爆炸,水花,火焰等;2: unity提供粒子编辑器,方便特效人员来开发很炫酷的特效;3.粒子效果一般有专门的粒子特效师来做,我们只需要拿来用就好了,很多参数没 ...

  4. MongoDB MapReduce 小例子

    var map = function(){ if (this.gscode == "ZTJB"){ ymd = this.ymd; emit("maxymd", ...

  5. LintCode #3 统计数字

    解题思路请参考 代码(可以通过,不过很乱,需要整理): /// <summary> /// 计算n在数组[targetNum]中出现的次数 /// 形如:[0, 1, 2, 3, 4, 5 ...

  6. SecureCRT同时发送命令到所有主机

    有时候我们需要在多台服务器上执行相同的命令,比如安装软件,复制,粘贴,删除等等,但一台一台的去操作工作量就太大了,我们可以借助SecureCRT这款客户端远程连接工具实现这样的要求! 相关阅读: 如何 ...

  7. VS 调试 无法启动IIS Express Web 服务器(进程不存在)

    拷贝VS2015项目 出现无法启动IIS Express Web 服务器 一.把你们拷贝刀本机的解决方案文件中的隐藏文件夹.vs删除掉 重新生产解决方案就可以启动iis express了.

  8. #define中的特殊符号

    (关于#define的用法,看这里 http://www.cppblog.com/kenny/archive/2011/04/26/145087.html) #define Conn(x,y) x## ...

  9. SOA及分布式

    结合领域驱动设计的SOA分布式软件架构 Windows平台分布式架构实践 - 负载均衡(下) 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载 我终于深入参与了一 ...

  10. php 区分0和空

    能够区分出来的有2,4,6 方法 public function test(){ $test=; if($test==''){ echo '<br />在php中1,0即为空'; //被输 ...