单片机实现简单音乐发生器

发布者:平稳心绪最新更新时间:2016-09-07 来源: eefocus关键字:单片机  音乐发生器 手机看文章 扫描二维码
随时随地手机看文章
/* 主程序 */

void main()

{

       uchar key,k;

 

       TMOD = 0x01;                                                // T0,工作方式1

 

       ET0 = 1;

       EA = 1;

 

      while(1)

    {

              P1 = 0xf0;                                                      // 发全0行扫描码

              if ((P1&0xf0)!=0xf0)                               // 若有键按下

              {

                     delay();                                            // 延时去抖动

                     if ((P1&0xf0)!=0xf0)                        // 延时后再判断一次,去除抖动影响

                     {

                            key = getkey();                                   // 调用键盘扫描函数

 

                            // 根据获取的按键位置得到k值

                            switch(key)

                          {

                               case 0x11:                                         // 1行1列

                                          k = 0;

                                          break;

                                   case 0x21:                                         // 1行2列

                                          k = 1;

                                          break;                 

                                   case 0x41:                                         // 1行3列

                                          k = 2;

                                          break;

                               case 0x81:                                         // 1行4列

                                          k = 3;

                                          break;

                                   case 0x12:                                         // 2行1列

                                          k = 4;

                                          break;

                                   case 0x22:                                         // 2行2列

                                          k = 5;

                                          break;

                                   case 0x42:                                         // 2行3列

                                          k = 6;

                                          break;

                                   case 0x82:                                         // 2行4列

                                          k = 7;

                                          break;

                                   case 0x14:                                         // 3行1列

                                          k = 8;

                                          break;

                                   case 0x24:                                         // 3行2列

                                          k = 9;

                                          break;

                                   case 0x44:                                         // 3行3列

                                          k = 10;

                                          break;

                                   case 0x84:                                         // 3行4列

                                          k = 11;

                                          break;

                                   case 0x18:                                         // 3行4列

                                          k = 12;

                                          break;

                                   case 0x28:                                         // 3行4列

                                          k = 13;

                                          break;

                                   case 0x48:                                         // 3行4列

                                          k = 14;

                                          break;

                                   case 0x88:                                         // 3行4列

                                          k = 15;

                                          break;

                                   default: 

                                          break;

                            }     

 

                            P20 = ~P20;                                       // 反相

             

                            /* 根据所得的k值设定计数器1的计数初值 */

                     STH0 = tab[k]/256;

                    STL0 = tab[k]%256;

 

                          TR0 = 1;                                                 // 开始计数

 

                            P1 = 0xf0;                                                 // 发全0行扫描码

                            while ((P1&0xf0)!=0xf0)                        // 若没有松开按键

                            {

                                   P1 = 0xf0;      

                            }

 

                            TR1 = 0;                                                 // 若按键松开,则停止计数,不产生脉冲输出

                     }

              }

       }   

}

关键字:单片机  音乐发生器 引用地址:单片机实现简单音乐发生器

上一篇:单片机实现语音录放
下一篇:单片机实现电子密码锁

推荐阅读最新更新时间:2024-03-16 15:08

有关单片机延时程序
应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动 DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。 以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要: mov r0, #09h loop: djnz r0, loop 51 单片机的指令周期是晶振频率的1/12,也就是1us一个周期。mov r
[单片机]
PIC16F877单片机的图形液晶显示模块接口技术
  引言   由于液晶显示器(LCD)具有功耗低、体积小、质量轻、超薄等其他显示器无法比拟的优点,它广泛用于各种智能型仪器和低功耗电子产品中。点阵式(或图形式) LCD不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕上下左右滚动、动画、闪烁、文本特征显示等功能,用途十分广泛。本文在简介液晶显示器MG-12232的驱动器SED1520F0A的结构、功能的基础上,介绍了PIC16F877单片机的LCD硬件接口电路和软件编程特点。   一、PIC16F877与MG-12232的硬件接口电路   1.SED1520F0A的接口信号   SED1520F0A属行列驱动及控制合一的小规模液晶显示驱动芯片,电路简单,
[单片机]
PIC16F877<font color='red'>单片机</font>的图形液晶显示模块接口技术
基于单片机与CPLD的步进电机PWM驱动技术
步进电动机是一种将数字信号转换为位移(或直线位移)的机电执行元件,每当输入一个脉冲时,转轴便转过一个固定的机械角度,他具有快速起停、精确步进、没有积累误差且能直接接收数字信号的特点,在数字控制系统中得到了广泛的应用。步进电机的运动性能和他的驱动器有密切的关系,驱动器的性能的优劣直接影响到步进电机运行的好坏。细分驱动方式可以减小步进电机的步矩角,提高分辨率,使电机运行更加平稳均匀,可以减小或消除低频振动。利用恒流和细分驱动技术可以大大提高步进电机的步矩分辨率,减小转矩波动,避免低频共振及降低运行噪声。通常的步进电机控制方法是采用CPU配合专用的步进电机驱动控制器来实现,存在成本高、不同种类的电动机必须要有相应的驱动控制器与之配对
[嵌入式]
基于<font color='red'>单片机</font>与CPLD的步进电机PWM驱动技术
关于PIC单片机18系列超低功耗软件编程的关键点
最近做了个PIC超低功耗的项目,对功耗要求非常高。之前也看到网上一些文章,写得很好,但实现测试下来还是不行的。 这里总结一下,给同行分享一下,软件编程上要注意以下几点, 1,不用的模块要关闭 这里的模块,不光是enable位,而是PMD 2,不用的IO口要置成输出 这里和网上其它文章说的输入不一样,实测下来我这边是输出待机电流更低 3,内部稳压一定要关闭 这里千万要注意:一定要选择通过 controlled by REGSLP bit ,否则单片机SLEEP后就死了,再也不能烧写了,这点不能让人理解,但实际测试确实如此 具体做法: (1) (2) WDTCONbits.REGSLP = 1;
[单片机]
单片机实现接触式的IC卡读写控制
从上高中开始,我们学校用的餐卡就为接触式的IC卡,在校园里还分布着很多的IC卡电话,上大学以后学校使用的校园一卡通,为非接触式是射频式IC卡,因此对IC卡有了兴趣,在学习单片机的过程中,了解到单片机可以实现IC卡的读写控制,在参考有关资料的基础上,学习的利用单片机实现接触式的IC卡读写控制。 主要器件: 1、 AT89S8252单片机芯片,此芯片具有SPI接口,可以用来读写IC卡芯片。 2、 使用与SPI接口兼容的串行数据接口的IC卡芯片AT45D041A,支持在系统重编程,可用于数字语音、图像和数据的存储。 试验流程图: 试验电路图: 试验程序代码: //ICRdWr.h程序 #ifnd
[单片机]
<font color='red'>单片机</font>实现接触式的IC卡读写控制
单片机控制开关电源
单片机控制开关电源,单从对电源输出的控制来说,可以有几种控制方式. 其一是单片机输出一个电压(经DA芯片或PWM方式),用作电源的基准电压.这种方式仅仅是用单片机代替了原来的基准电压,可以用按键输入电源的输出电压值,单片机并没有加入电源的反馈环,电源电路并没有什么改动.这种方式最简单. 其二是单片机扩展AD,不断检测电源的输出电压,根据电源输出电压与设定值之差,调整DA的输出,控制PWM芯片,间接控制电源的工作.这种方式单片机已加入到电源的反馈环中,代替原来的比较放大环节,单片机的程序要采用比较复杂的PID算法. 其三是单片机扩展AD,不断检测电源的输出电压,根据电源输出电压与设定值之差,输出PWM波,直接控制电源的工作.这种方式单
[单片机]
基于热敏电阻的多点温度测量系统
  0.引言   在现代农业中,许多情况下需要 温度测量 ,用来测量温度的 传感器 种类很多, 热敏电阻 器就是其中之一。热敏电阻灵敏度高、稳定性好、体积小、电阻值大等特点,已广泛于温度测量和控制领域。在所有被动式 温度传感器 中,热敏电阻的灵敏度(即温度每变化一度时电阻的变化)最高,在温室大棚内,温度测量 精度 一般在±0.5—1ºC左右,在这种情况下,,热敏电阻的引线长度在100—200米,对测量造成的误差可以忽略不计,使测量系统的电路简单、使用方便。   1.热敏电阻的测量电路   在多点温度测量系统中,热敏电阻采用温度-频率法测量框图,如图1所示。   图1温度—频率测量原理   图1
[单片机]
基于热敏电阻的多点温度测量系统
8位MCU TM56F1552在电陶炉的应用方案,集成低噪声OPA
随着人们生活水平的不断提高,消费者对厨房电器的要求越来越高,对电器的环保节能特性,安全性,灵活性等都有很高的需求,电陶炉由于其加热效率高且可以持续加热,无辐射,适用性高等特点很好的满足了目前消费者的需要。 为了满足市场上对于电陶炉产品的需求,本文介绍一种成熟的电陶炉产品整体解决方案,方案由AC-DC电源芯片与8位MCU主控两部分组成,MCU内置触摸模块,LED/LCD显示驱动模块,多路PWM输出,带基准电压源的ADC以及EEPROM存储器等模块。其中主控TM56F1552芯片内集成了低噪声OPA,CMP,LDO,CTK,可以减少产品零件数目及降低成本。 方案中TM56F1552是一款8位内置OPA,外围电路简单,可以节省B
[嵌入式]
8位<font color='red'>MCU</font> TM56F1552在电陶炉的应用方案,集成低噪声OPA
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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