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

📄 pwm.c

📁 一个简单的helloworld编程
💻 C
字号:
#include <string.h>
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\timer.h"

#define READ_COUNT2 (rTCNTO2 & 0xffff)
#define	MaxBeepFreq	50000
#define	MinBeepFreq	20

extern int  Uart_GetIntNum(void);
void SetBeepPwm(unsigned short Freq, unsigned char HiRatio);
void StopBeepPwm(void);
void __irq TIMER2_int(void);
 //volatile int isWdtInt;
unsigned int pwmcnt=0;

/****************************************
 *	PWM (BEEP) test		*
 ****************************************/
void Test_Pwm(void)
{
    int  beginf, endf;
    int  i, j;
    Uart_Printf("[pwm (beep)  Test]\n");
    Uart_Printf("input begin f= (%d--%d): ", MinBeepFreq,MaxBeepFreq);
    beginf = Uart_GetIntNum();
     while (beginf<MinBeepFreq ||beginf>=MaxBeepFreq)
    {
     Uart_Printf("ERROR !!!!  input begin f= (%d--%d): ", MinBeepFreq,MaxBeepFreq);
     beginf = Uart_GetIntNum();
    }
    Uart_Printf("input end f= (%d--%d): ", MinBeepFreq,MaxBeepFreq);
    endf = Uart_GetIntNum();
     while (endf<MinBeepFreq ||endf>=MaxBeepFreq ||endf < beginf )
    {
     Uart_Printf("ERROR !!!!  input end f> beginf   (%d--%d) : ",MinBeepFreq,MaxBeepFreq);
     endf = Uart_GetIntNum();
    }

   Uart_Printf("beginf= %d ; endf=%d : ", beginf, endf );
     	 
    rINTCON = 5; 
    rINTMOD = 0;
    rINTMSK=~(BIT_GLOBAL|BIT_TIMER2);
    pISR_TIMER2= (unsigned  int)TIMER2_int;   //(unsigned)
    rPDATE = 0x157;				//Beep = 10
    rPCONE = 0x596b;      // tout2				
    rPUPE  = 0xff;

  for (i=beginf; i<endf; i++)
    	{
         pwmcnt=0;
	 SetBeepPwm( i, 50);
	for (pwmcnt=0,j=0; pwmcnt<5;)
        {
        //Uart_Printf("j=%d\n",j++);
        }
	/* for (j=0; j<5;)
	{ 
	  while (READ_COUNT2>=1)
	  {
          
	   }
	  j++;
	 } */

    	 }
   StopBeepPwm();
}

void SetBeepPwm(unsigned short Freq, unsigned char HiRatio)
{
	if(Freq>MaxBeepFreq)
		Freq = MaxBeepFreq;
	if(HiRatio>100)
		HiRatio = 100;	
	rTCON  	&= 0xffff0fff;					// clear manual update bit, stop Timer2
	rTCFG0 	&= 0xffff00ff;					// set Timer 2&3 prescaler 0
	rTCFG1 	&= 0xfffff0ff;					// set Timer 2 MUX 1/16
	rTCFG1  |= 0x00000300;	
	rTCNTB2	 = MCLK/(Freq*16);				//if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
	rTCMPB2  = (rTCNTB2*(100-HiRatio))/100;	//if set inverter on,  when TCNT2<=TCMP2, TOUT is low,  TCNT2>TCMP2, TOUT is high
	rTCON	|= 0x00002000;					// manual update
	rTCON	&= 0xffff0fff;	  				// clear manal update bit
	rTCON   |= 0x0000d000;					// auto reload, inverter on, start Timer 2
}

void StopBeepPwm(void)
{
	rTCON &= ~0x1000;
}

void __irq TIMER2_int(void)
{
 rI_ISPC=BIT_TIMER2;
 pwmcnt++;
 return ;
}

⌨️ 快捷键说明

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