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

📄 pwm.c

📁 单片机P89V51RD2在操纵系统RTX下的各个功能
💻 C
字号:
//pwm.c
//

#include "AppDefine.h"                 


void PWM_init(void)
{
//CMOD
//Bit       7     6   5 4 3   2    1    0
//Symbol   CIDL WDTE  - - -   CPS1 CPS0 ECF
//Bit       0     0   0 0 0   1    0     0 
  
//CCON,可位
//Bit       7     6   5    4     3    2    1    0
//Symbol    CF    CR  -   CCF4 CCF3 CCF2 CCF1 CCF0
//Bit       0     0   0    0     0    0    0     0   

//CCAPM0
//Bit         7   6     5     4    3     2    1    0
//Symbol      - ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
//8-bit PWM   0   1     0     0     0    0    1     0 

	CMOD = 0x04;    //不使能中断,采用Timer0计数器,实现频率
	CCON = 0x00;		//溢出标志,软件清零
	CCAPM0 = 0x42;	   //pwm
	CCAPM1 = 0x42;

	//频率 由PCA的Timer源来决定
	TMOD  |= 0x02;       //TMOD: timer 0, mode 2, 8-bit reload 
	TL0   = 0xfb;       //
	TH0   = TL0;       

	//初值
	//在PWM 模式,输出的频率决定于PCA定时器的源。
	//由于只有一对CH 和CL寄存器,所有模块共享PCA定时器和频率。
	//输出的占空比由装在高位CCAPnH的值控制。
	//由于写入CCAPnH寄存器不是同步的,写入高位的值不会马上装入CCAPnL做比较,
	//直到输出的另一个周期(当CL从255到0翻转)。
	//用下面的公式计算任何占空比CCAPnH 值:
    //CCAPnH=256(1-占空比)
    //CCAPnH 是8 位整数,占空比是分数。
	CL = 0x00;
	CH = 0x00;
	CCAP0L = 0x00;
	CCAP0H = 0x7f;//PrePlusVol//占空比=256*50% 
	CCAP1L = 0x00;
	CCAP1H = 0x7f;//PrePlusVol//占空比=256*50% 
}


unsigned char PWM_status(void)
{
	unsigned char ctime;
	ctime = CL;
	_nop_();_nop_();
	_nop_();_nop_();
	if(ctime == CL)
		return 0;//没有PWM
	else
		return 1;
}
void PWM_run(void)
{
	TR0  = 1;      // timer 0 run 
	CR = 1;         //run PCA
}

void PWM_stop(void)
{
	TR0  = 0;      // timer 0 
	CR = 0;
}

void PWM_changfreq(unsigned short freq)
{
/*
204       238   ee
217       239   ef
227       240	f0 
244	      241
263	      242
286	      243
303	      244
333	      245
370	      246
416	      247
476	      248
526	      249
625	      250
740	      251
926	      252
1220	  253
1852	  254	 fe
*/
	unsigned char time0;
	
	if(freq < 200)
		time0 = 0xee;
	else if(freq < 217)
		time0 = 0xee;
	else if(freq < 227)
		time0 = 0xef;
	else if(freq < 217)
		time0 = 0xf0;
	else if(freq < 227)
		time0 = 0xef;
	else if(freq < 244)
		time0 = 0xf0;
	else if(freq < 263)
		time0 = 0xf1;
	else if(freq < 286)
		time0 = 0xf2;
	else if(freq < 303)
		time0 = 0xf3;
	else if(freq < 333)
		time0 = 0xf4;
	else if(freq < 370)
		time0 = 0xf5;
	else if(freq < 416)
		time0 = 0xf6;
	else if(freq < 476)
		time0 = 0xf7;
	else if(freq < 526)
		time0 = 0xf8;
	else if(freq < 625)
		time0 = 0xf9;
	else if(freq < 740)
		time0 = 0xfa;
	else if(freq < 926)
		time0 = 0xfb;
	else if(freq < 1220)
		time0 = 0xfc;
	else if(freq < 1852)
		time0 = 0xfd;
	else if(freq > 1852)
		time0 = 0xfe;

	TL0   = time0;       //
	TH0   = TL0;       	 //
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -