pic16f877单片机TMR0的使用笔记
一、结构
1、是一个8位宽的由时钟信号上升沿触发的循环累加计数寄存器
2、有一个专门的外部触发信号输入端(T0CKI)
3、是一个在文件寄存区域内统一编址的寄存器,地址为01H或101H,用户用软件的方式可直接读/写计数器的内容
4、具有一个软件可编程的8位预分频器
二、特点
1、使用内部触发信号,即指令周期作为时钟信号源时,模块TMR0工作于定时方式,触发方式为固定上升沿触发有效。计数器溢出时,相应的溢出中断标志T0IF自动置位,并可产生溢出中断
2、当外部时钟信号源时,TMR0工作于计数方式,触发方式可由程序设置为上升沿触发或者下降沿触发有效。在计数器溢出时,也可以产生溢出中断。
三、相关寄存器
1、定时器/计数器寄存器 TMR0,8位累加
2、选项寄存器 OPTION_REG
3、中断控制寄存器 INTCON
4、端口方向寄存器 TRAISA (RA4作为外部触发端口)
四、使用方式
1、查询法
1 void main() 2 { 3 unsigned int num; 4 /* 5 预分频器1:256,赋值61 256-61=195 6 */ 7 OPTION = 0x70;//使用预分频器 8 TMR0 = 61;//计数器/定时器寄存器赋值 约等于50ms 9 10 while(1) 11 { 12 if(1 == T0IF)//判断溢出 13 { 14 T0IF = 0;//标志位清零 15 num++; 16 if(20 == num)//1s 17 { 18 num = 0; 19 //功能1 20 { 21 22 } 23 } 24 } 25 } 26 }
2、中断法
使用到的寄存器 INTCON
1 void main() 2 { 3 unsigned int num; 4 /* 5 预分频器1:256,赋值61 256-61=195 6 */ 7 OPTION = 0x70;//使用预分频器 8 INTCON = 0xa0;//开总中断;开定时器中断 9 TMR0 = 61;//计数器/定时器寄存器赋值 约等于50ms 10 11 while(1) 12 { 13 if(20 == num){ 14 num = 0;//计数清零 15 //功能1 16 { } 17 18 } 19 } 20 } 21 22 void interrupt timer0() //中断函数不需要调用 23 { 24 //注意进入中断T0IF已经置1 25 T0IF = 0;//标志位清零 26 TMR0 = 61; 27 num++; 28 }