⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.c

📁 用STC51单片机进行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 + -