按键控制音阶声音输出

发布者:chunxing最新更新时间:2012-11-10 来源: 21IC 关键字:按键控制  音阶声音输出  定时器 手机看文章 扫描二维码
随时随地手机看文章

/*
程序效果:用按键控制音符的输出,用单片机定时器控制频率,驱动喇叭发出不同的声音。一个简单的电子琴。
*/
#include //头文件
#define uchar unsigned char //宏定义
#define uint  unsigned int
sbit fmq=P3^4; //定义蜂鸣器的引脚
uchar code freq[36*2]={   //这些音乐频率我也不懂,关键是我不懂音律
 0xA9,0xEF,//00220HZ ,1  //0  
 0x93,0xF0,//00233HZ ,1#
 0x73,0xF1,//00247HZ ,2
 0x49,0xF2,//00262HZ ,2#
 0x07,0xF3,//00277HZ ,3
 0xC8,0xF3,//00294HZ ,4
 0x73,0xF4,//00311HZ ,4#
 0x1E,0xF5,//00330HZ ,5
 0xB6,0xF5,//00349HZ ,5#
 0x4C,0xF6,//00370HZ ,6
 0xD7,0xF6,//00392HZ ,6#
 0x5A,0xF7,//00415HZ ,7   
 0xD8,0xF7,//00440HZ 1     //12
 0x4D,0xF8,//00466HZ 1#    //13
 0xBD,0xF8,//00494HZ 2     //14
 0x24,0xF9,//00523HZ 2#    //15
 0x87,0xF9,//00554HZ 3     //16
 0xE4,0xF9,//00587HZ 4     //17
 0x3D,0xFA,//00622HZ 4#    //18
 0x90,0xFA,//00659HZ 5     //19
 0xDE,0xFA,//00698HZ 5#    //20
 0x29,0xFB,//00740HZ 6     //21
 0x6F,0xFB,//00784HZ 6#    //22
 0xB1,0xFB,//00831HZ 7     //23
 0xEF,0xFB,//00880HZ `1
 0x2A,0xFC,//00932HZ `1#
 0x62,0xFC,//00988HZ `2
 0x95,0xFC,//01046HZ `2#
 0xC7,0xFC,//01109HZ `3
 0xF6,0xFC,//01175HZ `4
 0x22,0xFD,//01244HZ  `4#
 0x4B,0xFD,//01318HZ `5
 0x73,0xFD,//01397HZ `5#
 0x98,0xFD,//01480HZ `6
 0xBB,0xFD,//01568HZ `6#
 0xDC,0xFD,//01661HZ `7    //35
};
uchar code jie[]={12,14,16,17,19,21,23,24}; //音符在频率表中的位置
uchar th,tl; //分别装载T0值得高低位
void main()
{
   uint i;  //延时变量
   EA=1; //打开总中断
   ET0=1; //打开定时器0
   TR0=1; //启动定时器0
   P0=0xf0;//判断按键是否按下的标志
   while(1)
   {
      fmq=1;//关闭蜂鸣器
      if((P0&0xf0)!=0xf0)//判断按键是否俺按下
      {     //在这我并没有延时消抖,有经验的人 就知道,
         if(P0==0x70)   //在要求严不格的情况下是可以不写消抖语句的
         {
            tl=freq[jie[0]*2]; //装初值
            th=freq[jie[0]*2+1];
            TR0=1;    //启动定时器0
            for(i=1000;i>0;i--); //延时
         }
         if(P0==0xb0)
         {
            tl=freq[jie[1]*2];
            th=freq[jie[1]*2+1];
            TR0=1;
            for(i=1000;i>0;i--);
         }
         if(P0==0xd0)
         {
            tl=freq[jie[2]*2];
            th=freq[jie[2]*2+1];
            TR0=1;
            for(i=1000;i>0;i--);
         }
         if(P0==0xe0)
         {
            tl=freq[jie[3]*2];
            th=freq[jie[3]*2+1];
            TR0=1;
            for(i=1000;i>0;i--);  
         } 
      } 
      TR0=0;//关闭定时器0
   }
}
void time0() interrupt 1   //用于产生唱歌的频率
{
   TH0=th;   //装初值
   TL0=tl;
   fmq=~fmq; //取反音乐输出
}

关键字:按键控制  音阶声音输出  定时器 引用地址:按键控制音阶声音输出

上一篇:定时器中断—频率计程序
下一篇:数码管显示的ADC0831电压表程序

推荐阅读最新更新时间:2024-03-16 13:12

