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

 //=========================================
// 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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值