最近我在学校图书馆借了一本AD实战应用书,上面的第一个案例就是声光电子琴,因为我们老师教的单片机是STC15F2K60S2,所以我自己就没用51而是用STC15来做。
我按照书上来连线,其中有一些小的地方我改了一下,电路原理图在下方,其中我比较疑惑与质疑的是蜂鸣器那个模块。我使用的是无源蜂鸣器,想通过定时器在IO口产生不同频率的方波来驱动蜂鸣器使其发出不同的音调,电路图我是按照书上连的,不知到对不对,定时器的几组初值存放在数组中:
uchar tone[] = {
0x8e,0xf8,
0x5e,0xf9,
0x18,0xfa,
0x6d,0xfa,
0x09,0xfb,
0x95,0xfb,
0x11,0xfc };
也不知道对不对。
![360截图20221201190459885.jpg](
然而我在protues的仿真中发现蜂鸣器不会响,也不知道是proteus的问题还是我程序写错了。我的程序如下:
#include <STC15F2K60S2.H>
#include <intrins.H>
#define uint unsigned int
#define uchar unsigned char
void key_scan(void);
void delay(uint x);
sbit speaker = P3^4;
bit sound_flag = 0;
uchar num;
uchar tone[] = {
0x8e,0xf8,
0x5e,0xf9,
0x18,0xfa,
0x6d,0xfa,
0x09,0xfb,
0x95,0xfb,
0x11,0xfc };
uchar LED[] = {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf};
void main(void)
{
TMOD = 0x00;
EA = 1;
ET0 = 1;
while(1)
{
key_scan();
if(sound_flag == 1)
{
P1 = LED[num];
TL0 = tone[2*(num-1)];
TH0 = tone[2*(num-1)+1];
TR0 = 1;
delay(100);
TR0 = 0;
P1 = 0xff;
num = 0;
sound_flag =0;
}
}
}
void T0_ISR() interrupt 1
{
speaker = ~speaker;
}
void key_scan(void)
{
uchar temp;
temp = P2;
while(temp != 0xff)
{
delay(10);
while(temp != 0xff)
{
switch(temp)
{
case 0xfe:num = 7;break;
case 0xfd:num = 6;break;
case 0xfb:num = 5;break;
case 0xf7:num = 4;break;
case 0xef:num = 3;break;
case 0xdf:num = 2;break;
case 0xbf:num = 1;break;
default: num = 0;
}
sound_flag = 1;
while(temp != 0xff)
{
temp = P2;
}
}
}
}
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<1000;j++);
}
我的设计经验不足,请各位大佬指点迷津。