单片机的定时器中断的学习(一)

来源:互联网 发布:网络短信软件哪个好 编辑:程序博客网 时间:2024/06/05 19:14
/***************************************************************************************              定时器0实验  *实现现象:下载程序后D1小灯循环点亮1秒,熄灭1秒。使用单片机内部定时器可以实现准确延时。注意事项:无。  ***************************************************************************************/#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int uint16;  //对数据类型进行声明定义typedef unsigned char uchar8;sbit led=P2^0; //定义P20口是led/******************************************************************************** 函 数 名         : Timer0Init* 函数功能         : 定时器0初始化* 输    入         : 无* 输    出         : 无*******************************************************************************/void Timer0Init(){TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。TH0=0XFC;//给定时器赋初值,定时1ms TL0=0X18;ET0=1;//打开定时器0中断允许EA=1;//打开总中断TR0=1;//打开定时器}/******************************************************************************** 函 数 名       : main* 函数功能 : 主函数* 输    入       : 无* 输    出     : 无*******************************************************************************/void main(){Timer0Init();  //定时器0初始化while(1);}/******************************************************************************** 函 数 名         : void Timer0() interrupt 1* 函数功能   : 定时器0中断函数* 输    入         : 无* 输    出         : 无*******************************************************************************/void Timer0() interrupt 1{static uint16 i;TH0=0X3C;//给定时器赋初值,定时50msTL0=0XB0;i++;if(i==20){i=0;led=~led;}   }
注意事项以及困惑: 
1、LED灯确实实现了1s的亮灭循环操作,而且改变后,用示波器看确实是改变了啊,有所变化。
2、中断函数里面为什么要重新赋初值,是为了防止溢出的,打比方,你不付初值的话,就会一直计数到65.53ms , 示波器验证过了,确实是的。解释一下为什么:
最搪塞人的解释就是:定时器0在工作模式1的最大定时时间就是65.53ms,所以如果不在中断里面赋初值的话,定时器会每次定时 65.53ms ,20次就是 1.31s 然后LED反复亮。
3、自己需要多加理解。
4、记住要进行初始化,然后选择定时器,然后进行选择哪种定时方式,通常为 定时器0,方式1 就可以了。
5、假如我们要让 定时器0 和 定时器1同时工作的话,TMOD的值好像有点问题,需要仔细研究研究,单片机试了一下,对定时有影响。不知道为什么,
应该是同时初始化 定时器0 和 定时器1 的时候,TMOD改变,导致的异常,如下: 
// 定时器0 方式1 定时50msvoid InitTimer0(void){    TMOD = 0x01;    TH0 = 0x3C;    TL0 = 0x0B0;    EA = 1;    ET0 = 1;    TR0 = 1;}
//定时器1  方式1 定时50ms  void InitTimer0(void){    TMOD = 0x01;    TH0 = 0x3C;    TL0 = 0x0B0;    EA = 1;    ET0 = 1;    TR0 = 1;}

显然两次的话,TMOD的值改变了,所以出现异常,那么该怎样解决呢?????
6、对于51单片机,有辅助软件,要自己会用 mcu elf 和 51初值设定 这两款软件。


 
阅读全文
0 0
原创粉丝点击