揚331 2021-06-11 19:54 采纳率: 0%
浏览 14

串口通信发送随机数,控制舵机

串口每隔1秒(大概)向上位机发送一个随机数;同时,通过串口中断接收用户的命令,并根据命令控制舵机转动的角度

  • 写回答

1条回答 默认 最新

  • xiaobuding_QAQ 2023-12-13 09:01
    关注

    AT89C51实现串口每隔1秒发送一个随机数,并通过串口中断接收用户命令的示例代码:

    
    #include <regx52.h>
    
    #define BAUD_RATE 9600
    
    // 定义串口通信参数
    void InitUART() {
        TMOD |= 0x20;   // Timer 1, Mode 2 (8-bit auto-reload)
        SCON = 0x50;    // Use Timer 1 as Baud Rate Generator, Enable UART
        TH1 = 256 - (11059200UL/(12UL*32UL*BAUD_RATE));   // Set Baud Rate to 9600
        TR1 = 1;        // Start Timer 1
        TI = 1;         // Indicate UART is ready for transmission
    }
    
    // 随机数生成函数
    unsigned char GenerateRandomNumber() {
        return (unsigned char) (rand() % 256);
    }
    
    // 定时器中断服务例程
    void Timer1_ISR() interrupt 3 {
        static unsigned char count = 0;
        static unsigned char randomNumber = 0;
        
        count++;
        if (count >= 50) {  // 1秒钟产生一次中断
            randomNumber = GenerateRandomNumber();
            SBUF = randomNumber;   // 发送随机数
            while (!TI);    // 等待发送完成
            TI = 0;         // 清除发送标志位
            count = 0;      // 重置计数器
        }
    }
    
    // 串口中断服务例程
    void UART_ISR() interrupt 4 {
        if (RI) {   // 接收到数据
            unsigned char command = SBUF;
            RI = 0; // 清除接收标志位
            
            // 根据收到的命令执行相应的操作
            switch (command) {
                case 'A':
                    // 执行 A 命令操作
                    break;
                case 'B':
                    // 执行 B 命令操作
                    break;
                default:
                    // 未知命令,不做处理
                    break;
            }
        }
    }
    
    // 主程序入口
    void main() {
        InitUART(); // 初始化串口通信
        
        // 配置定时器1产生中断
        ET1 = 1;    // 允许定时器1中断
        EA = 1;     // 使能总中断
        TR1 = 1;    // 启动定时器1
        
        while (1) {
            // 主程序循环
        }
    }
    

    舵机控制部分参考我的博客文章两款舵机SG90和MG90S的对比和简单应用

    评论

报告相同问题?

悬赏问题

  • ¥20 matlab计算中误差
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