avr定时器T0,T1,T2初始化配置及其说明
#include iom16v.h #include macros.h unsigned char shi,fen,miao; unsigned char t=0; #define DATA_T0_INIT 156 #define DATA_T1_INIT 31249 #define DATA_T2_INIT 156 unsigned int T0_CAPT=0; //T0/C0溢出中断向量端口 #pragma interrupt_handler Timer0_over:iv_TIMER0_OVF //T0/C0比较匹配中断向量端口 #pragma interrupt_handler Timer0_COMP:iv_TIMER
[单片机]
C52单片机定时器2介绍
定时器2是一个16位定时器/计数器,通过设置特殊功能寄存器T2CON中的C/T2位可将其设置为定时器或是计数器;通过设置T2CON中的工作模式选择位可将定时器2设置为三种工作模式,分别为捕获、自动重新装载(递增或是递减计数)和波特率发生器。 知识点一、定时器2的控制寄存器T2CON(可按位寻址)* D7位--TF2:定时器2溢出标志位。用于请求中断(必须由软件清0) D6位--EXF2:定时器外部标志位。当外部信号使能时,发生外部负跳变时置位请求中断(必须由软件清0) D5位--RCLK:接受时钟标志位。默认情况下串行口中模式1和模式3的时钟是由定时器1的溢出率提供,若该位置位,则由定时器2提供。 D4位--TCLK:发送时钟
[单片机]
stm32专题九:SysTick(一)系统嘀嗒定时器原理
SysTick是存在于stm32内核的定时器,嵌套在NVIC中,24位,只能递减。在stm32中文参考手册中,对于SysTick的描述其实很少,主要如下。systick的时钟可以为AHB时钟,或者是AHB时钟8分频=9M。而校准值固定为9000,也就是说,当时钟频率为9M时,9000的固定值对应1ms时间基准,9000 000对应1s时间。 在core-CM3编程手册中,有配置systick的寄存器描述。 SysTick控制和状态寄存器STK_CTRL 位描述: COUNTFLAG:如果上一次计数到0,则返回1,为计数标志。 CLKSOURCE:选择时钟源,为0时即为AHB时钟8分频,为1时直接就等于AHB总
[单片机]
stm32专题九:SysTick(一)系统嘀嗒<font color='red'>定时器</font>原理
单片机:中断及定时器工作
一、中断 1、中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断产生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A中断的地方继续处理事件A(中断返回),这一过程称为中断。 引起CPU中断的根源叫做中断源。 中断源向CPU的请求,叫做中断请求。 CPU暂时中断原来的事件A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。 实现上述中断功能的部件称为中断系统(中断机构) 2、中断响应优先级及中断服务程序入口表 3、中断优点 分时操作。CPU可以分时为多个I/O设备服务,
[单片机]
定时器定时模拟数字钟显示
#include reg52.h #define uchar unsigned char sbit P2_0 = P2^0; sbit P2_1 = P2^1; sbit P2_2 = P2^2; sbit P2_3 = P2^3; static unsigned char second,minute,hour; unsigned int tcount; unsigned char m; uchar code table ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90}; void delay(uchar i) {
[单片机]
<font color='red'>定时器</font>定时模拟数字钟显示
1个定时器多处复用的问题
问题: 在一个工程中往往需要用到多个定时,然而我们采用的CPU一般也只有2,3个定时器。显然是不够用的,那么应该怎么办呢? 我想如果使用过系统的人都会知道,在系统中有个时钟节拍,而多个任务都是共同使用这个时钟节拍进行延时或任务切换。那么我们是否可以借鉴一下呢? 下面我们LPC2131举例说明: ①. 宏定义: #define T0_CLOCK_TICK (100) // 1S中计数次数 #define T0_TASK_NUM (3) // 3个定时 ②. 进行定义一个定时数组: uint32
[单片机]
1个<font color='red'>定时器</font>多处复用的问题
【STM库应用】stm32 之 TIM (详解一 通用定时器
定时器,中断这两样东西是学习一个MCU必须掌握的,也是非常有用的! STM32的TIM一般有高级定时器TIM1,(TIM8只有在互联性产品有),普通定时器TIM2,TIM3,TIM4,(TIM5,TIM6,TIM7有点设备中没有);今天就只介绍普通定时器,因为高级定时器我还不会!每一个普通定时器都有4路通道! 我们先看看这个逻辑图吧!我们今天先讨论讨论定时器的问题!我用红色笔标过的路线就是定时器的工作路线,时钟有内部时钟产生,到PSC哪里进行分频处理,然后CNT进行计数,上面还有一个自动重装载寄存器APP。 这个是分频器的工作原理,我们可以看,分频器设定之前分频系数为1 ,后面的 分频系数为2,分频系数改变后,计数周
[单片机]
【STM库应用】stm32 之 TIM (详解一 通用<font color='red'>定时器</font>)
可提高实时时钟长期计时准确度时钟程序算法
摘 要: 通过对引起实时时钟计时误差因数的分析,给出了一种提高实时时钟长期计时准确度的实用而有效的软件方法。该方法具有成本低、易实现、通用性强、彻底校正等优点。   电子计时器通常以石英晶振为时钟源。时钟源的频率通常为几十kHz乃至几十MHz,而常用时钟的最小计时单位一般在0.01s~1s。高频的时钟源脉冲通过分频器后产生基本定时脉冲。电子计时器的计时部分就是对基本定时脉冲进行累加,产生秒、分、时等时间信息乃至日、月、年等日期信息。 1 引起计时误差的因数   一个常规电子计时器的计时准确度,取决于晶振标称频率(fs)与实际频率(fo)的频率偏差和晶振频率的时漂、温漂等离散参数。普通晶振的实际频率与标称频率有较大的偏差,可达万
[工业控制]
可提高实时时钟长期计时准确度时钟程序算法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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