|
|
#include "stc8g.h"
#include "intrins.h"
#define PWM1C (*(unsigned int volatile xdata *)0xff50)
#define PWM10T1 (*(unsigned int volatile xdata *)0xff60)
#define PWM10T2 (*(unsigned int volatile xdata *)0xff62)
#define CYCLE 0x1000
void PWM1_Isr() interrupt 28 // PWM1中斷服務(wù)函數(shù)
{
static bit dir = 1;
static int val = 0;
if(PWMCFG01 & 0x80)
{
PWMCFG01 &= ~0x80; //清中斷標(biāo)志
if(dir)
{
val++;
if(val >= CYCLE) dir = 0;
}
else
{
val--;
if(val <= 1) dir = 1;
}
PWM10T2 = val;
}
}
void main()
{
P1M1 = 0x00;
P1M0 = 0x01;
/*增強(qiáng)型PWM全局配置寄存器(PWMSET)*/
PWMSET = 0X02; //使能PWM1模塊 (必須先使能模塊后面的設(shè)置才有效)
/*外設(shè)端口切換寄存器2(P_SW2)*/
P_SW2 = 0x80; //打開擴(kuò)展RAM區(qū)特殊功能寄存器(EAXFR)
/*PWM時(shí)鐘選擇寄存器(PWMnCKS)*/
PWM1CKS = 0X00; // 選擇PWM時(shí)鐘源為系統(tǒng)時(shí)鐘 無分頻
/*PWM計(jì)數(shù)器寄存器(PWMnCH.PWMnCL)*/
PWM1C = CYCLE; // 設(shè)置PWM1時(shí)鐘周期 該地址是由兩個(gè)8位CH,CL組合為int類型定義的16位地址
/*PWM輸出電平計(jì)時(shí)寄存器*/
PWM10T1 = 0X0100; // 計(jì)時(shí)時(shí)間等于它輸出低電平 與設(shè)置時(shí)鐘周期同理
PWM10T2 = 0X0500; // 計(jì)時(shí)時(shí)間等于它輸出高電平 與設(shè)置時(shí)鐘周期同理
/*PWM通道控制寄存器*/
PWM10CR = 0x80; // 使能PWM10輸出
P_SW2 = 0x00;
/*PWM配置寄存器*/
PWMCFG01 = 0x50;//啟動PWM1使能PWM1中斷
EA = 1; //打開總中斷
while(1);
}
|
|