C51单片机——开发学习:中断
中断:简单来说就是硬件的优先级管理。
目的:实现异步事件处理和实时响应
类似c语言学习中,{ },[ ],( )。大括号,中括号,小括号在程序响应过程中的顺序排列。
在硬件51单片机中:中断个数一般在5~10个。受到cpu性能限制。
今天具体要讲的中断包括(实时响应):默认优先级最高的enit0;计数:异步通信:串口回环;
从图中可以看到,中断的调用都需要发送请求。
一般来说包括三个部分:
void eint0 ()//中断响应条件(发送中断开始的初始条件)
void main()//调用中断
viod interrupt0//中断响应(中断中具体信息)
示例1.中断控制数码管显示。按下按键k3数码管显示数字加一,按下按键k4数码管显示数字减一。
#include<reg51.h>
sbit K3 = P3^2; // 按键K3连接到INT0 (P3.2)
sbit K4 = P3^3; // 按键K4连接到INT1 (P3.3)// 全局计数变量(0-9循环)
unsigned char count = 0; // 数码管段码(共阴极)
unsigned char code shumaguan[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 延时函数(约1ms@11.0592MHz)
void delay(unsigned int i) {while(i--);
}// 外部中断0初始化(K3按键)
void eint0_init(void) {IT0 = 1; // 下降沿触发EX0 = 1; // 使能INT0中断EA = 1; // 开总中断
}// 外部中断1初始化(K4按键)
void eint1_init(void) {IT1 = 1; // 下降沿触发EX1 = 1; // 使能INT1中断EA = 1; // 开总中断
}void main(void) {// 初始化:显示数字0P0 = shumaguan[count]; // 设置数码管初始值P2 = 0x08; // 位选控制(假设选择第3位数码管)// 初始化中断eint0_init();eint1_init();while(1) {P2 = 0x08; // 保持数码管选通delay(1000); // 主循环延时(防止单片机全速运行)}
}// 外部中断0服务函数(K3按下:计数+1)
void eint0_handler(void) interrupt 0 {// 按键消抖(关键!避免多次触发)delay(10); // 约10ms消抖延时if(K3 == 0) { // 二次确认按键按下count = (count + 1) % 10; // 0-9循环计数P0 = shumaguan[count]; // 更新数码管显示// 等待按键释放(防重复触发)while(K3 == 0);}
}// 外部中断1服务函数(K4按下:计数-1)
void eint1_handler(void) interrupt 2 {// 按键消抖delay(10);if(K4 == 0) {count = (count == 0) ? 9 : count - 1; // 0→9循环P0 = shumaguan[count];// 等待按键释放while(K4 == 0);}
}
示例2.uart串口回环。
void uart_init(void)
{unsigned char mod = 0;//SCON = 0x50;串口通信,波特率和定时器关系SM0 = 0;SM1 = 1;REN = 1;PCON &= ~(1<<7);//定时器1工作模式寄存器TMOD处理 C/T=0;方式2;重新装入值FDH。mod = TMOD;mod &= ~(0xf<<4);mod |= (0x02<<4);TMOD = mod;TL1 = 0xfd;TH1 = 0xfd;TR1 = 1;
}
void uart_send_byte(unsigned char dat)
{TI = 0;SBUF = dat;while(!TI);
}
void uart_recv_byte()
{unsigned char dat = 0;while(!RI);dat = SBUF;RI = 0;}
void main(void)
{unsigned char dat = 0;char buf[10] = {"hello"};unsigned char i = 0;P2 = 0x55;timer0_init();uart_init();while(1){dat = uart_recv_dyte();uart_send_byte(dat);}
}void timer0_handler(void) interrupt 1
{delay_flag = 1;
}