您的位置:首页 > 其它

TQ2440裸奔程序>>PWM蜂鸣器测试程序

2013-01-02 18:38 351 查看
转自:http://caiyh.blog.163.com/blog/static/18670512220115152564613/

//=========================================

// NAME: main.c

// DESC: TQ2440PWM测试程序

// 蜂鸣器频率响 GPB0 设置为TOUT

// 设置为输出低电平就关掉蜂鸣器

// 改变频率通过改变时钟频率

//=========================================

/* 头文件包含 */

#include "def.h"

#include "option.h"

#include "2440addr.h"

void delay_ms(U32 time)

{

//定时器3输入时钟频率 = PCLK / {预分频值+1} / {分频值}

//{预分频值} = 0~255

//{分频值} = 2, 4, 8, 16

//PCLK:50MHz 时钟频率:6250KHz 定时1ms 计数:时钟频率*定时时间-1

U32 val = 50000000/(4*2)/1000-1;



rTCFG0 = (rTCFG0 & ~(0xff<<8)) | (3<<8);//Prescaler1 = 3+1

rTCFG1 = (rTCFG1 & ~(0xf<<12)) | (0<<12);//mux = 1/2



rTCNTB3 = val;

rTCMPB3 = rTCNTB3/2; //占空比50%



rTCON = (rTCON & ~(0xf<<16)) | (0xb<<16);//自动重载、变相、手动更新、启动定时器3

rTCON = (rTCON & ~(0x2<<16)); //禁止手动更新



while(time--) //等待一次定时结束

{

while(rTCNTO3 >= (val>>1));

while(rTCNTO3 < (val>>1));

}

}

void buzzer_freq_set(U32 freq)

{

//定时器1输入时钟频率 = PCLK / {预分频值+1} / {分频值}

//{预分频值} = 0~255

//{分频值} = 2, 4, 8, 16

//PCLK:50MHz 时钟频率:6250KHz 定时1ms 计数:时钟频率*定时时间-1

// 50000000/(16*8) = 390625

rGPBCON = (rGPBCON & ~0x3) | 0x2;//GPB0口设置为TOUT PWM 0b10



rTCFG0 = (rTCFG0 & ~0xff) | 15; //Prescaler0 = 15+1

rTCFG1 = (rTCFG1 & ~0xf) | 0x2; //mux = 1/8 0b0010



rTCNTB0 = 50000000/(16*8)/freq;

rTCMPB0 = rTCNTB0/2; //占空比50%



rTCON = (rTCON & ~0x1f) | 0xb; //禁止死区、自动重载、变相、手动更新、启动定时器3

rTCON = (rTCON & ~0x2); //禁止手动更新

}

void buzzer_stop(void)

{

rGPBCON = (rGPBCON & ~0x3) | 0x1;//GPB0口设置为输出0b01

rGPBDAT = (rGPBDAT & ~0x1); //GPB0口输出低电平关掉蜂鸣器

}

void beep(U32 freq,U32 time)

{

buzzer_freq_set(freq);

delay_ms(time);

buzzer_stop();

}

void Main(void)

{

beep(20000,100);

while(1);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: