📄 pwm.c
字号:
#include <STC12C2052AD.h>
#define Timer1_H 0x9e//0x3c
#define Timer1_L 0x58//0x00
#define Timer0_Reload 0xff//0x0f6 //Timer0自动重装数= -10
#define on 0
#define off 1
#define INT_DISABLE EA=0;
#define INT_ENABLE EA=1;
static xdata unsigned timer1_tick;
sbit S1 = P3^3;
sbit S2 = P3^4;
sbit SS = P3^2;//關機檢測
unsigned char S1_State = 0;
unsigned char S2_State = 0;
unsigned char wr_mode = 0;
bit Sart = 0;
bit pwm_up = 0;
sbit PWM = P3^7;
sbit LED = P1;
sbit led1 = P1^3;
sbit led2 = P1^4;
sbit led3 = P1^5;
sbit led4 = P1^6;
sbit led5 = P1^7;
void delay(unsigned char i)
{
while (--i);
}
//-----------------看门狗函数---------------------
void dog(void)
{
WDT_CONTR = 0X3E;//0x3f;//11.0592MHz Pre-scale=256 9.1022s
//WDT_CONTR = 0x3e;//8.388608s
}
//----FUNCTION TABLE
void Timer1_Initialize (void);
void key_fun(void);//
void key_scan(void);//
void Up_Pwm(void);
unsigned timer1_count (void);
unsigned timer1_elapsed_count (unsigned count);
void timer1_wait (unsigned count);
void Pca_Initialize(void);
void INT_System_init(void);
void Timer0_Initiate(void);
//==================================
void main(void)
{
Pca_Initialize();
//P1M0 = 0xf8;//设置P1.3-p1.7口仅为输入(高阻)
//P1M1 = 0x00;
P1M0 = 0x00;//设置P1.3--P1.7 推换输出(强上拉输出,可达20mA,要加限流电阻)
P1M1 = 0xf8;
Timer0_Initiate();
Timer1_Initialize ();
INT_System_init();
led1 = off;
led2 = off;
led3 = off;
led4 = off;
led5 = off;
delay(100);
dog();
while (1)
{
dog();
key_scan();
key_fun();
Up_Pwm();
}
}
//----------------------------
void Pca_Initialize(void)
{
CMOD |= 0x84;//0x42;//0x02;//Setup PCA timer
CL = 0x00;
CH = 0x00;
CCAP0L = 0xc0; //Set the initial value same as CCAP0H
CCAP0H = 0xc0;//25% Duty Cycle
CCAPM0 = 0x42;//0100,0010 Setup PCA module 0 in PMW mode/pca模块0工作模式寄存器42h8位pwm
PCA_PWM0 = 0x03; //
CR = 1;
EA = 1;
}
//-----------------
void Timer1_Initialize (void)
{
EA = 0;
TR1 = 0;
TMOD |=0x10;
TH1 = Timer1_H;
TL1 = Timer1_L;
ET1 = 1;
TR1 = 1;
EA = 1;
}
//----------------
void vTimer1(void) interrupt 3
{
//static unsigned char Counter = 0,Counter1 = 0;
TR1 = 0;
TH1 = Timer1_H;
TL1 = Timer1_L;
TR1 = 1;
pwm_up = 1;
timer1_tick ++;
}
/* 定时器T1节拍函数 */
unsigned timer1_count (void) {
xdata unsigned t;
INT_DISABLE;
t = timer1_tick;
INT_ENABLE;
return (t);
}
/* 定时器T0节拍计数函数 */
unsigned timer1_elapsed_count (unsigned count) {
return (timer1_count () - count);
}
/* 定时器T1延时函数 */
void timer1_wait (unsigned count) {
xdata unsigned start_count;
start_count = timer1_count ();
while (timer1_elapsed_count (start_count) <= count)
{
//dog();
}
}
//-------------------------------------
void key_scan(void)
{
if (S1 == 0)
{
timer1_wait (60);
if (S1 == 0)
{
//while (!S1);
S1_State = 1;
}
}
if (S2 == 0)
{
timer1_wait (60);
if (S2 == 0)
{
//while (S2);
S2_State = 1;
}
}
/*
if (SS == 0)
{
timer1_wait (5);
if (SS == 0)
{
Sart = 0;
}
} */
}
//------------------
void key_fun(void)
{
if (S1_State)
{
S1_State = 0;
if (Sart)
{
Sart = 0;
//PCA_PWM0 = 0X00;
//CCAP0H = 0XFF;
}
else
{
Sart = 1;
//PCA_PWM0 = 0X00;
//CCAP0H = 0X00;
}
}
if (S2_State)
{
S2_State = 0;
if (Sart)
{
wr_mode ++;
if (wr_mode >= 5)
{
wr_mode = 0;
}
}
else
{
S2_State = 0;
return;
}
}
}
//------------------------------------
//--------PWM输出函数-----------------
//------------------------------------
void Up_Pwm(void)
{
pwm_up = 0;
if (Sart)
{
//PCA_PWM0 = 0x00;
//CCAP0H = 0x00;
switch (wr_mode)
{
case 0:
PCA_PWM0 = 0x00;
CCAP0H = 0xcc;//0xc0; //defaule 25% Duty Cycle
led1 = on;
led2 = off;
led3 = off;
led4 = off;
led5 = off;
break;
case 1:
CCAP0H = 0x99;
led1 = on;
led2 = on;
led3 = off;
led4 = off;
led5 = off;
break;
case 2:
CCAP0H = 0x66;
led1 = on;
led2 = on;
led3 = on;
led4 = off;
led5 = off;
break;
case 3:
CCAP0H = 0x33;
led1 = on;
led2 = on;
led3 = on;
led4 = on;
led5 = off;
break;
case 4:
//CCAP0H = 0xff;
//PCA_PWM0 = 0x00;
//CCAPM0 = 0x00;
CCAP0H = 0x00;
led1 = on;
led2 = on;
led3 = on;
led4 = on;
led5 = on;
break;
default:break;
}
}
else
{
PCA_PWM0 = 0X03; //关闭PWM输出,为0
CCAP0H = 0x33;//0xC0;default 20%
wr_mode = 0;
led1 = off;
led2 = off;
led3 = off;
led4 = off;
led5 = off;
}
}
//================
void INT_System_init(void)
{
//IT0 = 0; //外部中断0,低电平触发中断
IT0 = 1; //外部中断0,下降沿触发中断
EX0 = 1; //允许外部中断0中断
//IT1 = 0; //外部中断1,低电平触发中断
//IT1 = 1; //外部中断1,下降沿触发中断
//EX1 = 1; //允许外部中断0中断
EA = 1; //开总中断控制位
}
//========================================
void INT0_Routine(void) interrupt 0
{
EX0 = 0;
Sart = 0;
EX0 = 1;
}
//void INT1_Routine(void) interupt 2
//{
//}
void Timer0_Initiate(void)
{
TR0 = 0; //设置定时器T0为自动重装载工作模式
AUXR |= 0x80;
TMOD = 0X02;
TH0 = Timer0_Reload;
TL0 = Timer0_Reload;
TR0 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -