/*------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------------------------------------*/
/* --- STC12C5Axx Series MCU PCA module output PWM wave Demo -------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define FOSC 11059200L
typedef unsigned char BYTE;
typedef unsigned int WORD;
/*Declare SFR associated with the PCA */
sfr CCON = 0xD8; //PCA control register
sbit CCF0 = CCON^0; //PCA module-0 interrupt flag
sbit CCF1 = CCON^1; //PCA module-1 interrupt flag
sbit CR = CCON^6; //PCA timer run control bit
sbit CF = CCON^7; //PCA timer overflow flag
sfr CMOD = 0xD9; //PCA mode register
sfr CL = 0xE9; //PCA base timer LOW
sfr CH = 0xF9; //PCA base timer HIGH
sfr CCAPM0 = 0xDA; //PCA module-0 mode register
sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW
sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH
sfr CCAPM1 = 0xDB; //PCA module-1 mode register
sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW
sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH
sfr PCAPWM0 = 0xf2;
sfr PCAPWM1 = 0xf3;
unsigned char delay1; // STV和BLANK间隔时间
unsigned char delay3; //CPV1和CPV2间隔时间
unsigned char delay2; // STV和CPV1间隔时间
unsigned char STVW; //STV正脉冲时间
unsigned char STV; //STV周期时间
unsigned char BLANK;//BLANK周期时间
unsigned char BS;//BLANK正脉冲时间
unsigned char LC;//LC和BLANK间隔时间
unsigned char LCS;//LC正脉冲时间
unsigned char CPV1;//CPV1周期时间
unsigned char CPV1S;//CPV1正脉冲时间
unsigned char CPV2;//CPV2周期时间
unsigned char CPV2S;//CPV2正脉冲时间
unsigned char T5; // CPV1和CPV2间隔时间
unsigned char US; //1us标志数
unsigned char TENMS; //10MS标志数
unsigned char ms; //0.MS标志数
unsigned char TENTHS;//0.1S标志数
unsigned char i;
unsigned char j;
sbit STV1_O=P1^0;//STV1输出引脚
sbit STV2_O=P1^1;//STV2输出引脚
sbit BLANK_O=P1^2;//BLANK输出引脚
sbit LC1_O=P2^3;//LC1输出引脚
sbit LC2_O=P2^4;//LC1输出引脚
sbit CPV1_O=P1^5;//CPV1输出引脚
sbit CPV2_O=P1^6;//CPV2输出引脚
sbit K1=P3^5;//启动时序开关
void init()
{
TMOD=0x10; //定时器1以方式1定时
TL1 = 0x18; //设置定时初值
TH1 = 0x7F; //设置定时初值
EA=1; //打开总中断
ET1=1; //允许定时器1中断
TR1=1; //开启定时器1
}
void time1() interrupt 3 //定时器1中断函数
{
// CR = 0; //PCA timer start off
CCON = 0; //Initial PCA control register //Clear all module interrupt flag
CL = 0; //Reset PCA base timer
CH = 0;
TL1 = 0x18; //设置定时初值
TH1 = 0x7F; //设置定时初值
BLANK_O=1;//BLANK输出高电平
CPV1_O=CPV2_O=0;//CPV1.2输出低电平1
i = 87;//延时30us
while (--i);
BLANK_O=0;
_nop_();
_nop_();
i = 1;
j = 205;
do
{
while (--j);
} while (--i); //延时35us
LC++;
if(LC==200)//200针翻转一次
{
LC1_O=!LC1_O;
LC2_O=!LC2_O;
}
_nop_();
_nop_();
i = 1;
j = 205;
do
{
while (--j);
} while (--i); //延时35us
STV1_O=STV2_O=1;
i = 57;//延时10us
while (--i);
CCAP0H = 0x80;
CCAP0L = 0x30; //PWM0 port output 50% duty cycle square wave
CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
CCAP1H = CCAP1L = 0xff; //PWM1 port output 0% duty cycle square wave
PCAPWM1 = 0x03;
CCAPM1 = 0x42; //PCA module-1 work in 8-bit PWM mode and no PCA interrupt
CR = 1; //PCA timer start run
i = 87;
while (--i); //延时15us
STV1_O=STV2_O=0;
i = 87;
while (--i); //延时15us
CCAP1H = 0x80;
CCAP1L = 0x30; //PWM1 port output 0% duty cycle square wave
PCAPWM1 = 0x30;
}
void main()
{
init();
CCON = 0; //Initial PCA control register
//PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
CL = 0; //Reset PCA base timer
CH = 0;
CMOD = 0x08; //Set PCA timer clock source as Fosc/2
//Disable PCA timer overflow interrupt
while(1)
{
;
}
}