占空比课设
//************************************************************************
// File : PwmDrive_12C5A.c
// Date : 2009-08-22
// Version : 1.0
// Powerd by : weishao2401 QQ:115393395
// modify by :
//*************************************************************************
// Descriptoon:
// STC12C5A60AD/S2系列驱动程序
//
// 注: AD结果的读取有查询和中断这两种方式
// 本驱动用的是查询方式
// STC12C5A60S2系列的模块0对应P1.0/CEX0/PCA0/PWM0
// 产品网站
http://www.sxcckj.com 传诚科技
//*************************************************************************
#include "pwmdrive.h"
#include "LCD5110.h"
char idata Duty0[4];
char idata Duty1[4];
//sfr CCON = 0xD8; //PCA控制寄存器
//sfr CMOD = 0xD9; //PCA模式寄存器
//sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器 //模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列)
//sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器 //模块1对应P1.4/CEX1/PCA1/PWM1(STC12C5A60S2系列)
//sfr CL = 0xE9; //PCA 定时寄存器 低位
//sfr CH = 0xF9; //PCA 定时寄存器 高位
//sfr CCAP0L = 0xEA; //PCA模块0的 捕获寄存器 低位
//sfr CCAP0H = 0xFA; //PCA模块0的 捕获寄存器 高位
//sfr CCAP1L = 0xEB; //PCA模块1的 捕获寄存器 低位
//sfr CCAP1H = 0xFB; //PCA模块1的 捕获寄存器 高位
//sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0
//sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1
//sbit CF = 0xDF; //PCA计数溢出标志位
//sbit CR = 0xDE; //PCA计数器 运行控制位
//sbit CCF1 = 0xD9; //PCA模块1中断标志
//sbit CCF0 = 0xD8; //PCA模块0中断标志
//* CMOD |= 0X00; // PCA/PWM时钟源为 Fosc/12
//* CMOD |= 0X02; // PCA/PWM时钟源为 Fosc/2
//* CMOD |= 0X04; // PCA/PWM时钟源为 定时器0的溢出,一般设为模式2,可实现可调频率PWM输出
//* CMOD |= 0X06; // PCA/PWM时钟源为 ECI/P3.4脚的外部时钟输入(最大速率=Fosc/2)
//* CMOD |= 0X08; // PCA/PWM时钟源为 Fosc
//* CMOD |= 0X0A; // PCA/PWM时钟源为 Fosc/4
//* CMOD |= 0X0C; // PCA/PWM时钟源为 Fosc/6
//* CMOD |= 0X0E; // PCA/PWM时钟源为 Fosc/8
//*** 由于PWM是8位,PWM频率 = PCA时钟频率 / 256
//* CCAPOH = CCAPOL = 0XC0; //模块0输出 占空因数为25%
//* CCAPOH = CCAPOL = 0X80; //模块0输出 占空因数为50%
//* CCAPOH = CCAPOL = 0X40; //模块0输出 占空因数为75%
/*===========================================
*函数名:PWM_clock(U8 clock)
*功 能:PWM端口初始化 子函数,
* clock取值为0-7,依次对应8种时钟模式
*返回值:无
*调用函数:无
*作 者:weishao2401 2009/8/22
*============================================*/
void PWM_clock(U8 clock)
{
CMOD |= (clock<<1);
//CMOD=0x08;
CL = 0x00;
CH = 0x00;
}
/*===========================================
*函数名:PWM_start(module,mode)
*功 能:选择PWM模块和PWM模式,
* module=0/1/2,打开模块0/1/两者
* module=0/1/2/3,无中断/下降沿中断/上升沿中断/跳变中断
*返回值:无
*调用函数:无
*作 者:weishao2401 2009/8/22
*============================================*/
void PWM_start(U8 module,U8 mode,U8 DutyCycle0,U8 DutyCycle1)
{
//CCAP0L = 0XC0;
//CCAP0H = 0XC0; //模块0初始输出 占空因数为25%
//CCAP1L = 0XC0;
//CCAP1H = 0XC0; //模块1初始输出 占空因数为25%
Duty0[0]=DutyCycle0/10+'0';
Duty0[1]=DutyCycle0%10+'0';
Duty0[2]='\0';
Duty1[0]=DutyCycle1/10+'0';
Duty1[1]=DutyCycle1%10+'0';
Duty1[2]='\0';
CCAP0L=(65535-65535*DutyCycle0/100)%256;
CCAP0H=(65535-65535*DutyCycle0/100)/256;
//CCAPM0=0x42;
CCAP1L=(65535-65535*DutyCycle1/100)%256;
CCAP1H=(65535-65535*DutyCycle1/100)/256;
//CCAPM1=0x42;
if(module==0)
{
switch(mode)
{
case 0: CCAPM0 = 0X42;break; //模块0设置为8位PWM输出,无中断
case 1: CCAPM0 = 0X53;break; //模块0设置为8位PWM输出,下降沿产生中断
case 2: CCAPM0 = 0X63;break; //模块0设置为8位PWM输出,上升沿产生中断
case 3: CCAPM0 = 0X73;break; //模块0设置为8位PWM输出,跳变沿产生中断
default: break;
}
}
else
if(module==1)
{
switch(mode)
{
case 0: CCAPM1 = 0X42;break; //模块1设置为8位PWM输出,无中断
case 1: CCAPM1 = 0X53;break; //模块1设置为8位PWM输出,下降沿产生中断
case 2: CCAPM1 = 0X63;break; //模块1设置为8位PWM输出,上升沿产生中断
case 3: CCAPM1 = 0X73;break; //模块1设置为8位PWM输出,跳变沿产生中断
default: break;
}
}
else
if(module==2)
{
switch(mode)
{
case 0: CCAPM0 = CCAPM1 = 0X42;break; //模块0和1设置为8位PWM输出,无中断
case 1: CCAPM0 = CCAPM1 = 0X53;break; //模块0和1设置为8位PWM输出,下降沿产生中断
case 2: CCAPM0 = CCAPM1 = 0X63;break; //模块0和1设置为8位PWM输出,上升沿产生中断
case 3: CCAPM0 = CCAPM1 = 0X73;break; //模块0和1设置为8位PWM输出,跳变沿产生中断
default: break;
}
}
CR=1; //PCA计数器开始计数
}
/************pwm的显现函数************************/
void PWM_dis(void)
{
LCD_write_english_string(0,0,"DutyCycle0:");
LCD_write_english_string(66,0,Duty0);
LCD_write_english_string(78,0,"%");
LCD_write_english_string(0,1,"DutyCycle1:");
LCD_write_english_string(66,1,Duty1);
LCD_write_english_string(78,1,"%");
}
/*===========================================
*函数名:PCA_PWM(void) interrupt 7
*功 能:PCA中断子函数,
*返回值:无
*调用函数:无
*作 者:weishao2401 2009/8/22
*============================================*/
void PCA_Intrrpt(void) interrupt 7
{
//如果是CCF0产生的中断
if(CCF0)
{
CCF0=0; //软件清零
}
//如果是CCF1产生的中断
if(CCF1)
{
CCF1=0; //软件清零
}
//如果是CF产生的中断
if(CF)
{
CF=0; //软件清零
}
}