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

实验:串口通信

/*************************************************
 * 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> "); // 发送提示符
    }
}

相关文章:

  • electron-vite 应用打包自定义图标不显示问题
  • 互联网大厂Java求职面试:从Java核心到微服务的深度探索
  • 淘宝tb.cn短链接生成
  • leetcode--盛最多水的容器,接雨水
  • 《Crawl4AI 爬虫工具部署配置全攻略》
  • Spring Boot 中多线程的基础使用
  • 如何将 Apache Paimon 接入 Ambari?完整部署与验证指南
  • React19 useOptimistic 用法
  • AI如何重塑CC防护行业?五大变革与实战策略解析
  • 3. 使用idea将一个git分支的部分提交记录合并到另一个git分支
  • 手机充电进入“秒充“时代:泡面刚下锅,电量已满格
  • 4月27号
  • Redis05-进阶-主从
  • 一周学会Pandas2 Python数据处理与分析-Pandas2数据信息查看操作
  • 文心一言开发指南06——千帆大模型平台新手指南
  • redis常用集合操作命令
  • 4月27日星期日今日早报简报微语报早读
  • 力扣hot100_子串_python版本
  • 8.Excel:数据验证和下拉列表
  • 大学之大:索邦大学2025.4.27
  • 【社论】优化限购限行,激发汽车消费潜能
  • 日韩 “打头阵”与美国贸易谈判,汽车、半导体产业忧虑重重
  • 找化学的答案,解人类的命题:巴斯夫的“变革者”成长之道
  • 中公教育薪酬透视:董监高合计涨薪122万,员工精简近三成
  • 幸福航空取消“五一”前航班,财务人员透露“没钱飞了”
  • 新加坡选情渐热:播客、短视频各显神通,总理反对身份政治