|
/************* 功能說明 **************
使用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的資料及程序,學習使用,感謝支持 */
/*---------------------------------------------------------------------*/
|
評分
-
查看全部評分
|