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

实验:串口通信

/*************************************************
 * AT89C52 串口通信实验(实用修正版)
 * 特点:
 * 1. 解决所有编译警告
 * 2. 保持代码简洁
 * 3. 完全功能正常
 ************************************************/
#include <reg52.h>

#define FOSC 11059200L  // 晶振频率
#define BAUD 9600       // 波特率

sbit LED = P1^0;        // LED连接P1.0

/* 函数声明 */
void UART_Init(void);
void UART_SendByte(unsigned char dat);
void UART_SendString(char *s);

/* 主函数 */
void main()
{
    UART_Init();        // 串口初始化
    LED = 1;            // 初始LED熄灭
    
    // 发送欢迎信息(分三次发送避免重入警告)
    UART_SendString("AT89C52 UART Ready");
    UART_SendString("\r\n1=LED ON, 0=LED OFF");
    UART_SendString("\r\n> ");
    
    while(1)
    {
        // 主循环保持空闲
    }
}

/* 串口初始化 */
void UART_Init()
{
    SCON = 0x50;        // 模式1, 8位UART, 允许接收
    TMOD = 0x20;        // 定时器1模式2
    TH1 = TL1 = 0xFD;   // 9600波特率 @11.0592MHz
    PCON = 0x00;        // SMOD=0
    TR1 = 1;            // 启动定时器1
    ES = 1;             // 允许串口中断
    EA = 1;             // 开总中断
}

/* 串口发送单字节 */
void UART_SendByte(unsigned char dat)
{
    SBUF = dat;
    while(!TI);         // 等待发送完成
    TI = 0;             // 清除发送中断标志
}

/* 串口发送字符串 - 添加重入保护 */
void UART_SendString(char *s)
{
    EA = 0;             // 禁用中断
    while(*s)
    {
        UART_SendByte(*s++);
    }
    EA = 1;             // 重新启用中断
}

/* 串口中断服务函数 */
void UART_ISR() interrupt 4
{
    if(RI)              // 接收中断
    {
        static unsigned char cmd;  // 静态变量
        
        RI = 0;         // 清除接收中断标志
        cmd = SBUF;     // 获取命令
        
        switch(cmd)
        {
            case '1':   // 开灯指令
                LED = 0;
                UART_SendString("\r\nLED ON");
                break;
                
            case '0':   // 关灯指令
                LED = 1;
                UART_SendString("\r\nLED OFF");
                break;
                
            default:    // 未知指令
                UART_SendString("\r\nUnknown cmd");
                break;
        }
        UART_SendString("\r\n> "); // 发送提示符
    }
}

http://www.xdnf.cn/news/2428.html

相关文章:

  • 02.02、返回倒数第 k 个节点
  • 2 商户查询缓存
  • 设计一个食品种类表
  • 【算法】回溯法
  • 【锂电池剩余寿命预测】Transformer锂电池剩余寿命预测(Pytorch完整源码和数据)
  • 攻击 WordPress 目标的 5 种方法
  • AtCoder Beginner Contest 242 G - Range Pairing Query (莫队)
  • 解锁现代生活的健康密码
  • 杨洋出席青岛啤酒白啤品牌活动 共赴生活美学之旅
  • 2025年应用物理与电子电气国际会议(IACSEM 2025)
  • 【Code Sprint】第一章 从零开始
  • 【Java学习笔记】类与对象
  • 前端零基础入门到上班:【Day8】JavaScript 基础语法入门
  • 【数据可视化-38】基于Plotly得泰坦尼克号数据集的多维度可视化分析
  • 给应用加速:Spring Boot集成缓存 (Caffeine Redis) 实战
  • Maven 依赖范围(Scope)详解
  • Spring Boot中@RequestParam、@RequestBody、@PathVariable的区别与使用
  • Servlet
  • AI如何重塑DDoS防护行业?六大变革与未来展望
  • 可以隐藏列的表格
  • spark 课程总结
  • 影楼精修-皮肤瑕疵祛除算法解析
  • 安卓基础(适配器和RecyclerView )
  • 富文本展示前使用DOMPurify进行文本过滤
  • T 电梯维修作业考试精选题目
  • AI大模型知识与医疗项目实践 - Java架构师面试实战
  • Haply MinVerse触觉3D 鼠标—沉浸式数字操作,助力 3D 设计与仿真
  • DeepSeek系列(10):与其他AI工具协同
  • 自然语言to SQL的评估
  • #苍穹外卖# (day 12)