当前位置: 首页 > news >正文

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;	
}

http://www.dtcms.com/a/389634.html

相关文章:

  • 树与二叉树【数据结构】
  • RPM包版本号系统解析:设计哲学、比较规则与实践指南
  • IDEA启动异常
  • vite使用vue2项目
  • 前端性能优化实用方案(一):减少50%首屏资源体积的Webpack配置
  • SQL 条件函数 IF、CASE WHEN 用法速查
  • 【深度学习新浪潮】如何估算大模型的训练和推理内存需求?
  • PyTorch查看模块/类的所有方法/属性
  • 8大Android开发框架效率翻倍
  • docker基础知识与具体实践
  • 【多模态】Simple o3 提高多模态模型准确率
  • hybrid的配置
  • 理解虚拟细胞:初学者指南
  • 哪种体量的公司或者哪些行业哪些项目需要上云服务器?
  • Linux安装问题:404 Not Found?配置源列表sources.list,修改为可用镜像源就可以了!
  • Vue3 中 props 与 $emit 的使用及 defineProps 与 defineEmits 的区别详解
  • vue的跨域配置
  • 计算机网络实验03:交换机VLAN配置
  • Vue中v-if与v-show的区别及应用场景解析
  • C++造轮子:手搓 List 容器
  • redis-list的基本介绍
  • ​​[硬件电路-247]:开关电源的工作原理、优缺点及应用场合
  • 【面试】Java中的垃圾回收算法详解
  • AI使用心得-完善中
  • rust编写web服务01-项目起步与环境准备
  • ORM框架及SQLAlchemy
  • 驱动开发---双机调试搭建支持win11(2025)
  • 驱动开发1:内核程序框架
  • 生产制造如何应对客户的订单变更
  • 深入浅出SpringMVC:从入门到实战指南