?? 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 + -