×
单片机 > 单片机程序设计 > 详情

八弦激光竖琴电路图与单片机源码

发布时间:2021-09-15 发布时间:
|

==============所需元件==========================
激光头 * 8
5mm光敏电阻 * 8
开关 * 1
轻触按键 * 1
usb座或DC座 * 1
1k电阻 *2
10k电阻 * 10
3mmLED * 1
无源蜂鸣器 * 1
s8550三极管 * 1
排针(用于下载) * 1
STC89C52单片机 * 1
DIP40的单片机座 * 1
12M晶振 * 1
30pf瓷片电容 * 2
10uf电解电容 * 1

===============用到的工具=======================
电烙铁、焊锡丝、助焊剂可选、剪钳、镊子、热熔胶枪与热熔胶

================================================
===============激光竖琴使用说明=================
================================================

8个激光束 —— 对应中音的1、2、3、4、5、6、7,还有高音1


注意事项  —— 手弹奏时,请选取光线较弱的室内。当弹奏不灵敏时,请转到更暗的环境。

电路原理图如下:


单片机源程序如下:

//*********            51简易电子琴程序              *****************


#include

#define uint unsigned int

#define uchar unsigned char


sbit fmq=P0^0;//定义P0.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()//用整个P2口作为音调的输入按键(独立按键方式)

{

        

        P2=0xff;//读数据先置1

        if(P2==~keymode[0]) //1

        {

                z=tone[0];

                P1=keymode[0];

        }

/**/

        if(P2==~keymode[1]) //2

        {

                z=tone[1];

                P1=keymode[1];

        }

/**/

         if(P2==~keymode[2]) //3

        {

                z=tone[2];

                P1=keymode[2];

        }

/**/

        if(P2==~keymode[3]) //4

        {

                z=tone[3];

                P1=keymode[3];

        }

/**/

        if(P2==~keymode[4]) //5

        {

                z=tone[4];

                P1=keymode[4];

        }

/**/

         if(P2==~keymode[5]) //6

        {

                z=tone[5];

                P1=keymode[5];

        }

/***/

        if(P2==~keymode[6]) //7

        {

                z=tone[6];

                P1=keymode[6];

        }

/* */

        if(P2==~keymode[7]) //1.

        {

                z=tone[7];

                P1=keymode[7];

        }



}

/************************************/

void zdkg()

{

        if(P2==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位重新赋初值

}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计