中断号与对应中断源
- 引脚P32控制外部中断源INT0,引脚P33控制外部中断源 INT1
- 串口中断为中断号4
IE寄存器
TMOD寄存器
注:
- M1 M0代表工作模式
00 模式0
01 模式1
10 模式2
11 模式3
外部中断
外部中断初始化(以INT0为例)
初始化IE寄存器
- EA = 1
- EX0 = 1
初始化INT0
- IT0 = 1
定时器中断
定时器中断初始化(以TF0为例)
初始化TF0
- TMOD 配置后四位 0001
- TH0 TH1 设置所需初始值
- TR0 = 1
初始化IE寄存器
- EA = 1
- ET0 = 1
定时计数器(以T0为例)
- T0共16位,TH0代表高8位,TL0代表低8位
- T0最大定时时间为65535us
代码实现
/*
外部中断
中断源为INT0时,按下P32,进入中断
中断源为INT1时,按下P33,进入中断
*/
#include <STC15F2K60S2.H>
void INT0_Init();
void Delay(unsigned int x);
void main()
{
INT0_Init();
while(1){
P2 = (P2 & 0x1f) | 0x80;
P00 = 0;
P2 &= 0x1f;
}
}
void Service_INT0() interrupt 0 // 由P32控制
{
P2 = (P2 & 0x1f) | 0x80;
P00 = 1;
P2 &= 0x1f;
Delay(1000);
}
void Delay(unsigned int x) //@11.0592MHz
{
unsigned char i, j;
while(x --){
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void INT0_Init(){
IT0 = 1;
EX0 = 1;
EA = 1;
}
/*
定时器中断
频闪LED,周期为2s
注意令TR0 = 1使T0启动
*/
#include <STC15F2K60S2.H>
void TF0_Init();
void main()
{
TF0_Init();
while(1){
}
}
unsigned char count;
void Service_TF0() interrupt 1
{
TH0 = (65535 - 10000) / 256;
TL0 = (65535 - 10000) % 256;
count ++;
if(count == 100){
P2 = (P2 & 0x1f) | 0x80;
P00 = (~P00);
P2 &= 0x1f;
count = 0;
}
}
void TF0_Init(){
TMOD = (TMOD & 0xf0) | 0x01;
// 设置初始时间,距结束1ms
TH0 = (65535 - 1000) / 256;
TL0 = (65535 - 1000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1; // T0启动
}
/*
定时器时钟的数码管显示
*/
#include <STC15F2K60S2.H>
code unsigned char tab[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xbf};
void TF0_Init();
void Delay(unsigned int x);
void Display(unsigned char com, num);
unsigned char sec, min, hour;
void main()
{
TF0_Init();
while(1){
Display(3, 10);
Display(6, 10);
Display(1, hour / 10);
Display(2, hour % 10);
Display(4, min / 10);
Display(5, min % 10);
Display(7, sec / 10);
Display(8, sec % 10);
}
}
void Service_TF0() interrupt 1
{
static unsigned int count;
TH0 = (65535 - 10000) / 256;
TL0 = (65535 - 10000) % 256;
count ++;
if(count >= 100){
count = 0;
sec ++;
if(sec >= 60){
sec = 0;
min ++;
if(min >= 60){
min = 0;
hour ++;
if(hour >= 24)
hour = 0;
}
}
}
}
void TF0_Init(){ // 每10ms进入一次
TMOD = (TMOD & 0xf0) | 0x01;
TH0 = (65535 - 10000) / 256;
TL0 = (65535 - 10000) % 256;
ET0 = 1;
EA = 1;
TR0 = 1;
}
void Display(unsigned char com, num){
P2 = (P2 & 0x1f) | 0xc0;
P0 = (0x01 << (com - 1));
P2 = 0xff;
P2 = (P2 & 0x1f) | 0xe0;
P0 = tab[num];
P2 = 0xff;
Delay(1);
P2 = (P2 & 0x1f) | 0xc0;
P0 = (0x01 << (com - 1));
P2 = 0xff;
P2 = (P2 & 0x1f) | 0xe0;
P0 = 0xff;
P2 = 0xff;
}
void Delay(unsigned int x) //@11.0592MHz
{
unsigned char i, j;
while(x --){
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}