为什么我做的这个激光竖琴声音特别小,有没有大佬帮忙看一下是哪里的问题
程序如下:- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit fmq=P2^0;//定义P2.0口为蜂鸣器信号输出
- uint z;
- uint code tone[8]={0xfc44,0xfcac,0xfd09,0xfd34,0xfd82,0xfdc8,0xfe06,0xfe22};//对应每个单调的计数初值
- uchar code keymode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//按键值,对应io:0,1,2,3,4,5,6,7
- /***************按键扫描函数***************/
- void anjian()//用整个P0口作为音调的输入按键(独立按键方式)
- {
- P0=0xff;//读数据先置1
- if(P0==~keymode[0]) //1
- {
- z=tone[0];
- P1=keymode[0];
- }
- if(P0==~keymode[1]) //2
- {
- z=tone[1];
- P1=keymode[1];
- }
- if(P0==~keymode[2]) //3
- {
- z=tone[2];
- P1=keymode[2];
- }
- if(P0==~keymode[3]) //4
- {
- z=tone[3];
- P1=keymode[3];
- }
- if(P0==~keymode[4]) //5
- {
- z=tone[4];
- P1=keymode[4];
- }
- if(P0==~keymode[5]) //6
- {
- z=tone[5];
- P1=keymode[5];
- }
- if(P0==~keymode[6]) //7
- {
- z=tone[6];
- P1=keymode[6];
- }
- if(P0==~keymode[7]) //1.
- {
- z=tone[7];
- P1=keymode[7];
- }
- }
- /************************************/
- void zdkg()
- {
- if(P0==0xff)
- {
- P1=0xff;
- TR1=0;//如果没有按键按下,就关闭定时器中断
- fmq=1;//同时也关闭蜂鸣器
- }
- else //否则就进入中断
- {
- TR1=1;
- }
- }
- /***************主函数***************************/
- void main()
- {
- EA=1;//开总中断
- ET1=1;//定时器T1中断允许
- TMOD=0x10;//使用定时器T1的模式1
- TH1=(65536-500)/256;//定时器T1的高8位重新赋初值
- TL1=(65536-500)%256;//定时器T1的低8位重新赋初值
- P1=0xff;//先关所有LED灯
- while(1)
- {
- anjian();//按键扫描函数
- zdkg();
- }
- }
- /*定时器T1的中断服务程序*/
- void Time1(void) interrupt 3 using 1
- {
- fmq=~fmq; //每进入一次中断就取反一次,快速的进入退出中断,就会听到蜂鸣器发出的音调
- TH1=z/256;//定时器T1的高8位重新赋初值
- TL1=z%256;//定时器T1的低8位重新赋初值
- }
复制代码
|