单片机中断系统编程,2
发布日期:2021-05-07 10:13:02 浏览次数:38 分类:精选文章

本文共 1552 字,大约阅读时间需要 5 分钟。

定时器控制与键盘输入处理

定时器配置

本程序主要使用两种定时器,分别用于不同的功能模块。定时器0和定时器1的配置方式各有不同,具体实现如下:

定时器0配置

  • 波特率:设置为4800(通过定时器1实现)
  • 自动装载:使用定时器1的自动装载功能(TMOD |= 0x20)
  • 初始值:高8位设置为0x100,低8位设置为0x100(TL1 = 0x30,TH1 = 0x30)
  • 中断处理:允许中断源ET1为1(ET1 = 1)

定时器1配置

  • 波特率:设置为2400(默认模式)
  • 中断处理:允许中断源ET0为1(ET0 = 1)

键盘输入处理

键盘输入通过中断处理进行响应,分别为以下功能:

键盘中断处理

  • 键盘0中断:对应键3,延迟10次后检查键状态
  • 键盘1中断:对应键4,延迟10次后检查键状态

串口通信

串口配置为:

串口配置

  • 双倍频:通过SMOD = 1实现(PCON |= 0x80)
  • 波特率:默认2400
  • 中断控制:打开串口中断(ES = 1)

中断服务函数

定时器中断

  • 定时器0中断(INT0):每500次定时器中断触发一次
  • 定时器1中断(INT1):每1000次定时器中断触发一次

串口中断

  • 串口中断(INT4):用于接收和发送数据

数据处理逻辑

数据接收

  • 接收数据:通过SBUF存储
  • 数据处理:自动清零(RI |= 0)

数据发送

  • 发送数据:通过SBUF发送
  • 自动清零:TI |= 0

总体结构

程序主要包括以下部分:

初始化函数

void yvchuli() {    // 定时器0和1配置    TMOD |= 0x20;    // 定时器1自动装载    TH1 = 0x30;     // 波特率设置    TL1 = 0x30;     // 波特率设置    TR1 = 1;         // 启动定时器1    ET1 = 1;         // 允许定时器1中断    PCON |= 0x80;    // 启用双倍频    SCON |= 0x50;    // 配置串口    ES = 1;          // 允许串口中断    EA = 1;          // 允许中断}

主函数

void main() {    yvchuli();    // 初始化    P2 = 0x00;   // 初始化输入端    while(1) {        // 等待串口中断或定时器中断    }}

中断处理函数

void t0() interrupt 1 {    // 定时器0中断服务    a++;    if(a >= 1000) {        P2 = 0xff;  // 全部LED亮起        a = 0;    }}void t1() interrupt 3 {    // 定时器1中断服务    x++;    if(x >= 1000) {        P2 = 0x0f; // LED4亮起        x = 0;    }}void chuankou() interrupt 4 {    // 串口中断服务    receive = SBUF;  // 接收数据    RI = 0;           // 清零接收标志    SBUF = receive;   // 保存接收数据    while(TI == 0);    // 等待发送完成    TI = 0;           // 清零发送标志}

功能总结

本程序通过定时器和串口配置,实现了多种功能,包括:

  • 多个定时器的中断处理
  • 键盘输入响应
  • 串口数据传输
  • LED显示控制

程序结构清晰,中断处理高效,适用于多个定时任务的同时执行。

上一篇:单片机中断系统编程,3
下一篇:单片机中断系统编码,1

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月19日 16时35分39秒