欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 841|回復: 3
打印 上一主題 下一主題
收起左側

通過串口發送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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:320097 發表于 2026-2-2 22:10 | 只看該作者
弱弱的問一句,這代碼是怎么復制到帖子里的,我只能當純文本復制過來,這個像圖片一樣帶行數的是怎么弄的,我發的就是這樣的
void init_uart( )                //2400bps@11.0592MHz
        {
         PCON &= 0x7F;                //波特率不倍速
         SCON = 0x50;                //8位數據,可變波特率
         AUXR &= 0xFB;                //定時器時鐘12T模式
         BRT = 0xF4;                        //設置定時重載值
         AUXR |= 0x01;                //串口1使用獨立波特率發射器為波特率發生器
         //AUXR |= 0x10;                //啟動獨立波特率發射器
        }
回復

使用道具 舉報

板凳
ID:654797 發表于 2026-2-17 09:44 來自觸屏版 | 只看該作者
歐陽云天 發表于 2026-2-2 22:10
弱弱的問一句,這代碼是怎么復制到帖子里的,我只能當純文本復制過來,這個像圖片一樣帶行數的是怎么弄的, ...

在發送信息的窗口上有對尖括號,那是插入代碼的地方,把你的代碼插進去就行了
回復

使用道具 舉報

地板
ID:1165569 發表于 2026-2-28 11:33 | 只看該作者
不錯的代碼,學習中
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表