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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8A8K64D4單片機增強型PWM輸出兩路互補SPWM程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:720347 發表于 2023-3-5 14:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*************  功能說明    **************
使用PWM0_3,PWM1_3產生互補的SPWM.

主時鐘選擇24MHZ, PWM時鐘選擇1T, PWM周期2400, 死區12個時鐘(0.5us).正弦波表用200點.

輸出正弦波頻率 = 24000000 / 2400 / 200 = 50 HZ.

本程序從P6.0(PWM0_3)輸出正相脈沖, 從P6.1(PWM1_3)輸出反相脈沖(互補).

******************************************/

#include    "reg51.h"       //包含此頭文件后,里面聲明的寄存器不需要再手動輸入,避免重復定義
#include    "intrins.h"
#include    "T_SineTable.h"

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

#define                PWM_DeadZone        12        /* 死區時鐘數, 6 ~ 24之間  */

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;

//手動輸入聲明"reg51.h"頭文件里面沒有定義的寄存器
sfr TH2  = 0xD6;
sfr TL2  = 0xD7;
sfr IE2  = 0xAF;
sfr INT_CLKO = 0x8F;
sfr AUXR = 0x8E;
sfr P_SW1 = 0xA2;
sfr P_SW2 = 0xBA;

sfr PWMSET = 0xF1;
sfr PWMCFG = 0xF6;

sfr P4   = 0xC0;
sfr P5   = 0xC8;
sfr P6   = 0xE8;
sfr P7   = 0xF8;
sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P4M1 = 0xB3;
sfr P4M0 = 0xB4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;

/****************************** XFR定義* ***********************************/

#define     PWMC                    (*(unsigned int  volatile xdata *)0xff00)
#define     PWMCH                   (*(unsigned char volatile xdata *)0xff00)
#define     PWMCL                   (*(unsigned char volatile xdata *)0xff01)
#define     PWMCKS                  (*(unsigned char volatile xdata *)0xff02)
#define     PWM_SELT2               0x10
#define     PWMTADC                 (*(unsigned int  volatile xdata *)0xff03)
#define     PWMTADCH                (*(unsigned char volatile xdata *)0xff03)
#define     PWMTADCL                (*(unsigned char volatile xdata *)0xff04)
#define     PWMIF                   (*(unsigned char volatile xdata *)0xff05)
#define     PWM_C7IF                0x80
#define     PWM_C6IF                0x40
#define     PWM_C5IF                0x20
#define     PWM_C4IF                0x10
#define     PWM_C3IF                0x08
#define     PWM_C2IF                0x04
#define     PWM_C1IF                0x02
#define     PWM_C0IF                0x01
#define     PWMFDCR                 (*(unsigned char volatile xdata *)0xff06)
#define     PWMFD_INVCMP            0x80
#define     PWMFD_INVIO             0x40
#define     PWMFD_ENFD              0x20
#define     PWMFD_FLTFLIO           0x10
#define     PWMFD_EFDI              0x08
#define     PWMFD_FDCMP             0x04
#define     PWMFD_FDIO              0x02
#define     PWMFD_FDIF              0x01
#define     PWMDELSEL               (*(unsigned char volatile xdata *)0xff07)
#define     PWM_CH03FULL            0x00
#define     PWM_CH03HALF            0x01
#define     PWM_CH03NONE            0x02
#define     PWM_CH47FULL            0x00
#define     PWM_CH47HALF            0x04
#define     PWM_CH47NONE            0x08
#define     PWM0T1                  (*(unsigned int  volatile xdata *)0xff10)
#define     PWM0T1H                 (*(unsigned char volatile xdata *)0xff10)
#define     PWM0T1L                 (*(unsigned char volatile xdata *)0xff11)
#define     PWM0T2                  (*(unsigned int  volatile xdata *)0xff12)
#define     PWM0T2H                 (*(unsigned char volatile xdata *)0xff12)
#define     PWM0T2L                 (*(unsigned char volatile xdata *)0xff13)
#define     PWM0CR                  (*(unsigned char volatile xdata *)0xff14)
#define     PWM_ENO                 0x80
#define     PWM_INI0                0x00
#define     PWM_INI1                0x40
#define     PWM_ENI                 0x04
#define     PWM_ENT2I               0x02
#define     PWM_ENT1I               0x01
#define     PWM0HLD                 (*(unsigned char volatile xdata *)0xff15)
#define     PWM_HLDH                0x02
#define     PWM_HLDL                0x01
#define     PWM1T1                  (*(unsigned int  volatile xdata *)0xff18)
#define     PWM1T1H                 (*(unsigned char volatile xdata *)0xff18)
#define     PWM1T1L                 (*(unsigned char volatile xdata *)0xff19)
#define     PWM1T2                  (*(unsigned int  volatile xdata *)0xff1a)
#define     PWM1T2H                 (*(unsigned char volatile xdata *)0xff1a)
#define     PWM1T2L                 (*(unsigned char volatile xdata *)0xff1b)
#define     PWM1CR                  (*(unsigned char volatile xdata *)0xff1c)
#define     PWM1HLD                 (*(unsigned char volatile xdata *)0xff1d)
#define     PWM2T1                  (*(unsigned int  volatile xdata *)0xff20)
#define     PWM2T1H                 (*(unsigned char volatile xdata *)0xff20)
#define     PWM2T1L                 (*(unsigned char volatile xdata *)0xff21)
#define     PWM2T2                  (*(unsigned int  volatile xdata *)0xff22)
#define     PWM2T2H                 (*(unsigned char volatile xdata *)0xff22)
#define     PWM2T2L                 (*(unsigned char volatile xdata *)0xff23)
#define     PWM2CR                  (*(unsigned char volatile xdata *)0xff24)
#define     PWM2HLD                 (*(unsigned char volatile xdata *)0xff25)
#define     PWM3T1                  (*(unsigned int  volatile xdata *)0xff28)
#define     PWM3T1H                 (*(unsigned char volatile xdata *)0xff28)
#define     PWM3T1L                 (*(unsigned char volatile xdata *)0xff29)
#define     PWM3T2                  (*(unsigned int  volatile xdata *)0xff2a)
#define     PWM3T2H                 (*(unsigned char volatile xdata *)0xff2a)
#define     PWM3T2L                 (*(unsigned char volatile xdata *)0xff2b)
#define     PWM3CR                  (*(unsigned char volatile xdata *)0xff2c)
#define     PWM3HLD                 (*(unsigned char volatile xdata *)0xff2d)
#define     PWM4T1                  (*(unsigned int  volatile xdata *)0xff30)
#define     PWM4T1H                 (*(unsigned char volatile xdata *)0xff30)
#define     PWM4T1L                 (*(unsigned char volatile xdata *)0xff31)
#define     PWM4T2                  (*(unsigned int  volatile xdata *)0xff32)
#define     PWM4T2H                 (*(unsigned char volatile xdata *)0xff32)
#define     PWM4T2L                 (*(unsigned char volatile xdata *)0xff33)
#define     PWM4CR                  (*(unsigned char volatile xdata *)0xff34)
#define     PWM4HLD                 (*(unsigned char volatile xdata *)0xff35)
#define     PWM5T1                  (*(unsigned int  volatile xdata *)0xff38)
#define     PWM5T1H                 (*(unsigned char volatile xdata *)0xff38)
#define     PWM5T1L                 (*(unsigned char volatile xdata *)0xff39)
#define     PWM5T2                  (*(unsigned int  volatile xdata *)0xff3a)
#define     PWM5T2H                 (*(unsigned char volatile xdata *)0xff3a)
#define     PWM5T2L                 (*(unsigned char volatile xdata *)0xff3b)
#define     PWM5CR                  (*(unsigned char volatile xdata *)0xff3c)
#define     PWM5HLD                 (*(unsigned char volatile xdata *)0xff3d)
#define     PWM6T1                  (*(unsigned int  volatile xdata *)0xff40)
#define     PWM6T1H                 (*(unsigned char volatile xdata *)0xff40)
#define     PWM6T1L                 (*(unsigned char volatile xdata *)0xff41)
#define     PWM6T2                  (*(unsigned int  volatile xdata *)0xff42)
#define     PWM6T2H                 (*(unsigned char volatile xdata *)0xff42)
#define     PWM6T2L                 (*(unsigned char volatile xdata *)0xff43)
#define     PWM6CR                  (*(unsigned char volatile xdata *)0xff44)
#define     PWM6HLD                 (*(unsigned char volatile xdata *)0xff45)
#define     PWM7T1                  (*(unsigned int  volatile xdata *)0xff48)
#define     PWM7T1H                 (*(unsigned char volatile xdata *)0xff48)
#define     PWM7T1L                 (*(unsigned char volatile xdata *)0xff49)
#define     PWM7T2                  (*(unsigned int  volatile xdata *)0xff4a)
#define     PWM7T2H                 (*(unsigned char volatile xdata *)0xff4a)
#define     PWM7T2L                 (*(unsigned char volatile xdata *)0xff4b)
#define     PWM7CR                  (*(unsigned char volatile xdata *)0xff4c)
#define     PWM7HLD                 (*(unsigned char volatile xdata *)0xff4d)

