⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt.c

📁 用KEIL开发的出租车计费系统
💻 C
字号:
/**************************************************************************
  
						Interrupt
  
	File Name:		Interrupt.c
	Author:			Lin Qian
	Created:		2008/04/27
	Modified:		NO
	Revision: 		1.0
  
***************************************************************************/

#define __INTERRUPT
#include "INC\\main.h"
#undef __INTERRUPT

// 中断初始化 ******************************
#if Interrupt_Initial_en
void Interrupt_Initial ()
{
//--- 中断全局变量赋初值 ---
//	Cnt20ms = 0;	// 20ms计数器清零
	Cnt25ms = 0;
	BT500ms = 1;

//--- 中断相关寄存器设置 ---	
	TMOD = 0x11;	// 定时器0工作模式: 1
					// 定时器1工作模式:	1

	//--- 定时器0初始化 ---
	TH0 = 0xb8;	TL0 = 0x00;		// 装入初值: 0xb800,每10ms溢出
	PT0 = 0;		// timer0中断优先级: Low
	ET0 = 1;		// 定时器0中断允许: On
	TR0 = 1;		// 定时器0启动: On

	//--- 定时器1初始化 ---
	TH1 = 0x4C;	TL1 = 0x00;	//装入初值: 0x4C00,每25ms溢出
	PT1 = 1;		// timer1中断优先级: High
	ET1 = 1;		// 定时器1中断允许: On
	TR1 = 1;		// 定时器1启动: On

/*
	//--- 定时器2初始化 ---
	T2MOD &= 0xFC;		// T2OE=0: 定时器2输出允许: Off
 	T2MOD |= 0x00;		// DCEN=0: 可以设置为向上计数
	EXF2 = 0;			// reset flag 定时器2外部标志位清除
 	TCLK = 0; RCLK = 0;	// disable baud rate generator 不用于波特率发生器
 	EXEN2 = 0;			// ignore events on T2EX 视T2EX(P1.1)端信号无效 
	C_T2 = 0;			// timer mode 定时模式
 	CP_RL2 = 1;			// reload mode Capture计时模式
	TH2 = 0x00;	TL2 = 0x05;	//装入初值
	RCAP2H = 0x00;	RCAP2L = 0x05; 	// Auto-reload value 自动装载值
	PT2 = 0;			// timer2中断优先级
 	ET2 = 0;			// enable timer2 interrupt 定时器2中断允许: Off
 	TR2 = 0;			// timer2 run 定时器2启动: Off
*/

	//--- 外中断0初始化 ---
	PX0 = 1;	// 外中断0优先级: High
	IT0 = 1;	// 外中断0触发方式: 0-电平出发;1-边沿触发
	EX0 = 1;	// 外中断0允许: On

/*
	//--- 外中断1初始化 ---
	PX1 = 0;	// 外中断1优先级: Low
	IT1 = 1;	// 外中断1触发方式: 0-电平出发;1-边沿触发
	EX1 = 0;	// 外中断1允许: Off

	//--- 串行中断初始化 ---
	SCON = 0x50;	// 工作方式: 1
					// 接收允许: On
					// 波特率: 9600kbit/s,
	PCON |= 0x80;	// SMOD = 1; 串行口波特率倍增: On
	PS = 0;			// 串行中断优先级: Low
	ES = 0;			// 串行中断允许: Off
*/

	//--- 总中断 ---
 	EA = 1;			// interupt enable 总中断允许: On
}
#endif

// 定时器0中断 ******************************
#if Timer0_en
void Timer0 ()		interrupt 1
// 功能: 数码管扫描.
{
	//--- 定时器0参数设置 ---
	TH0 = 0xb8;	TL0 = 0x00;		// 装入初值: 0xb800,每10ms溢出
	TF0 = 0;	// 清除溢出标志

	//--- Interrupt Operation ---
	Cnt10ms++;

	if( Cnt10ms >= 1 )	// 100ms标记翻转
	{
		Cnt10ms = 0;
		x74LS164_SendDigitLED();
	}
}
#endif

// 定时器1中断 ******************************
#if Timer1_en
void Timer1 ()		interrupt 3
// 功能: 系统运行时间计时及标志处理.
{
	//--- 定时器1参数设置 ---
	TH1 = 0x4C;	TL1 = 0x00;		// 装入初值: 0x4C00,每25ms溢出
	TF1 = 0;	//清除溢出标志

	//--- Interrupt Operation ---
	Cnt25ms++;
	
	if( Cnt25ms % 20 == 0 )	// 500ms标记翻转
	{
		BT500ms = ~BT500ms;
		SpeedCal();		// 计算速度
	}

	if( Cnt25ms >= 40 )	// 1s溢出
	{
		Cnt25ms = 0;
		Cnt1s++;	// 1s计数器累加
	}
}
#endif

// 定时器2中断 ******************************
#if Timer2_en
void Timer2 ()		interrupt 5
{
	//--- 定时器参数设置 ---
	TH2 = 0xe0;	TL2 = 0x00;		//装入定时器初值
	TF2 = 0;	//清除溢出标志

	//--- Interrupt Operation ---

}
#endif

// 外中断0 ******************************
#if Ex0_interrupt_en
void Ex0_interrupt ()	interrupt 0
{
	static uint CntExIntr = 0;		// 外中断计数

	//--- Interrupt Operation ---
	CntExIntr++;

	if( CntExIntr % 2 == 0 )	// 记录500ms内汽车走过的里程数
		DistIn500ms++;

	if( CntExIntr >= 5 )	// 总里程数计算(注: 成品时要该为400)
	{
		if( SysStatus == RUN )
			Dist += 15;		// 里程数累加 (注:成品时要改为1)
		CntExIntr = 0;
	}
}
#endif

// 外中断1 ******************************
#if Ex1_interrupt_en
void Ex1_interrupt ()	interrupt 2
{
	//---Interrupt Operation---

}
#endif

// 串行中断 ******************************
#if Serial_interrupt_en
void Serial_interrupt ()	interrupt 4		//串行中断
{
	uchar tmp;

	//---Interrupt Operation---
	ES = 0;	// 关闭串行中断

	if( RI )		// 接收数据处理
	{
		RI = 0;		// 清除串行接收标记
		tmp = SBUF;	// 缓存接收内容
	}
	else if( TI )	// 发送数据处理
	{
		TI = 0;	// 清除串行发送标记
	}

	ES = 1;	// 打开串行中断
}
#endif

//************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -