单片机控制蜂鸣器和弦音发音程序

//文件buz.h

#ifndef _BUZ_H_
#define _BUZ_H_

//SetupBzhx(M_BZ_KEY) ;
//=====buz 驱动频率定义==============
//声音结束符定义==
#define		VFR0	0
#define		VFR1	VP3K3
#define		VFR2	VP4K1
#define		VFR3	VP4K9

#define		VP2K3	2609  //2k
#define		VP2K6	2308
#define		VP2K9	2069  //

#define		VP3K3	1818//12000/2/3.3  //4K
#define		VP4K1	1463//12000/2/4.1
#define		VP4K9	1224//12000/2/4.9  //

//=====buz 驱动端口定义==============
sbit	P_BZV = P2^6 ;   //BUZ 充电
sbit	P_BUZ = P0^2 ;  //BUZ 驱动

//=====BUZ 端口操作==================
#define		BUZ_ON		P_BUZ = 1
#define		BUZ_OFF		P_BUZ = 0//

#define     BuzVcc_ON       P_BZV = 0
#define     BuzVcc_OFF      P_BZV = 1

//=====蜂鸣器声音种类================
#define	 	M_BZ			(unsigned char)0    //无
#define	 	M_BZ_KEY 	    (unsigned char)1	//按键音
#define	 	M_BZ_ON		    (unsigned char)2	//开机音
#define	 	M_BZ_OFF	    (unsigned char)3	//关机音

//=====蜂鸣器工作过程状态==========
#define	    MBZ_RST     (unsigned char)0
#define	    MBZ_P1      (unsigned char)1
#define	    MBZ_P2      (unsigned char)2
#define	    MBZ_P3      (unsigned char)3
#define	    MBZ_P4      (unsigned char)4    

//=====蜂鸣器声音结构定义=====
typedef	struct tBUZHX
{
	uint16 BzFre ;	//蜂鸣器 频率
	uint8 T_BzO ; //蜂鸣间 频率输出时间
	uint8 T_BzV  ; //蜂鸣器 VCC供电时间

}tBuzHx ;

//====函数声明=====
extern void SetupBzhx(uint8 MBz) ;
extern void CmdBzhx(void) ;

#endif

//文件buz.c
#include "global.h"
#include "hxbuz.h"

tBuzHx	*tBzHx ;

#define     VTB1      20  //20
#define     VTB2      6 //20
#define     VTB3      100 //50

const tBuzHx Bzx0[]={{VFR0,0,0}} ;
const tBuzHx Bzx1[]={{VFR2,VTB3,VTB2},{VFR0,0,0}} ;
//const tBuzHx Bzx2[]={{VP2K3,20,20},{VP2K6,20,20},{VP2K9,210,10},{VFR0,0,0}} ;
//const tBuzHx Bzx3[]={{VP2K9,20,20},{VP2K6,20,20},{VP2K3,210,10},{VFR0,0,0}} ;

const tBuzHx Bzx2[]={{VFR1,VTB1,VTB2},{VFR2,VTB1,VTB2},{VFR3,VTB3,VTB2},{VFR0,0,0}} ;
const tBuzHx Bzx3[]={{VFR3,VTB1,VTB2},{VFR2,VTB1,VTB2},{VFR1,VTB3,VTB2},{VFR0,0,0}} ;

uint8 RBzStatus = 0 ;
//***************************************
// 函数名称:SetupBzhx
// 函数功能:设置蜂鸣器模式
// 入口参数:该模式下的蜂鸣次数 蜂鸣相关数据清0
// 出口参数:无
// 返 回 值:无
//***************************************
void SetupBzhx(uint8 MBz)
{
    RBzStatus = MBZ_P1 ;
    BuzVcc_OFF ;
    BUZ_OFF ;
    TIMER5_IE_DIS ;

    switch(MBz)
    {
        case M_BZ_KEY:
            tBzHx = Bzx1 ;
            break ;
        case M_BZ_ON:
            tBzHx = Bzx2 ;
            break ;
        case M_BZ_OFF:
            tBzHx = Bzx3 ;
            break ;
        default :
            tBzHx = Bzx0 ;
            RBzStatus = MBZ_RST ;
            break ;
    }
}
//*************************************
// 函数名称:CmdBzhx
// 函数功能:蜂鸣器控制			 -
// 入口参数:无
// 出口参数:无
// 返 回 值:无
//***************************************
void CmdBzhx(void)
{
    static tBuzHx  Bx1 ;            

    switch(RBzStatus)
    {
        case MBZ_P1 :
            Bx1 = *tBzHx  ;
            Timer5_Reload(Bx1.BzFre) ;//设置频率
            if(Bx1.BzFre != VFR0) //非结束符
            {
                RBzStatus = MBZ_P2 ; 

                if(Bx1.T_BzV != 0)
                {
                    Bx1.T_BzV -- ;
                    BuzVcc_ON ;
                }
                else
                {
                //    BuzVcc_OFF ;
                }  

                if(Bx1.T_BzO != 0)
                {
                    Bx1.T_BzO -- ;
                    TIMER5_IE_ENB ;
                }
                else
                {
                //    TIMER5_IE_DIS ;
                }
            }
            else //为结束符
            {
                RBzStatus = MBZ_RST ;
            }             

            break ;
        case MBZ_P2 : 

            if(Bx1.T_BzV != 0)
            {
                Bx1.T_BzV -- ;
                BuzVcc_ON ;
            }
            else
            {
                BuzVcc_OFF ;
            }  

            if(Bx1.T_BzO != 0)
            {
                Bx1.T_BzO -- ;
                TIMER5_IE_ENB ;
            }
            else
            {
                TIMER5_IE_DIS ;
                BUZ_OFF ;
                tBzHx ++ ; //取下一个音调
                RBzStatus = MBZ_P1 ;
            }                   

            break ;

        default :
            break ;
    }

}

//======简易例程===========
void main(void)
{

	Delay() ;

	SetupBzhx(M_BZ_KEY) ; //调用音调程序-按键音

	while(1)
	{
		if(F_10MS)
		{
			F_10MS = 0 ;

			CmdBzhx() ;   //10MS调用一次程序

		}

	}

}

//-----定时器5中断程序------- 产生所需要的频率
 // [定时器5中断入口]
void Timer5Interrupt() interrupt 1 //timer5
{
//    P0 ^= SETB3 ;

	Bank1;
    ClrTF5  ;   //Bank1;
	Bank0;

    P_BUZ ^= P_BUZ ;

}
时间: 2024-10-05 04:27:32

单片机控制蜂鸣器和弦音发音程序的相关文章

单片机---控制蜂鸣器以0.5s的周期工作

1 /*采用定时的方法让继电器切换,切换频率大约为0.5s*/ 2 #include <reg52.h> //52系列单片机头文件 3 sbit Relay = P3^3; //声明单片机P3口的第4位 4 5 /*定时器T0初始化:主要是一些寄存器的配置 6 定时时间是0.25ms. 7 */ 8 void InitT0(void) 9 { 10 TMOD = 0x02; /*8位自动重装载定时器,当溢出时将TH0存放的值自动重装入TL0*/ 11 TL0 = 0x1A;//晶振11.059

AVR单片机教程——蜂鸣器

引子 定时/计数器(简称定时器)是单片机编程中至关重要的一部分,再简单的单片机也会带有定时器. 也许你会觉得我们已经在delay函数中接触过定时器了,然而并不是,它只是软件地通过"浪费时间"来实现延时.我们接触定时器在数码管中,segment_auto函数可以自动完成动态扫描,好像在main函数背后又开了一个线程,两者并行执行一样.这就用到了定时器中断. 中断是一种必要的程序流程控制方法,但这两讲我们先聚焦于利用定时器来输出波形. 本讲中,我们用定时器来输出一定频率的方波,让蜂鸣器发出

DIY单片机控制大功率LED最小系统

最近调试用手焊了一块单片机最小系统,实现了按键控制蜂鸣器.数码管.LED等简单的外围电路,虽然很简单,但是从这个过程中学习到了很多东西. 晒个手残焊工电路板,记录一下自己的过程,有时间了再详细记录自己的电路图.代码.以后也动手搞个FPGA的最小系统,刘筱一加油! 图 1 图2

单片机用定时器分配任务的程序结构总结

转载请注明本文地址:http://blog.sina.cn/dpool/blog/s/blog_6f2b6ba80101bwka.html?vt=4 http://blog.sina.cn/dpool/blog/s/blog_6f2b6ba80101bwka.html?vt=4本文是2013年写的,后来整理成了系统文章,请访问 http://nicekwell.net/ 查看单片机编程系列文章.以下是2013年原文:经过这几天做的程序,和以前做电子钟时的感悟,现在对单片机的整个程序结构做一下总结

51单片机控制的收音机(带串口,遥控,芯片89S52+LC72131+LA1845N)

本方案采用89S52做为主控芯片,LC72131+LA1845N做为收音模块,支持按键控制,红外线遥控控制,也可通过串口上位机控制,可以通过计算机并口更新单片机软件程序. 音量用两块DS1804控制,频率信息用一块1602液晶显示. 单面板,飞线很多,呵呵. 硬件方案.rar(Protel99) PC端控制软件.rar(VC++7.1,即Visual Stdio .Net 2003) 本方案的单片机软件使用C语言编写(Keil uVision3),LC72131芯片的驱动稍微麻烦,他使用SPI总

【003】AVR单片机控制发光二极管

点亮ARV单片机开发板上的一个LED灯 原理图:   分析:上面的截图就是单片机和LED灯的连接原理图,其中J6是一个排阻,起到限流的作用,防止LED电流过大而烧坏. 排阻的内部就是一组并联的电阻: 提示: 算一下这个排阻的电阻的大小,二极管的工作电流是3mA,工作电压时1.7V,VCC的电压时5V.所以电阻上的电流是3mA,电压是3.3V,所以电阻的阻值是1.1KΩ. 因为所有的二极管都是通过一个限流电阻共阳极的,所以只需要在Q端给一个低电平就能点亮这个发光二极管.Q端的电平通过一个573锁存

51单片机开发环境Keil4安装及程序开发图解

背景: 这篇文章是给我一个哥们写的,想从事技术开发工作,最欣赏有想法的人了,不喜欢混日子的人了,我就推荐他做硬件(不知道是不是误人子弟),然后就想让他学习一下单片机,正好我这里有一个大学时候的51开发板,让他了解一下,也试着学习一下编程和看原理图,让他有个大概的方向,也正好可以找找哥们自己的工作方向.文章内容很简单,但对于初学者来说比较有用,毕竟我大学学习的时候也是这么过来的,我一点一点的截图,给他做一下参考,所以大神路过请不要看了,以免耽误你的时间. 软件安装流程: 1.解压文件 2.打开文件

(七)单片机控制两路数据采集系统 这里要学习中断

自己修改电路图和代码,结果调试不成功?不知道为什么???? 电路图如下:  127   247  移动滑动变阻器没有软用??? 错误代码: 1 #include<reg52.h> 2 #define uchar8 unsigned char 3 #define uint16 unsigned int 4 sbit CLOCK = P2^0; 5 sbit START = P2^1; 6 sbit EOC = P2^3; // A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转

第五篇:本人多年来积累的单片机程序 资料下载(绝对干货,内附下载链接)

首先打个广告:如果需要做毕设以及嵌入式项目合作,欢迎进入我们工作室:创想嵌入式设计工作室 本人搜集的大量单片机源码资料及毕业设计资料,足有1200+套,很多实用的demo源码和毕业设计参考方案,可用于做项目时借鉴,博尾附有下载链接.(内附本人联系方式,可一起交流探讨,交朋友) 为了方便 查找,我已将项目源码的目录整理出来了,方便 采用"ctrl +F"快速查找验证是否有需要的demo.可以一键打包下载,也可只下载需要的demo. 下载链接内附本人联系方式,如果在安装过程中遇到问题,可以