/*************  本地變量聲明    **************/

u16 PWM1_Duty;
u8        PWM_Index;        //SPWM查表索引

/*************  本地函數聲明    **************/

void PWM_config(void);
        
/******************** 主函數 **************************/
void main(void)
{
    P0M1 = 0x00;   P0M0 = 0x00;   //設置為準雙向口
    P1M1 = 0x00;   P1M0 = 0x00;   //設置為準雙向口
    P2M1 = 0x00;   P2M0 = 0x00;   //設置為準雙向口
    P3M1 = 0x00;   P3M0 = 0x00;   //設置為準雙向口
    P4M1 = 0x00;   P4M0 = 0x00;   //設置為準雙向口
    P5M1 = 0x30;   P5M0 = 0x00;   //設置為準雙向口, 設置P5.4,P5.5(蜂鳴器)高阻輸入
    P6M1 = 0x00;   P6M0 = 0x03;   //設置為準雙向口, 設置P6.0,P6.1推挽輸出
    P7M1 = 0x00;   P7M0 = 0x00;   //設置為準雙向口

    PWM1_Duty = 1220;

    PWM_config();

    EA = 1;     //打開總中斷

    while (1)
    {
    }
}

//========================================================================
// 函數: void PWM_config(void)
// 描述: PWM初始化函數。
// 參數: 無.
// 返回: 無.
// 版本: V1.0, 2020-6-10
//========================================================================
void PWM_config(void)
{
    PWMSET = 0x01;                //使能PWM模塊
    P_SW2 |= 0x80;
    PWMCKS = 0x00;                //PWM時鐘為系統時鐘
    PWMC = 2400;                        //PWM周期
    PWM0T1 = 65 - PWM_DeadZone;                        //低電平輸出位置
    PWM0T2 = 1220 + PWM_DeadZone;                //高電平輸出位置
    PWM0CR = 0x90;                //使能PWM輸出, 初始電平為0, 選擇P6.0

    PWM1T1 = 1220;        //低電平輸出位置
    PWM1T2 = 65;        //高電平輸出位置
    PWM1CR = 0xD0;                //使能PWM輸出, 初始電平為1, 選擇P6.1

    P_SW2 &= 0x7f;
    PWMCFG = 0x05;        //啟動PWM模塊, 允許PWM計數器歸零中斷
}

/********************* PWM中斷函數************************/

void PWM_int (void) interrupt 22
{
        char store;
        store = P_SW2;
        P_SW2 |= 0x80;

        if(PWMCFG & 0x08)                //PWM計數器中斷
        {
                PWMCFG &= ~0x08;                //清PWM計數器中斷標志

                PWM0T2 = T_SinTable[PWM_Index] + PWM_DeadZone;
                PWM1T1 = T_SinTable[PWM_Index];
               
                if(++PWM_Index >= 200)        PWM_Index = 0;

        }
/*
        if(PWMIF & C0IF)        //PWM0中斷標志
        {
                PWMIF &= ~C0IF;        //清除中斷標志
        }

        if(PWMIF & C1IF)        //PWM1中斷標志
        {
                PWMIF &= ~C1IF;        //清除中斷標志
        }

        if(PWMIF & C2IF)        //PWM2中斷標志
        {
                PWMIF &= ~C2IF;        //清除中斷標志
        }

        if(PWMIF & C3IF)        //PWM3中斷標志
        {
                PWMIF &= ~C3IF;        //清除中斷標志
        }

        if(PWMIF & C4IF)        //PWM4中斷標志
        {
                PWMIF &= ~C4IF;        //清除中斷標志
        }

        if(PWMIF & C5IF)        //PWM5中斷標志
        {
                PWMIF &= ~C5IF;        //清除中斷標志
        }

        if(PWMIF & C6IF)        //PWM6中斷標志
        {
                PWMIF &= ~C6IF;        //清除中斷標志
        }

        if(PWMIF & C7IF)        //PWM7中斷標志
        {
                PWMIF &= ~C7IF;        //清除中斷標志
        }
*/
        P_SW2 = store;
}
/*---------------------------------------------------------------------*/
/*本程序使用了STC的資料及程序,學習使用,感謝支持    */
/*---------------------------------------------------------------------*/

51hei.png (22.8 KB, 下載次數: 115)

51hei.png

51hei.png (3.23 KB, 下載次數: 105)

51hei.png

增強型PWM輸出兩路互補SPWM.zip

79.86 KB, 下載次數: 46, 下載積分: 黑幣 -5

SPWM程序

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:7199 發表于 2023-6-15 19:11 | 只看該作者
有空可以下載下來看一下,謝謝分享
回復

使用道具 舉報

板凳
ID:21740 發表于 2023-6-18 13:45 | 只看該作者
好東西哦!收下了!謝謝分享!!!!!!!!!!!!!!!!!!
回復

使用道具 舉報

地板
ID:675799 發表于 2023-8-22 10:05 | 只看該作者
void PWM_config(void)
{
    PWMSET = 0x01;                //使能PWM模塊
    P_SW2 |= 0x80;
    PWMCKS = 0x00;                //PWM時鐘為系統時鐘
    PWMC = 2400;                        //PWM周期   
--------------------------------------------------------------------
如果要改變1下頻率, 把2400 改3000 就是 40HZ,     但是如何在代碼運行后30秒 40HZ改為  50hz, 應該如果 改?PWMC = 3000      // 40HZ      PWMC = 2400     //50HZ
回復

使用道具 舉報

5#
ID:1064915 發表于 2023-8-22 14:38 | 只看該作者
STC8A8K64D4.7z (2.63 KB, 下載次數: 9)
官方有頭文件
sfr         T2H         =           0xd6;
sfr         T2L         =           0xd7;

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费午夜视频在线观看 | 中文字幕在线免费视频 | 国产精品69毛片高清亚洲 | 91综合网| 免费看黄色视屏 | 蜜臀久久 | 亚洲一区二区三区四区五区中文 | 国产香蕉视频 | 日韩中文字幕视频 | 久久九七| 久免费视频| 成年人视频免费在线观看 | 免费日韩av网站 | 精品欧美黑人一区二区三区 | 亚洲精品乱码久久久久久9色 | 啪视频在线 | 亚洲福利网 | 日本网站免费在线观看 | 国产极品91| 91av导航| 五月天国产 | 男人天堂手机在线视频 | 久久国产一区二区三区 | 成人伊人 | 美女黄网 | 亚洲国产欧美日韩 | 成人日韩 | 国产乱码精品1区2区3区 | 亚洲欧美一区二区三区在线 | 欧美理论 | 91性高湖久久久久久久久_久久99 | 精品粉嫩超白一线天av | 中文字幕在线视频网站 | 免费午夜视频 | 大香在线伊779 | 欧美日韩在线免费 | 天天综合永久入口 | 久久国产精品一区二区三区 | www.久久艹| 91视频国产一区 | 翔田千里一区二区 |