单片机八音盒程序

发布者:光速思考最新更新时间:2020-12-16 来源: 51hei关键字:单片机  八音盒  蜂鸣器 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

#include

#include

#define uhar unsigned char

#define uint  unsigned int

sbit key1=P3^2;//定义按key1可切换花样                                                                  

sbit key2=P3^3;//定义按key2可切换歌曲

sbit fm=P3^5;//蜂鸣器连续的IO口,接蜂鸣器的管脚

sbit rs=P2^0;

sbit rw=P2^1;

sbit ep=P2^2;

uchar i;

uchar Tong_index=0;//音乐片段索引音符索引

uchar song_index=0;

uchar *discode;//暂存LCD需要显示的歌名

uchar *song_Tone,*song_Time;

uchar code dis1[]={"song1"};//第一首歌名,dis1~dis4位LCD第一行要显示的歌名;

uchar code dis2[]={"song2"};

uchar code dis3[]={"song3"};

uchar code dis4[]={"song4"};

uchar code dis[]={"K1:Down K2:Up"};        //第二行显示的内容

uint code Tong_tab[]={62018,62401,62491,62895,63184,63441,63506,63773,

63965,64137,64215,64360,64488,64603,64654,64751,64836,64876,64948,65012,65067,65535};                                                                 

//---------------------------简谱---------------------------------------

//编程规则:字节高位是简谱,低位是持续时间,代表多少个十六分音符。

//1-7代表中央C调,8-E代表高八度,0代表停顿

//最后的0是结束标志

//uchar code song1_Tone[]={         //        歌曲1的演奏音符

//11,9,11,14,12,14,12,11,11,7,8,9,8,7,8,

//11,9,11,14,13,12,14,11,11,7,8,9,6,7,

//12,14,14,13,12,13,14,12,13,14,12,12,11,10,7,8,

//11,9,11,14,13,12,14,11,11,8,9,10,6,7,0xff};//结束标志

//uchar code song1_Time[]={ // 歌曲1的节拍频率

//4,2,2,8,4,2,2,8,4,2,2,4,2,2,12,

//4,2,2,4,2,4,4,8,4,2,2,4,2,12,

//4,4,8,4,2,2,8,2,2,2,2,2,2,2,2,16,

//4,2,2,4,2,4,4,8,4,2,2,4,2,12,0xff};

//uchar code song2_Tone[]={         //        歌曲2的演奏音符

//7,8,9,7,7,8,9,7,9,10,11,9,10,11,

//11,12,11,10,9,7,11,12,11,10,9,7,7,4,7,7,4,7,0xff};//结束标志

//uchar code song2_Time[]={ // 歌曲2的节拍频率

//4,4,4,4,4,4,4,4,4,4,8,4,4,8,

//2,2,2,2,4,4,2,2,2,2,4,4,4,4,8,4,4,8,0xff};       

//uchar code song3_Tone[]={         //        歌曲3的演奏音符

//7,7,7,8,9,9,9,9,10,11,12,12,11,10,9,11,11,8,9,7,

//7,7,7,8,11,9,9,9,10,11,12,12,11,10,9,11,11,8,9,7,0xff};//结束标志

//uchar code song3_Time[]={ // 歌曲3的节拍频率

//2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,

//2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,2,2,2,2,5,0xff};

//uchar code song4_Tone[]={         //        歌曲4的演奏音符

//5,9,9,9,9,8,7,8,7,6,5,12,12,12,12,12,11,

//2,11,11,10,9,9,12,12,11,9,8,7,8,7,6,5,9,

//2,7,7,6,5,9,8,7,6,4,12,0xff};//结束标志

//uchar code song4_Time[]={ // 歌曲4的节拍频率

//2,2,2,2,2,2,2,2,2,2,8,2,2,2,2,4,2,

//2,2,2,2,8,2,2,2,2,4,2,2,2,2,2,4,2,

//2,2,2,2,4,2,2,2,2,2,8,0xff};


void delayms(uint ms)

{

         uchar a;

         while(ms--)

                 {

                 for(a=230;a>0;a--);

                 }


}

uchar Busy_Check(void)//测试LED忙碌状态

{

        uchar LCD_Status;

        rs=0;

        rw=1;

        ep=1

        _nop_();

         _nop_();

         _nop_();

         _nop_();

         LCD_Status=P0&0x80;

         ep=0;

         return LCD_Status;

}

void led_wemd(uchar cmd)//写入指令数据到LCD

{

        while(Busy_Check());

                rs=0;

                rw=0;

                ep=0;

                _nop_()

                _nop_()

                P0=cmd;

                _nop_()

                _nop_()

                _nop_()

                _nop_()

                ep=1;

                _nop_()

                _nop_()

                _nop_()

                _nop_()

                ep=0;

}

void lcd_pos(uchar pos)

{

        lcd_wcmd(pos|0x80);

}

void lcd_wdat(uchar dat)

  {

        while(Busy_Check());

                rs=0;

                rw=0;

                ep=0;

                _nop_()

                _nop_()

                P0=cmd;

                _nop_()

                _nop_()

                _nop_()

                _nop_()

                ep=1;

                _nop_()

                _nop_()

                _nop_()

                _nop_()

                ep=0;

}

void lcd_init(void) //lcd初始化设定

{

lcd_wcmd(0x38); //设置显示格式为16*2行显示,5*8点阵,8位


delay(1);

lcd_wcmd(0x0C);        //0x0c-显示开关设置

delay(1);

lcd_wcmd(0x06);        //0x06读写后指针+1

delay(1);

lcd_wcmd(0x01);//清除lcd显示内容

}

//----------------------------简谱音调对应的定时器初值---------------------------

//适合11.0592M的晶振,对定时器置入的初值

uchar code cuzhi[]={

         0xff,0xff,//占位用的,没有实际的意义

         0xFC,0x8E,//中央C调1-7

         0xFC,0xED,       

         0xFD,0x43,       

         0xFD,0x6A,       

         0xFD,0xB3,       

         0xFD,0xF3,       

         0xFE,0x2D,

         0xFE,0x47,        //高八度1-7          

         0xFE,0x76,

         0xFE,0xA1,

         0xFE,0xC7,       

         0xFE,0xD9,

         0xFE,0xF9,

         0xFF,0x16

         };

uchar yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};

//将音调转化为对应的LED样式

void delay1(uint z);        //延时1MS

void delay(uint z);        //延时165MS,即十六分音符

void song();

void beep();//蜂鸣器叫一声


void int0() interrupt 0

{

delayms(100);

if(INT0==0)

        {

                TR0=0;

                if(song_index>5)

                {

                song_index=5;

                }

                 else{song_index++;}

                 if(song_index==1)

                 {temp=songl[i];discode=dis2;}

                 if(song_index==2)

                 {temp=song2[i];discode=dis3;}

                 if(song_index==3)

                 {temp=song3[i];discode=dis4;}

                 if(song_index==4)

                 {temp=song4[i];discode=dis1;song_index=0;}

                 TR0=1;

                 i=0;

        }

}

void int1() interrupt 2  //外部中断1

{

  delayms(100);

if(INT1==0)

        {

                TR1=0;

                if(song_index<1)

                {

                song_index=0;

                }

                 else{song_index--;}

                 if(song_index==1)

                 {temp=song[i];discode=dis2;}

                 if(song_index==2)

                 {temp=song2[i];discode=dis3;}

                 if(song_index==3)

                 {temp=song3[i];discode=dis4;}

                 if(song_index==4)

                 {temp=song4[i];discode=dis1;song_index=0;}

                 TR0=1;

[1] [2]
关键字:单片机  八音盒  蜂鸣器 引用地址:单片机八音盒程序

上一篇:51单片机计算器(加减乘除)完善
下一篇:STC15F104W单片机四路按键循环开关程序

推荐阅读最新更新时间:2024-11-10 18:16

飞思卡尔16位单片机(二)——CodeWarrior开发环境搭建
一、安装CodeWarrior 飞思卡尔16位单片机的开发环境为CodeWarrior5.1,这个软件安装比较简单,软件的安装文件可以从相应的网站上下载。安装CodeWarrior所需要的电脑的硬件资源也比较宽泛,目前一般的电脑都可以满足这个要求,可以支持win10、win7等操作系统。安装过程按照按照软件的提示一步步操作即可。 二、安装USBDM驱动 USBDM是飞思卡尔16位单片机的少些代码及调试程序的工具。飞思卡尔16位单片机可以支持多种调试工具,典型的有官方的调试器和开源的USBDM调试器,由于开源的调试器版本比较多,不同版本驱动的安装方法也不相同,所以USBDM驱动的安装需要参考厂家的使用说明进行。安装
[单片机]
飞思卡尔16位<font color='red'>单片机</font>(二)——CodeWarrior开发环境搭建
51单片机晶体振荡电路以及选择模式
1.晶振12MHz,电容30PF左右。 2.外接晶体振荡器,外部振荡信号直接加到XTAL1,并将XTAL2悬空 3.晶体振荡器的作用,为cpu提供工作频率,这里指AT89C51。 4.内部方式,外部方式,是指cpu使用自带的工作频率还是外部提供的时钟振荡频率。 5.XTAL1, XTAL2是51的2个引脚,如果使用内部时钟,则2个引脚接地。
[单片机]
51<font color='red'>单片机</font>晶体振荡电路以及选择模式
MSP430单片机IO面面观
一、MSP430单片机的端口概述 P1~P6每组有8个I/O 口,P3、P4、P5、P6具有I/O及其它片内外设功能,每组具有4个寄存器。P1、P2除具有上述功能外还具有中断能力,每组具有7个寄存器。 二、Px端口 1. P1、P2端口 (1)PxDIR 输入/输出方向寄存器(x代表1,2) 相互独立的八位分别定义了Px7~Px0,8个引脚的输入输出方向。 0 输入模式,只能读。 1 输出模式,可读可写。 8位在PUC后都被复位及置为0。 Eg:P1DIR = 0x0F; 这里,0x0F为16进制表示,对应的二进制为0000 1111,即将P1DIR的高4位置0,低4位置1,也就是将P1.7
[单片机]
STC Monitor-51的单片机在线仿真调试
引言 当今很多院校中,单片机的教学仍以经典的51内核单片机为主。其实验与应用开发中最重要的环节是软、硬件综合调试,通常采用的方法主要有两种:一种是使用仿真器,优点是功能齐全,但是价格较高,一般厂家研发采用;另一种是使用软件仿真和芯片直接烧写验证的方法,其成本虽然低,但在程序或硬件出现疑难问题时,很难找到原因。 实际上,还有一种成本低且具有在线仿真调试功能的技术是在线仿真调试,它特别适合初学者。 在线仿真调试 是指:通过Keil C51编译器,结合单片机中的监控程序,对系统的应用程序和硬件进行仿真调试,可以让单片机以单步、断点、全速等运行模式来执行程序。在线仿真调试是单片机应用开发过程中的高效方法,国内STC公司的51内核单片机IA
[单片机]
STC Monitor-51的<font color='red'>单片机</font>在线仿真调试
【51单片机】(手把手教你)串口通信-基础篇
通信方式 并行 适合短距离通信,并行通信控制简单、相对传输速度快(8位一起传输)。 串行 只能一位一位的传送。 同步(了解) 建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙。 发送方对接收方的同步可以通过外同步和自同步 异步(常) 以字符(构成的帧)为单位进行传输。数据位从低到高传送。 格式: 这里的空闲时间是任意的。 串行通信的制式(传输方向) 单工(仅能沿一个方向) 半双工(可进行双向,但需分时) 全双工 串行通信的错误校验 奇偶校验 在发送数据时,数据位尾随的1位为奇偶校验位(1/0)。
[单片机]
【51<font color='red'>单片机</font>】(手把手教你)串口通信-基础篇
基于51单片机的蓝牙台灯设计
功能如下: 1、通过按键调节灯的亮度(1-10档位); 2、通过蓝牙远程控制灯的亮度和开关; 3、感应,根据附近是否有人自动进行开关灯。 部分程序: #include #include #include sys_define.h #include pwm.h #include uart.h uchar Lamp_OnOff = 1; //台灯开关标志位 uchar Reaction_OnOff = 0; //人体感应开关标志位 sbit Key2 = P2^6; sbit Key4 = P2^5; sbit Key5 = P2^4; sbit Key6 = P2^3; sbit Reaction = P2^7; v
[单片机]
基于51<font color='red'>单片机</font>的蓝牙台灯设计
STM32单片机的TEA加密通信设计
环境: 主机:WIN7 开发环境:MDK4.72 单片机:STM32 说明: 在项目中单片机会与服务器进行网络通讯。需要对通讯加密,我选择了TEA加密算法。 *说明:TEA加密解密算法 *TEA(TinyEncryptionAlgorithm)是一种简单高效的加密算法,以加密解密速度快, *实现简单著称。 *算法很简单,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作为key, *算法采用迭代的形式, *推荐的迭代轮数是64轮,最少32轮。 **********************************************************************
[单片机]
你了解GD32 MCU上下电要求吗
你了解GD32 MCU的上下电要求吗?MCU的上下电对于系统的稳定运行非常重要。 以GD32F30X为例,上电/掉电复位波形如如下图所示。 上电过程中,VDD/VDDA电压上电爬坡,当电压高于VPOR(上电复位电压)MCU开始启动,之后内部逻辑电路延迟2ms后NRST引脚拉高,MCU正式启动,此为上电过程。上电过程中,对于上电爬坡斜率没有要求,对于电源稳定性有要求,上电过程中尽量避免电源波动以及突然的跌落,比如上电到2.6V以后再次跌落到POR附近,但没有跌破PDR,则有可能造成MCU加载代码异常进而导致启动失败。 掉电过程中,当电压低于VPDR后,NRST拉低,MCU完成掉电。掉电电压需要跌落到VPDR以下,尽量跌落到0V
[单片机]
你了解GD32 <font color='red'>MCU</font>上下电要求吗
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved