51单片机串口中断接收与发送代码示例

版权申诉
0 下载量 7 浏览量 更新于2024-06-26 收藏 23KB DOCX 举报
"该文档是关于单片机C51串口中断接收和发送的示例代码,通过中断实现串口通信,同时包含了初始化串行通信、发送字符、发送字符串以及中断服务函数的详细实现。" 在单片机编程中,串口通信是一种常用的数据传输方式,特别是在51系列单片机中,它使用简单、接口方便。在这个例子中,重点讨论了如何利用中断机制来处理串口接收和发送。中断允许单片机在执行其他任务时,一旦有串行数据到来,可以立即暂停当前任务,优先处理串口事件,提高实时性。 首先,`init_serilcomm()` 函数用于初始化串行通信。设置 `SCON` 寄存器为模式1,8位工作模式,并开启接收允许(REN)。同时,设置 `TMOD` 寄存器为计数器模式2,以便用定时器1来产生波特率。`PCON` 设置 `SMOD=1` 以倍增波特率。然后,打开串行中断(通过设置 `IE` 中的 `ES` 位)并启动定时器1。注意,`TI` 位通常在发送完一个字符后需要手动清零,但在初始化时,通常将其设为1,表示准备好发送。 发送字符和字符串的部分由 `send_chr_com()` 和 `send_string_com()` 实现。`send_chr_com()` 直接将字符发送到 `SBUF`,并在发送完成后清零 `TI`。`send_string_com()` 则循环调用 `send_chr_com()`,依次发送字符串中的每个字符。 串口接收中断服务函数 `seril()` 在中断向量4(即串行口中断)触发时执行。在中断处理中,首先检查 `RI` 位,如果为1,表示接收缓冲区中有新数据。读取 `SBUF` 获取数据,根据数据的范围进行处理。在这里,还进行了简单的校验和计算,当接收数据达到预设长度 `INBUF_LEN` 且校验和正确时,设置标志位 `red_flg`,表示接收完成。 这个例子展示了如何使用中断处理串口通信,确保数据的及时接收与正确性检验。对于开发基于51单片机的串口通信应用,这是一个基础且重要的参考示例。通过中断方式处理串口接收,可以避免频繁查询串口状态,减少CPU资源的占用,提高系统的效率。