RD8T37 系列单片机内部的 Timer0 和 Timer1 是两个 16 位定时器/计数器,它们具有计数方式和定时方式两种工作模式。特殊功能寄存器 TMOD 中有一个控制位 C/TX 来选择 T0 和T1 是定时器还是计数器。它们本质上都是一个加法计数器,只是计数的来源不同。定时器的来源为系统时钟或者其分频时钟,但计数器的来源为外部管脚的输入脉冲。只有在 TRx=1 的时候,T0 和 T1 才会被打开计数。
计数器模式下,P0.2/T0 和 P0.3/T1 管脚上的每一个脉冲,T0 和T1的计数值分别增加 1。定时器模式下,可通过特殊功能寄存器 TMCON 来选择T0和 T1 的计来源是 sys/12 或 fsys (fsys 为分频后的系统时钟)。
定时器/计数器 T0 有4 种工作模式,定时器/计数器 T1有 3 种工作模式(模式三不存在):
1.模式 0: 13 位定时器/计数器模式
2.模式 1: 16 位定时器/计数器模式
3.模式 2: 8 位自动重模式
在上述模式中,T0 和 T1 的模式 0、1、2 都相同,模式3 不同。
/*TIMER*/sfr TCON =0X88;//定时器控制寄存器sfr TMOD =0X89;//定时器工作模式寄存器sfr TL0 =0X8A;//定时器0低8位sfr TL1 =0X8B;//定时器1低8位sfr TH0 =0X8C;//定时器0高8位sfr TH1 =0X8D;//定时器1高8位
voidTimer0Iint(void){ TMOD |=0x01;// 配置定时器0为 16位定时器, TH0、TL0全用TH0 =(65536-1000)/256;//1000us定时,即1毫秒溢出产生中断TL0 =(65536-1000)%256;//1000us定时,即1毫秒溢出产生中断ET0 =1;//开启定时器0中断EA =1;//开启全局中断TR0 =1;//定时器0开始计数;}
voidTimer0() interrupt1{//每次产生中断后初始化定时器初值, 1ms秒产生1次中断TH0=(65536-1000)/256; TL0=(65536-1000)%256;//500毫秒执行次LED1反转count++;if(count==500) { LED1 = ~LED1;count=0; } }
main.c代码如下:
#include"RD8T37x_C.H"sbit LED1 = P3^1; sbit LED2 = P3^2;staticuint32_tcount =0;voidLED_Init(void){ P3CON |=0x06;//P31输出}voidTimer0Iint(void){ TMOD |=0x01;// 配置定时器0为 16位定时器, TH0、TL0全用TH0 =(65536-1000)/256;//1000us定时,即1毫秒溢出产生中断TL0 =(65536-1000)%256;//1000us定时,即1毫秒溢出产生中断ET0 =1;//开启定时器0中断EA =1;//开启全局中断TR0 =1;//定时器0开始计数;}voidmain(void){LED_Init();Timer0Iint();while(1); }voidTimer0()interrupt 1{//每次产生中断后初始化定时器初值, 1ms秒产生1次中断TH0=(65536-1000)/256; TL0=(65536-1000)%256;//500毫秒执行次LED1反转count ++;if(count ==500) { LED1 = ~LED1; count =0; } }
下载到开发板后就实现P3.1闪灯了。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !