⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dianziqin.c

📁 本设计及能产生低音5至高音4
💻 C
字号:
#include "reg52.h"
#include <stdio.h>	
#include <absacc.h>
#include <math.h>

sbit P2_7 = P2^7;	
unsigned char STH0; 
unsigned char STL0; 

/* 音符与计数值对应表 */
 unsigned int code tab[]={64260,64400, 
                 64524,64580,64684,64777, 
                 64820,64898,64968,65030, 
                 65058,65110,65157,65178}; 


/*主程序 */
void main()
{
	unsigned char key,k;
	unsigned char i,j;
	unsigned char get(void); 

	TMOD = 0x01;	
	EA = 1;
	ET0 = 1;
	

 	while(1)
    {
		P1 = 0xf0;			 				
		if ((P1&0xf0)!=0xf0)					// 有键按下
		{
								
			for(i=50;i>0;i--)                     // 去抖动

               for(j=200;j>0;j--)
			    ; 

			if ((P1&0xf0)!=0xf0)				// 确定键盘有按下
			{
				key = get();					// 调用键盘扫描函数

			
				switch(key)
   				{
      			
					case 0x41:						//第 1行第3列 低5 SO	392HZ
						k = 2;
						break;
     				case 0x81:						 //第 1行第4列 低6 LA	440HZ
						k = 3;
						break;
					case 0x12:						// 第2行第1列 低7 SI	494HZ
						k = 4;
						break;
					case 0x22:						// 第2行第2列 中1 DO	523HZ
						k = 5;
						break;
					case 0x42:						// 第2行第3列 中2 RE	587HZ
						k = 6;
						break;
					case 0x82:						// 第2行第4列 中3 MI	659HZ
						k = 7;
						break;
					case 0x14:						// 第3行第1列 中4FA	   698HZ
						k = 8;
						break;
					case 0x24:						// 第3行第2列 中5 SO	784HZ
						k = 9;
						break;
					case 0x44:						// 第3行第3列 中6 LA	880HZ
						k = 10;
						break;
					case 0x84:						// 第3行第4列 中7 SI	988HZ
						k = 11;
						break;
					case 0x18:						// 第4行第1列 高1 DO	1046HZ
						k = 12;
						break;
					case 0x28:						// 第4行第2列 高2 RE	1175HZ
						k = 13;
						break;
					case 0x48:						// 第4行第3列 高3 MI	1318HZ
						k = 14; 
						break;
					case 0x88:						// 第4行第4列 高4 FA	1397HZ
						k = 15;
						break;
					default:	
						break;
				}	

				P2_7 = ~P2_7; 					
		
				/* 由k值设定计数器1的计数初值 */
      		    STH0 = tab[k]/256;
       		    STL0 = tab[k]%256; 

      		  	TR0 = 1;							

				P1 = 0xf0;			 			
				while ((P1&0xf0)!=0xf0)			
				{
					P1 = 0xf0;	
				}

				TR1 = 0;							
			}
		}
	}    
}

  


	/* 定时器0中断服务子程序 */
void time0(void) interrupt 1
{
	/* 设置计数初值 */
  	TH0 = STH0;
  	TL0 = STL0; 
   	P2_7=~P2_7; 	
}				


/* 键扫描子程序 */
unsigned char get(void)
{
	unsigned char scan,temp;

	if ((P1&0xf0)==0xf0)			
		return(0);

	scan = 0xfe;
	while((scan&0x10)!=0)		
	{
		P1 = scan;			
		if ((P1&0xf0)!=0xf0)	
		{
			temp = (P1&0xf0)|0x0f;
			
			return((~scan)+(~temp));
		}
		else scan = (scan<<1)|0x01;		
	}
}






  




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -