久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8H系列MCU的PWM做呼吸燈

  [復制鏈接]
跳轉到指定樓層
樓主
ID:961114 發表于 2024-3-20 10:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/

  4. /* 如果要在程序中使用此代碼,請在程序中注明使用了STC的資料及程序        */
  5. /*---------------------------------------------------------------------*/


  6. /*************  功能說明    **************

  7. 本例程基于STC8H8K64U為主控芯片的實驗箱9進行編寫測試,STC8H系列芯片可通用參考.

  8. 高級PWM定時器 PWM1P/PWM1N,PWM2P/PWM2N,PWM3P/PWM3N,PWM4P/PWM4N 每個通道都可獨立實現PWM輸出,或者兩兩互補對稱輸出.

  9. 8個通道PWM設置對應P6的8個端口.

  10. 通過P6口上連接的8個LED燈,利用PWM實現呼吸燈效果.

  11. PWM周期和占空比可以根據需要自行設置,最高可達65535.

  12. 下載時, 選擇時鐘 24MHZ (用戶可自行修改頻率).

  13. ******************************************/

  14. #include "stc8h.h"       //包含此頭文件后,不需要再包含"reg51.h"頭文件
  15. #include "intrins.h"

  16. #define     MAIN_Fosc       24000000L   //定義主時鐘

  17. typedef     unsigned char   u8;
  18. typedef     unsigned int    u16;
  19. typedef     unsigned long   u32;

  20. /****************************** 用戶定義宏 ***********************************/

  21. #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中斷頻率, 1000次/秒

  22. /*****************************************************************************/

  23. #define PWM1_1      0x00        //P:P1.0  N:P1.1
  24. #define PWM1_2      0x01        //P:P2.0  N:P2.1
  25. #define PWM1_3      0x02        //P:P6.0  N:P6.1

  26. #define PWM2_1      0x00        //P:P1.2/P5.4  N:P1.3
  27. #define PWM2_2      0x04        //P:P2.2  N:P2.3
  28. #define PWM2_3      0x08        //P:P6.2  N:P6.3

  29. #define PWM3_1      0x00        //P:P1.4  N:P1.5
  30. #define PWM3_2      0x10        //P:P2.4  N:P2.5
  31. #define PWM3_3      0x20        //P:P6.4  N:P6.5

  32. #define PWM4_1      0x00        //P:P1.6  N:P1.7
  33. #define PWM4_2      0x40        //P:P2.6  N:P2.7
  34. #define PWM4_3      0x80        //P:P6.6  N:P6.7
  35. #define PWM4_4      0xC0        //P:P3.4  N:P3.3

  36. #define ENO1P       0x01
  37. #define ENO1N       0x02
  38. #define ENO2P       0x04
  39. #define ENO2N       0x08
  40. #define ENO3P       0x10
  41. #define ENO3N       0x20
  42. #define ENO4P       0x40
  43. #define ENO4N       0x80

  44. #define PWM_PERIOD  1023    //設置周期值

  45. /*************  本地變量聲明    **************/
  46. bit B_1ms;          //1ms標志

  47. u16 PWM1_Duty;
  48. u16 PWM2_Duty;
  49. u16 PWM3_Duty;
  50. u16 PWM4_Duty;

  51. bit PWM1_Flag;
  52. bit PWM2_Flag;
  53. bit PWM3_Flag;
  54. bit PWM4_Flag;

  55. void UpdatePwm(void);

  56. /******************** 主函數 **************************/
  57. void main(void)
  58. {
  59.     P_SW2 |= 0x80;  //擴展寄存器(XFR)訪問使能

  60.     P0M1 = 0x30;   P0M0 = 0x30;   //設置P0.4、P0.5為漏極開路(實驗箱加了上拉電阻到3.3V)
  61.     P1M1 = 0x30;   P1M0 = 0x30;   //設置P1.4、P1.5為漏極開路(實驗箱加了上拉電阻到3.3V)
  62.     P2M1 = 0x3c;   P2M0 = 0x3c;   //設置P2.2~P2.5為漏極開路(實驗箱加了上拉電阻到3.3V)
  63.     P3M1 = 0x50;   P3M0 = 0x50;   //設置P3.4、P3.6為漏極開路(實驗箱加了上拉電阻到3.3V)
  64.     P4M1 = 0x3c;   P4M0 = 0x3c;   //設置P4.2~P4.5為漏極開路(實驗箱加了上拉電阻到3.3V)
  65.     P5M1 = 0x0c;   P5M0 = 0x0c;   //設置P5.2、P5.3為漏極開路(實驗箱加了上拉電阻到3.3V)
  66.     P6M1 = 0xff;   P6M0 = 0xff;   //設置為漏極開路(實驗箱加了上拉電阻到3.3V)
  67.     P7M1 = 0x00;   P7M0 = 0x00;   //設置為準雙向口

  68.     PWM1_Flag = 0;
  69.     PWM2_Flag = 0;
  70.     PWM3_Flag = 0;
  71.     PWM4_Flag = 0;

  72.     PWM1_Duty = 0;
  73.     PWM2_Duty = 256;
  74.     PWM3_Duty = 512;
  75.     PWM4_Duty = 1024;

  76.     //  Timer0初始化
  77.     AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
  78.     TH0 = (u8)(Timer0_Reload / 256);
  79.     TL0 = (u8)(Timer0_Reload % 256);
  80.     ET0 = 1;    //Timer0 interrupt enable
  81.     TR0 = 1;    //Tiner0 run

  82.     PWMA_CCER1 = 0x00; //寫 CCMRx 前必須先清零 CCxE 關閉通道
  83.     PWMA_CCER2 = 0x00;
  84.     PWMA_CCMR1 = 0x68; //通道模式配置
  85.     PWMA_CCMR2 = 0x68;
  86.     PWMA_CCMR3 = 0x68;
  87.     PWMA_CCMR4 = 0x68;
  88.     PWMA_CCER1 = 0x55; //配置通道輸出使能和極性
  89.     PWMA_CCER2 = 0x55;

  90.     PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //設置周期時間
  91.     PWMA_ARRL = (u8)PWM_PERIOD;

  92.     PWMA_ENO = 0x00;
  93.     PWMA_ENO |= ENO1P; //使能輸出
  94.     PWMA_ENO |= ENO1N; //使能輸出
  95.     PWMA_ENO |= ENO2P; //使能輸出
  96.     PWMA_ENO |= ENO2N; //使能輸出
  97.     PWMA_ENO |= ENO3P; //使能輸出
  98.     PWMA_ENO |= ENO3N; //使能輸出
  99.     PWMA_ENO |= ENO4P; //使能輸出
  100.     PWMA_ENO |= ENO4N; //使能輸出

  101.     PWMA_PS = 0x00;  //高級 PWM 通道輸出腳選擇位
  102.     PWMA_PS |= PWM1_3; //選擇 PWM1_3 通道
  103.     PWMA_PS |= PWM2_3; //選擇 PWM2_3 通道
  104.     PWMA_PS |= PWM3_3; //選擇 PWM3_3 通道
  105.     PWMA_PS |= PWM4_3; //選擇 PWM4_3 通道

  106.     PWMA_BKR = 0x80; //使能主輸出
  107.     PWMA_CR1 |= 0x01; //開始計時

  108.     P40 = 0;                //給LED供電
  109.     EA = 1;     //打開總中斷

  110.     while (1)
  111.     {
  112.     }
  113. }


  114. /********************** Timer0 1ms中斷函數 ************************/
  115. void timer0(void) interrupt 1
  116. {
  117.     if(!PWM1_Flag)
  118.     {
  119.         PWM1_Duty++;
  120.         if(PWM1_Duty > PWM_PERIOD) PWM1_Flag = 1;
  121.     }
  122.     else
  123.     {
  124.         PWM1_Duty--;
  125.         if(PWM1_Duty <= 0) PWM1_Flag = 0;
  126.     }

  127.     if(!PWM2_Flag)
  128.     {
  129.         PWM2_Duty++;
  130.         if(PWM2_Duty > PWM_PERIOD) PWM2_Flag = 1;
  131.     }
  132.     else
  133.     {
  134.         PWM2_Duty--;
  135.         if(PWM2_Duty <= 0) PWM2_Flag = 0;
  136.     }

  137.     if(!PWM3_Flag)
  138.     {
  139.         PWM3_Duty++;
  140.         if(PWM3_Duty > PWM_PERIOD) PWM3_Flag = 1;
  141.     }
  142.     else
  143.     {
  144.         PWM3_Duty--;
  145.         if(PWM3_Duty <= 0) PWM3_Flag = 0;
  146.     }

  147.     if(!PWM4_Flag)
  148.     {
  149.         PWM4_Duty++;
  150.         if(PWM4_Duty > PWM_PERIOD) PWM4_Flag = 1;
  151.     }
  152.     else
  153.     {
  154.         PWM4_Duty--;
  155.         if(PWM4_Duty <= 0) PWM4_Flag = 0;
  156.     }
  157.    
  158.     UpdatePwm();
  159. }


  160. //========================================================================
  161. // 函數: UpdatePwm(void)
  162. // 描述: 更新PWM占空比.
  163. // 參數: none.
  164. // 返回: none.
  165. // 版本: V1.0, 2012-11-22
  166. //========================================================================
  167. void UpdatePwm(void)
  168. {
  169.     PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //設置占空比時間
  170.     PWMA_CCR1L = (u8)(PWM1_Duty);
  171.     PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //設置占空比時間
  172.     PWMA_CCR2L = (u8)(PWM2_Duty);
  173.     PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //設置占空比時間
  174.     PWMA_CCR3L = (u8)(PWM3_Duty);
  175.     PWMA_CCR4H = (u8)(PWM4_Duty >> 8); //設置占空比時間
  176.     PWMA_CCR4L = (u8)(PWM4_Duty);
  177. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:433219 發表于 2024-3-20 14:45 | 只看該作者
呼吸,調整起來方便順暢么?
回復

使用道具 舉報

板凳
ID:961114 發表于 2024-3-27 09:11 | 只看該作者
STC 系列-輸出任意周期和任意占空比的波形
#include "reg51.h"
#include "intrins.h"

sfr     P_SW2       =   0xba;

sfr     PWMSET      =   0xF1;
sfr     PWMCFG01    =   0xF6;
sfr     PWMCFG23    =   0xF7;
sfr     PWMCFG45    =   0xFE;

#define PWM0C       (*(unsigned int  volatile xdata *)0xFF00)
#define PWM0CH      (*(unsigned char volatile xdata *)0xFF00)
#define PWM0CL      (*(unsigned char volatile xdata *)0xFF01)
#define PWM0CKS     (*(unsigned char volatile xdata *)0xFF02)
#define PWM0TADC    (*(unsigned int  volatile xdata *)0xFF03)
#define PWM0TADCH   (*(unsigned char volatile xdata *)0xFF03)
#define PWM0TADCL   (*(unsigned char volatile xdata *)0xFF04)
#define PWM0IF      (*(unsigned char volatile xdata *)0xFF05)
#define PWM0FDCR    (*(unsigned char volatile xdata *)0xFF06)
#define PWM00T1     (*(unsigned int  volatile xdata *)0xFF10)
#define PWM00T1H    (*(unsigned char volatile xdata *)0xFF10)
#define PWM00T1L    (*(unsigned char volatile xdata *)0xFF11)
#define PWM00T2H    (*(unsigned char volatile xdata *)0xFF12)
#define PWM00T2     (*(unsigned int  volatile xdata *)0xFF12)
#define PWM00T2L    (*(unsigned char volatile xdata *)0xFF13)
#define PWM00CR     (*(unsigned char volatile xdata *)0xFF14)
#define PWM00HLD    (*(unsigned char volatile xdata *)0xFF15)

sfr     P0M1    =   0x93;
sfr     P0M0    =   0x94;
sfr     P1M1    =   0x91;
sfr     P1M0    =   0x92;
sfr     P2M1    =   0x95;
sfr     P2M0    =   0x96;
sfr     P3M1    =   0xb1;
sfr     P3M0    =   0xb2;
sfr     P4M1    =   0xb3;
sfr     P4M0    =   0xb4;
sfr     P5M1    =   0xc9;
sfr     P5M0    =   0xca;

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    PWMSET = 0x01;                              //使能PWM0模塊(必須先使能模塊后面的設置才有效)

    P_SW2 = 0x80;
    PWM0CKS = 0x00;                             //PWM0時鐘為系統時鐘
    PWM0C = 0x1000;                             //設置PWM0周期為1000H個PWM時鐘
    PWM00T1= 0x0100;                            //在計數值為100H地方PWM00通道輸出低電平
    PWM00T2= 0x0500;                            //在計數值為500H地方PWM00通道輸出高電平
    PWM00CR= 0x80;                              //使能PWM00輸出
    P_SW2 = 0x00;

    PWMCFG01 = 0x01;                            //啟動PWM0模塊

    while (1);
}


回復

使用道具 舉報

地板
ID:107998 發表于 2024-5-3 16:08 | 只看該作者
到底哪個好用呢?下面這個是官方的實列吧?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区国产精品 | 一区二区在线 | 国产激情片在线观看 | 激情视频网站 | 黄网站色大毛片 | 午夜精品久久久久久久久久久久 | 爱高潮www亚洲精品 中文字幕免费视频 | 人人种亚洲 | 色必久久 | 国产在线精品一区二区三区 | 国产高清在线精品一区二区三区 | 亚洲视频一区二区三区四区 | 精品99在线 | 久久成人一区二区三区 | 在线观看日韩av | 日本韩国欧美在线观看 | 国产亚洲欧美在线视频 | 国产日韩欧美 | 美女中文字幕视频 | 国产精品久久久亚洲 | 在线观看亚洲精品视频 | 国产乱码一区 | 91av在线免费看 | 欧美日本韩国一区二区 | 91国语清晰打电话对白 | 99热国产免费 | 欧美淫 | 日韩精品久久久久久 | 久久国产视频播放 | 国产一区亚洲 | 色婷婷狠狠 | 日韩一级免费看 | 日韩在线观看中文字幕 | 九色91视频 | 亚洲三级在线观看 | 亚洲电影成人 | 欧美视频一区二区三区 | 日韩在线免费视频 | 天天爽天天干 | 日日日操 | 97日日碰人人模人人澡分享吧 |