分享

MidTouch21触摸式电子琴源程序

 盛世管 2010-12-06
 
 
 
音节数值表
 
 
 
 
 
 
 
 
/*********************************************************************************************
程序名:    DoToy系列作品 MidTouch21电子琴程序
编写人:    杜洋 
编写时间:  2009年6月3日
硬件支持:  STC11L60XE 外部12MHZ晶振 电源3V
接口说明:  详见《DoToy_MidTouch21电路原理图》 
修改日志:  
  NO.1-20090603_17.54 完成电子琴21键的测试(20090603_1备)
 NO.2-20090604_01.29 改为第二次新板的硬件电路(20090604_2备)
/*********************************************************************************************
说明:
用STC11Fxx单片机I/O接口的高阻态输入功能,扫描I/O接口电平。
手指将VCC线和I/O接口线半连接,产生高电平信号。
/*********************************************************************************************/
void INIT(void);
#include <STC11Fxx.H>
/*********************************************************************************************/
sbit SPEAKER  = P1^0;//扬声器,低使能
sbit LED   = P3^0;//LED正极,强推
sbit LED2   = P3^1;//LED负极
sbit KEY11   = P2^0;
sbit KEY12   = P2^1;
sbit KEY13   = P2^2;
sbit KEY14   = P2^3;
sbit KEY15   = P2^4;
sbit KEY16   = P2^5;
sbit KEY17   = P2^6;
sbit KEY21   = P2^7;
sbit KEY22   = P4^4;
sbit KEY23   = P4^5;
sbit KEY24   = P4^6;
sbit KEY25   = P0^7;
sbit KEY26   = P0^6;
sbit KEY27   = P0^5;
sbit KEY31   = P0^4;
sbit KEY32   = P0^3;
sbit KEY33   = P0^2;
sbit KEY34   = P0^1;
sbit KEY35   = P0^0;
sbit KEY36   = P3^3;
sbit KEY37   = P3^2;
/*********************************************************************************************/
unsigned char MUSIC;
unsigned char STH0,STL0;
unsigned int code tab[]={ //音阶表
63628,63835,64021,64103,64260,64400,64524,  //低音1-7
64580,64684,64777,64820,64898,64968,65030, //中音1-7
65058,65110,65157,65178,65217,65252,65283 //高音1-7
};
/*********************************************************************************************/
void delay1ms (unsigned int a){ // 1ms延时程序(12MHz 10倍于51单片机速度时)
 unsigned int i;
 while( --a != 0){
  for(i = 0; i < 600; i++);
 }         
}/***************************************************************************************/
void INIT(void){//初始化程序
 TMOD=0x11;
 ET0=1;
 ET1=1;
 EA=1;
 P0M1 = 0xff;//I/O接口工作方式
 P0M0 = 0x00;//P0全为高阻输入
 P1M1 = 0xfe;//P1.0为准双向,其他为高阻输入
 P1M0 = 0x00;
 P2M1 = 0xff;//P2全为高阻输入
 P2M0 = 0x00;
 P3M1 = 0xfc;//P3.0为强推,其他为标准双向
 P3M0 = 0x01;
 P4M1 = 0xff;//P4全为高阻输入
 P4M0 = 0x00;
 P4SW = 0xff;
 LED = 1;
 LED2 = 0;
 SPEAKER = 0;
}
/***************************************************************************************/
void main(void){
 INIT(); //初始化
 while(1){
  if(KEY37 == 1){delay1ms(20);if(KEY37 == 1){MUSIC = 20;}} //高音B(37)
  if(KEY36 == 1){delay1ms(20);if(KEY36 == 1){MUSIC = 19;}}
  if(KEY35 == 1){delay1ms(20);if(KEY35 == 1){MUSIC = 18;}}
  if(KEY34 == 1){delay1ms(20);if(KEY34 == 1){MUSIC = 17;}}
  if(KEY33 == 1){delay1ms(20);if(KEY33 == 1){MUSIC = 16;}}
  if(KEY32 == 1){delay1ms(20);if(KEY32 == 1){MUSIC = 15;}}
  if(KEY31 == 1){delay1ms(20);if(KEY31 == 1){MUSIC = 14;}}
//3 
  if(KEY27 == 1){delay1ms(20);if(KEY27 == 1){MUSIC = 13;}}
  if(KEY26 == 1){delay1ms(20);if(KEY26 == 1){MUSIC = 12;}}
  if(KEY25 == 1){delay1ms(20);if(KEY25 == 1){MUSIC = 11;}}
  if(KEY24 == 1){delay1ms(20);if(KEY24 == 1){MUSIC = 10;}}
  if(KEY23 == 1){delay1ms(20);if(KEY23 == 1){MUSIC = 9;}}
  if(KEY22 == 1){delay1ms(20);if(KEY22 == 1){MUSIC = 8;}}
  if(KEY21 == 1){delay1ms(20);if(KEY21 == 1){MUSIC = 7;}}
//2 
  if(KEY17 == 1){delay1ms(20);if(KEY17 == 1){MUSIC = 6;}}
  if(KEY16 == 1){delay1ms(20);if(KEY16 == 1){MUSIC = 5;}}
  if(KEY15 == 1){delay1ms(20);if(KEY15 == 1){MUSIC = 4;}}
  if(KEY14 == 1){delay1ms(20);if(KEY14 == 1){MUSIC = 3;}}
  if(KEY13 == 1){delay1ms(20);if(KEY13 == 1){MUSIC = 2;}}
  if(KEY12 == 1){delay1ms(20);if(KEY12 == 1){MUSIC = 1;}}
  if(KEY11 == 1){delay1ms(20);if(KEY11 == 1){MUSIC = 0;}}
//1
  if(MUSIC != 0xff){ //如果有音阶数值(非0XFF时)
      STH0=tab[MUSIC]/256; //将音阶的频率值装入定时器T0
      STL0=tab[MUSIC]%256;
      TR0=1; //启动定时器
   MUSIC = 0xff; //清除寄存器
  }else{ //否则
      SPEAKER = 1; //关扬声器
   LED = 1;
   TR0=0; //关定时器
  }
    }
}
/***************************************************************************************/
void t0(void) interrupt 1 using 0{//定时器0产生音频
  TH0=STH0;
  TL0=STL0;
  SPEAKER=~SPEAKER; //取反频率产生音调
  LED = SPEAKER; //LED同频闪烁
}
/***************************************************************************************/
/*************************************************************
* 杜洋工作室 www.DoYoung.net
/*************************************************************/

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多