找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 30|回复: 0
打印 上一主题 下一主题
收起左侧

通过串口发送01、02、03控制51单片机p10输出5Khz,30、60、90%占空比pwm波

[复制链接]
跳转到指定楼层
楼主
ID:880573 发表于 2026-1-16 18:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg52.h>

  2. // 定义端口
  3. sbit PWM_OUT = P1^0;

  4. // PWM参数定义
  5. #define PWM_PERIOD 200    // PWM周期200μs(对应5KHz)
  6. unsigned int high_time = 60; // 默认高电平时间60μs(30%占空比)
  7. unsigned int count = 0;      // 定时器计数变量

  8. // 串口初始化函数(9600波特率,晶振11.0592MHz)
  9. void UART_Init() {
  10.     TMOD |= 0x20;  // 定时器1工作在模式2(8位自动重装)
  11.     TH1 = 0xFD;    // 9600波特率初值(11.0592MHz)
  12.     TL1 = 0xFD;
  13.     TR1 = 1;       // 启动定时器1
  14.    
  15.     SCON = 0x50;   // 串口工作在模式1,允许接收
  16.     EA = 1;        // 开启总中断
  17.     ES = 1;        // 开启串口中断
  18. }

  19. // 定时器0初始化(用于PWM生成,1μs中断一次)
  20. void Timer0_Init() {
  21.     TMOD |= 0x01;  // 定时器0工作在模式1(16位定时器)
  22.     TH0 = (65536 - 10) / 256;  // 11.0592MHz晶振,10μs中断一次
  23.     TL0 = (65536 - 10) % 256;
  24.     ET0 = 1;       // 开启定时器0中断
  25.     TR0 = 1;       // 启动定时器0
  26. }

  27. // 定时器0中断服务函数(生成PWM)
  28. void Timer0_ISR() interrupt 1 {
  29.     // 重装定时器初值
  30.     TH0 = (65536 - 10) / 256;
  31.     TL0 = (65536 - 10) % 256;
  32.    
  33.     count += 10;   // 累计时间(每次中断10μs)
  34.    
  35.     // PWM生成逻辑
  36.     if(count < high_time) {
  37.         PWM_OUT = 1;  // 高电平
  38.     } else if(count < PWM_PERIOD) {
  39.         PWM_OUT = 0;  // 低电平
  40.     } else {
  41.         count = 0;    // 周期重置
  42.     }
  43. }

  44. // 串口中断服务函数(接收指令)
  45. void UART_ISR() interrupt 4 {
  46.     unsigned char cmd;
  47.     if(RI) {        // 接收中断标志位
  48.         RI = 0;     // 清除接收中断标志
  49.         cmd = SBUF; // 读取接收的数据
  50.         
  51.         // 根据指令设置占空比
  52.         if(cmd == 0x01) {
  53.             high_time = 60;  // 30%占空比(60μs高电平)
  54.         } else if(cmd == 0x02) {
  55.             high_time = 120; // 60%占空比(120μs高电平)
  56.         } else if(cmd == 0x03) {
  57.             high_time = 180; // 90%占空比(180μs高电平)
  58.         }
  59.     }
  60. }

  61. // 主函数
  62. void main() {
  63.     UART_Init();    // 初始化串口
  64.     Timer0_Init();  // 初始化定时器0
  65.     PWM_OUT = 0;    // 初始电平置低
  66.    
  67.     while(1) {
  68.         // 主循环空操作,PWM和串口由中断处理
  69.     }
  70. }
复制代码

评分

参与人数 2黑币 +80 收起 理由
wpppmlah + 30 很给力!
admin + 50 共享资料的奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表