📄 interrupt.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 + -