Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7563400
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2011-07-13 22:38:33

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

//  工程名称:  PWM.mcp

//  功能描述:  实现占空比为50%PWM输出,按第一、二个键可增加或减少频率

//  IDE环境:   ADS v1.2 TX2440A

//  组成文件:  main.c

//  硬件连接: 

//  维护记录:  Lzy     2011-7-13  V1.0       

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

 

#include "2440addr.h"   

#include "string.h"

#include "def.h"

#include "2440lib.h"

 

extern unsigned int PCLK;

 

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

// 语法格式:void Buzzer_Freq_Set(U32 freq)

// 功能描述: 设置蜂鸣器频率函数

// 入口参数: freq

// 出口参数:

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

void Buzzer_Freq_Set(U32 freq)

{  

    rTCFG0 &= ~0xff;

    rTCFG0 |= 15;         //prescaler = 15+1  timer0的时钟频率为50M/16 = 3.125MHz

    rTCFG1 &= ~0xf;

    rTCFG1 |= 2;          //mux = 1/8   timer0的时钟频率为50M/16/8 = 0.39MHz    

 

    rTCNTB0 = (PCLK>>7)/freq;  //设置timer0初值

    rTCMPB0 = rTCNTB0>>1;    // 50%

 

    rTCON &= ~0x1f;

   

    rTCON |= 0xb;         //自动重载, 反向关闭, 手动刷新, 启动timer0

    rTCON &= ~2;          //clear manual update bit

}

 

int Main(void)

{

    U16 freq =800;  //默认频率为800;

   

    memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);

 

    /*初始化系统时钟*/

    SetSysFclk(FCLK_400M);      //设置系统时钟 400M    

    ChangeClockDivider(2, 1);      //设置分频 148

    CalcBusClk();                     //计算总线频

 

    rGPFCON = (rGPFCON | 0xFFFF) & 0xFFFF0055;  //GPF0--GPF3设置为output,GPF4--GPF5为输入      

   rGPFUP  = rGPFUP & 0xFFF0;                  //使能GPF上拉电阻

   rGPFDAT = 0xFF;                            //GPF4位初始化为1  

   

    rGPBCON &= ~3;            //设置GPB B0TOUT0输出 PWM输出管脚

    rGPBCON |= 2;

   

    Buzzer_Freq_Set(freq);  

 

    while(1)

    {

        if(!(rGPFDAT & 0x10))           

        {

            if((freq > 20))  //最大频率为2000

            {

                freq -= 10;

                Buzzer_Freq_Set(freq);

               

                rGPFDAT = 0xfe;       //点亮第一个灯 

                Delay(20);

                rGPFDAT = 0xff;              

            }      

        }

       

        if(!(rGPFDAT & 0x20))

        {

            if((freq < 2000))   //最大频率为2000

            {

                freq += 10;

                Buzzer_Freq_Set(freq);

               

                rGPFDAT = 0xfd;       //点亮第二个灯 

                Delay(20);

                rGPFDAT = 0xff;                  

            }

        }

    }

}

 

 

 

阅读(1376) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~