串口每隔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”不能接受空数据。怎么解决啊