51单片机之电子琴设计

显示效果如下:

 #include <reg51.h> 

#include <intrins.h>
 
#define uint unsigned int 
#define uchar unsigned char

sbit SPK = P3^7;                  //P3.7外接扬声器
uint FreqTemp;
unsigned int code Freqtab[] = { //定时半周期的初始值
     64021,64103,64260,64400,      //低音3 4 5 6
     64524,64580,64684,64777,      //低音7,中音1 2 3
     64820,64898,64968,65030,      //中音4 5 6 7
     65058,65110,65157,65178};     //高音1 2 3 4

uchar Keyscan(void)             /* 按键扫描程序 */

     uchar i, j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7}; 
     for(j = 0; j < 4; j++) {    //循环四次,扫描四行
       P1 = Buffer[j];           //在低四位分别输出一个低电平
       _nop_(); 
       temp = 0x80;              //计划先读出P1.7位
       for(i = 0; i < 4; i++) { //循环四次,检查四列
         if(!(P1 & temp)) {      //从高四位,截取1位
           return (i + j * 4); //返回取得的按键值 
         }
         temp >>= 1;             //换右边一位
     } }
     return 16;                  //没有键按下就返回16

void Display(uchar k)
{
     P2 = ((k / 10) << 4) + (k % 10);
}

void main() 

     uchar Key_Value = 16, Key_Temp1, Key_Temp2;//读出的键值 
     TMOD = 0x01;                   //T0定时方式1
     ET0 = 1;                       //允许T0中断
     EX0 = 1;                       //允许X0中断

     EA = 1;

     while(1) 

       TR0 = 0;                     //暂不发音
       Key_Temp1 = Keyscan();       //读入按键

       if(Key_Temp1 != 16) 

{        

         Display(Key_Value);        //显示键值、延时消抖 
         Key_Temp2 = Keyscan();     //再读一次

         if (Key_Temp1 == Key_Temp2) //两次相等

{

           Key_Value = Key_Temp1; //就确认下来
           FreqTemp = Freqtab[Key_Value]; //根据键值,取出定时半周期的初始值
           Display(Key_Value);      //显示
           TR0 = 1;                 //启动定时器,发音
           while (Keyscan() < 16); //等待释放
           SPK = 1;                 //停止发音

}

 }

 }

 }

void T0_INT(void) interrupt 1      /* 按键中断 */
{
     TL0 = FreqTemp;                //载入定时半周期的初始值
     TH0 = FreqTemp >> 8;
     SPK = ~SPK;                    //发音

时间: 2024-12-25 17:04:03

51单片机之电子琴设计的相关文章

51单片机之电子钟设计

#include<reg52.h> //#include"DS18B20_3.H" #include <string.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char #define wd 1 //定义是否有温度功能  =0时无温度,=1时有温度 #define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为

手机-基于51单片机的蓝牙开关的设计

问题描述 基于51单片机的蓝牙开关的设计 求助!继电器电路是这样的,由P2口控制,低电平继电器闭合,共有8路继电器,以第一路继电器为例,手机端发送1继电器闭合,再发送1继电器断开,但程序弄了半天也没弄明白,求大神给个程序,万分感谢!!! 解决方案 51单片机之电子钟设计

用51单片机做一个数字电子钟

问题描述 用51单片机做一个数字电子钟 想用51单片机做一个电子钟,但是刚接触单片机,只会编流水灯的程序,请指点一下具体的实现原理 解决方案 单片机,数字电子钟51单片机之电子钟设计 解决方案二: 实时时钟的话要接其他芯片DS1302什么的,简单的秒表这样的在计时器中断里面计数,然后再控制数码管扫描显示出来就好了

基于51单片机频率计的代码问题,求大神解答啦~

问题描述 基于51单片机频率计的代码问题,求大神解答啦~ 基于51单片机的频率计设计 软件设计原理:利用单片机内部资源,定时器0定时一秒,计数器1在1s内计数,从而计算得频率. 这样能测得1hz~450khz. 我想设定当频率小于10hz时,定时器0定时10s,计数器1在10s内计数,结果测得的数据除以10就得到频率,从而获得0.1hz~10hz更精确的频率. 现在代码测试的情况是:被测频率大于10hz没有问题,如果被测频率小于10hz,结果显示为10倍的频率,意思就是程序中没有除以10,怎么改

图片-小弟有一个51单片机的汇编课程设计求助

问题描述 小弟有一个51单片机的汇编课程设计求助 小弟经管专业的,,不知道学校怎么想的开了这门课,朋友们求助.在这个实验平台上作业个简易电子琴或者多种模式的跑马灯就行!求带上接线方法.图片说明 解决方案 http://wenku.baidu.com/link?url=Q20AsAfHOJbj0wiknsLSI6T4sb3bn7oomEtGGhR3NLDSz2QirIHSrZy1oiwDN0ncfgmowdD4uAfqzNOkq-hh1Nevk1X8vMp_xUup6hHyDzG

《51单片机应用开发从入门到精通》——2.12 电子琴

2.12 电子琴 51单片机应用开发从入门到精通本实例是采用44矩阵式键盘设计出16个音符,随意弹奏. 2.12.1 硬件设计 电子琴电路设计如图2-19所示. 单片机P3为输入端口,接有44矩阵式键盘,键盘上标出16个音符.键盘的4条行线的一端与单片机P3端口的P3.0.P3.1.P3.2和P3.3口相接,另一端通过上拉电阻接到 + 5V上:4条列线的一端与P3端口的P3.4.P3.5.P3.6和P3.7口相接.单片机的P2.4端口为输出端,通过限流电阻R1与三极管基极相接,三极管的集电极接有

单片机课程设计-基于51单片机的分时分区照明控制器的汇编程序

问题描述 基于51单片机的分时分区照明控制器的汇编程序 (1)具有3种固定的模式,作息模式之间可以根据时间自动转换或手动转换.模式如下: 手动:可以任意管制各个分区的照明. 时间控制:按照学校日常运行模式,6:00~12:00.14:00~18:00启用照明,其他时间关闭,自动切换. 自动模式:在6:00~12:00.14:00~18:00启用照明时间段中,6:00开始启用照明,当室外照度达到一定强度时,关闭B区.C区照明,当室外照度低于一定强度时,重新启用.在此期间,A区采用温度场控制,当该区

c语言课程设计-51单片机用c语言如何去制作电子音乐盒

问题描述 51单片机用c语言如何去制作电子音乐盒 需要屏幕可以显示所播放的歌曲,可以切换下一曲和上一曲,谢了 解决方案 http://www.pudn.com/downloads93/sourcecode/others/detail366282.html 解决方案二: http://wenku.baidu.com/link?url=PLCsLkd19wZPtRCUQkyW-QLQRzAwQoII711b20f22tcoKpmOiQJYxDcGHUZwfThuDDNOoNF4NXzdM8mhdDt

c语言电子设计-怎么用51单片机做2048游戏机 谢谢大神

问题描述 怎么用51单片机做2048游戏机 谢谢大神 液晶屏可以是12864 还要系统整体用电池供电 显示并记录分数 希望告诉一下整体思路 如果提供液晶屏模块的代码 感激不尽 解决方案 http://bbs.elecfans.com/jishu_303992_1_1.html