一.定时器
1.基础介绍
(1).时钟周期
- 时钟周期T是单片机时序中的最小单位,具体计算的方法就是时钟源分之一。
(2).机器周期
- 单片机完成一个操作的最短时间,51单片机的一个机器周期是12个时钟周期。
(3).定时器应用
- 定时器是用来计时的,内部有一个寄存器,开始计时后,寄存器的值每经过一个机器周期就会自动加一,可以把机器周期理解为定时器的计数周期。16位的定时器,加到65535,再加1就算溢出,溢出后值变为0。
2.定时器的寄存器
- 标准51单片机内部有T0和T1两个定时器,TH0/TH1用于T0,TH1/TH0用于T1.复位值都为0x00.
名称 | 描述 | SFR地址 |
---|---|---|
TH0 | 定时器0高子节 | 0x8C |
TL0 | 定时器0低子节 | 0x8A |
TH1 | 定时器1高子节 | 0x8D |
TL1 | 定时器1低子节 | 0x8B |
- TCON定时器控制寄存器共有8位,这里主要介绍定时器1,当程序中写TR1=1,定时器每经过一个机器周期自动加一,当程序中写TR1=0,定时器停止加一。TF1是一个标志位,作用是表明定时器溢满了。
- TMOD定时器模式寄存器,控制定时器的工作模式,模式1是THn和TLn组成一个16位的定时器,计数范围是0~65535,溢出后从0开始计数。模式1的电路示意
OSC表示时钟频率,d等于12,下边GATE右边分别是一个非门电路,或门,与门。
3.定时器使用步骤:
(1).设置特殊功能寄存器TMOD,配置工作模式;
(2).设置计数寄存器TH0和TL0的初始值;
(3).设置TCPN,通过TR0置1来让计时器开始计数;
(4).判断TCON寄存器的TF0位,监测定时器溢出情况。
4.实验例程
(1).说明:实验通过定时器控制八个LED流水灯没1s左移轮流闪烁。接线为JP11接JP12.
(2).程序源代码
/************************************** > File Name: 定时器实验 > Author: pengshp > Mail: [email protected] > Date: 2015年 7 月 19 日***************************************/#include<reg51.h>#include<intrins.h>#define GPIO_LED P2unsigned char Time;void main(){ Time=0; GPIO_LED=0x01; //最左边一个灯亮 TMOD = 0x01; //选择工作模式1 TH0 = 0x3C; //设置初始值,定时50ms TL0 = 0xB0; TR0 = 1; //启动定时器0 while(1) { if(TF0==1) //判断T0是否溢出 { TF0=0; //T0溢出后,清零中断标志 TH0 = 0x3C; TL0 = 0xB0; Time++; //计数值自加1 if(Time==20) //20*50ms=1s { GPIO_LED=_crol_(GPIO_LED,1);//左移一位 Time=0; //重新置0 } } } }
二.中断系统
1.中断基础
(1).中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去 执行相应的服务处理程序;当服务处理程序运行完毕后,CPU再返回到暂停处继续执行原来的程序。
(2)中断允许寄存器IE
位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
功能 | EA | ES | ET1 | EX1 | ET0 | EX0 |
- EA:总中断允许位。
0时:CPU屏蔽所有的中断请求。
1是:CPU开放所有中断。 - ES:串行口中断允许位。
0时:禁止串行中断。
1时:允许串行中断。 - ET1和ET0:分别是定时器1和定时器0中断允许位
0时:禁止相应的定时器中断
1时:允许相应的定时器中断 - EX1和EX0:分别是外部中断1和外部中断0的中断允许位
0时:禁止相应的外部中断
1时:允许相应的外部中断
(3).中断优先寄存器IP
位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
功能 | PS | PT1 | PX1 | PT0 | PX0 |
- PS:串行口中断优先级
1时:串行口中断定义为高优先级
0时:串行口中断定义为低优先级 - PT1和PT0:分别是定时器1和定时器0的中断优先级
1时:相应的定时器中断为高优先级
0时:相应的定时器中断为低优先级 - PX1和PX0:分别是外部中断1和外部中断0的中断优先级
1时:相应的外部中断为高优先级
0时:相应的外部中断为低优先级
(4).中断函数
void 函数名() interrupt 中断编号
{
语句;
}
2.实验例程
(1).说明:本实验通过K1控制流水的左移,K2控制流水灯右移,接线为JP11接JP12,P3.2接K1,P3.3接K2。
(2).程序源代码
/************************************** > File Name: 外部中断实验 > Author: pengshp > Mail: [email protected] > Date: 2015年 7 月 19 日***************************************/#include<reg51.h>#include<intrins.h>#define GPIO_LED P2sbit K1=P3^2; //外部中断的IOsbit K2=P3^3;void IntConfiguration();void Delay(unsigned int n);unsigned char KeyValue=0;void main(){ GPIO_LED=0x01; IntConfiguration(); while(1) { if(KeyValue) GPIO_LED=_crol_(GPIO_LED,1);//左移 else GPIO_LED=_cror_(GPIO_LED,1);//右移 Delay(2000); } }void IntConfiguration(){ EA=1; //打开总中断 //设置INT0 IT0=1; //跳变沿出发方式(下降沿) EX0=1; //打开INT0的中断允许。 //设置INT1 IT1=1; EX1=1; }void Delay(unsigned int n) //延时50us误差 0us{ unsigned char a,b; for(;n>0;n--) { for(b=1;b>0;b--) for(a=22;a>0;a--); }}void Int0() interrupt 0 //外部中断0的中断函数{ Delay(1); //延时消抖 if(K1==0) KeyValue=1;}void Int1() interrupt 2 //外部中断1的中断函数{ Delay(1); //延时消抖 if(K2==0) KeyValue=0; }
备注:定时器和中断系统的控制是学习单片机的重点也是难点,此部分要重点学习理解。
版权声明:本文为博主原创文章,未经博主允许不得转载。