zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

单片机设计定时器中断服务程序

单片机 设计 中断 定时器
2023-09-14 09:14:29 时间

目录

1、概述

2、原理

3、硬件和软件设备

4、步骤(含代码)

 5、结果


1、概述

 (1)熟悉定时器的使用。

(2)在中断服务程序中实现流水灯控制,有两个按钮,1个是系统开始工作按钮,一个是系统停止按钮。

(3)掌握单片机定时器中断服务程序的设计方法。

2、原理

  (1)8051单片机内部有两个16位可编程定时/计数器,记为TO和TL 8052单片机内除了TO和T1之外,还有第三个16位的定时器/计数器,记为T2。它们的工作方式可以由指令编程来设定,或作定时器用,或作外部脉冲计数器用。定时器TO由特殊功能寄存器TL0和TH0组成,定时器TI 由特殊功能寄存器TLI 和TH1 .组成。定时器的工作方式由特殊功能寄存器TMOD编程决定,定时器的运行控制由特殊功能寄存器TCON编程控制。T0、T1在作为定时器时,规定的定时时间到达,即产生一个定时器中断, CPU转向中断处理程序,从而完成某种定时控制功能。T0、T1用作计数器使用时也可以申请中断。作定时器使用时,时钟由单片机内部系统时钟提供;作计数器使用时,外部计数脉冲由P3口的P3. 4(或P3. 5)即T0(或T1)引脚输入。

(2)对51单片机定时器中断程序的实现先要定义好定时器的初值不管你使用多大的晶振,使用51单片机,-般都是12分频出来,也就可以得出一个机器周期,
机器周期=12/n(n指晶振频率),假设你要定时的时间为M,那么定时的初值为:
M/机器周期=初值;
THO= (65536 -初值) % 256 ;
TLO= (65536 -初值) /256 ;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值。

 (3)工作方式寄存器TMOD:

 (4)定时器/计数器控制寄存器TCON:

3、硬件和软件设备

(1)Protues软件中器件:AT89C51芯片、开关、电阻、电容、晶振、发光二极管、直流电源、开关。

(2)Keil软件中外部中断相关程序设计。

4、步骤(含代码)

(1)先画一个程序框图,有一个大体思路。

(2)对硬件进行设计:选元件、接线、调试等一系列内容。

(3)对软件进行编程:为了实现实验目标,先在程序中写出相关头文件,本实验用到了字符循环左移,所以用到了#include <intrins.h>;然后定义变量,实验用到了按钮,对按钮进行了位定义;因为要在P3.4引脚处接一个按钮,作开始按钮,按下后8个LED灯依次闪烁,设计一个停止按钮,按下后灯停止闪烁;在主函数中用到了if语句实现了对按钮的控制,让八个灯依次闪烁,用中断函数得到了实现。然后编译调试生成.hex文件,程序设计:

#include<reg52.h>
 #include<intrins.h>
 #define uchar unsigned char
 #define uint unsigned int
 sbit P3_4=P3^4;
 sbit P3_5=P3^5;
 char i=100;
		 
 void main()			 //主函数
{	
 if	(P3_4==0)
	{
     TMOD=0x01;
	 TH0=0Xee;
	 TL0=0x00;
	 P1=0xfe;
	 EA=1;
	 ET0=1;
	TR0=1;
	 while(1)
	 {
	  ;
	 }
	}
else {P1=0Xff;}
 }

		


void time0() interrupt 1		   //T0的中断函数
{
 TH0=0xee;					   //重新赋初值
 TL0=0x00;
 i--;
  if(i<=0)
	 {
	  P1=_crol_(P1,1)	;			  //左移1位

	  i=100;			   //重置循环次数
	 }
 else if(P3_5==0)
	{
	 P1=0xff;
	 }
		
 }	 


(4)对Protues中电路和Keil进行联调。硬件设计:

 5、结果

(1)对Protues进行仿真:当把引脚P3.4处的按钮按下时,8个LED灯依次闪烁。当把另一个按钮按下后灯停止闪烁分析:在软件中用到了分支结构,实现了对硬件中按钮的控制,且达到了预期目标。

(2)用软件中中断函数实现了对硬件中8个LED依次闪烁目标的实现。

(3)为了让人眼能看清楚LED灯的变换,控制8只LED灯每0.5秒闪一次,本实验用到了定时器/计数器T1、T0的编程应用。