|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (73.43 KB, 下載次數(shù): 48)
下載附件
2020-11-5 16:29 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (36.08 KB, 下載次數(shù): 49)
下載附件
2020-11-5 16:30 上傳
51hei.png (23.76 KB, 下載次數(shù): 55)
下載附件
2020-11-5 16:30 上傳
單片機(jī)源程序如下:
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define HALFF 460800 //11.9652MHZ晶振的半頻率
- #define MAX 65536 //16位計(jì)數(shù)器最大計(jì)數(shù)次數(shù)
- #define LED P3 //小燈 P0
- #define input P1 //鍵盤 P1
- #define soo 784//中音'5'
- #define dao 523 //宏定義高音‘1’頻率為1047Hz
- #define re 587
- #define mi 659
- #define fa 698
- #define so 784
- #define la 880
- #define xi 988
- sbit SPEAK = P2^3; //蜂鳴器聲音不怎么樣,我們使用揚(yáng)聲器,接P2.3口
- sbit S1 = P3^3;
- uint C; //定時(shí)器初始值定義
- bit flag=0; //功能切換標(biāo)志位
- uchar STH0;
- uchar STL0;
- uchar code lab[] = {dao,re,mi,fa,so,la,xi,soo,0XFF};
- void delay()
- {
- uint i,j;
- for(i=0; i<1000; i++)
- for(j=0; j<120; j++); //1ms
- }
- void DelayMs(uint n) //誤差 0us ,延時(shí)n毫秒
- {
- uint a,b,c;
- for(c=n; c>0; c--)
- for(b=199; b>0; b--)
- for(a=1; a>0; a--);
- }
- /******************************頻率發(fā)生函數(shù) 定時(shí)器T0*******************/
- void t0() interrupt 1 using 1
- {
- TH0 =STH0;
- TL0 =STL0;
- SPEAK = ~SPEAK;
- }
- void INT0_init(void) //定時(shí)器0初始化
- {
- TMOD = 0x01; //定時(shí)器T0用工作方式1(16位計(jì)數(shù)器)
- EA = 1; //開總中斷
- ET0 = 1; //開定時(shí)器T0中斷
- TR0 = 0; //T0停止運(yùn)行狀態(tài)
- }
- void play_song() //《兩只老虎》編曲
- {
- uchar i,j;
- uint code song[] = {dao,re,mi,dao,
- dao,re,mi,dao,
- mi,fa,so,
- mi,fa,so,
- so,la,so,fa,mi,dao,
- so,la,so,fa,mi,dao,
- re,soo,dao,
- re,soo,dao,
- 0xff}; //以0xff為音符結(jié)束標(biāo)志
- //以下為每個(gè)音符節(jié)拍,4個(gè)延時(shí)單位為1拍
- //'4'對(duì)應(yīng)4個(gè)延時(shí)單位,'2'對(duì)應(yīng)2個(gè)延時(shí)單位,'1'對(duì)應(yīng)1個(gè)
- uchar code JP[] = {4,4,4,4,
- 4,4,4,4,
- 4,4,8,
- 4,4,8,
- 3,1,3,1,4,4,
- 3,1,3,1,4,4,
- 4,4,8,
- 4,4,8
- };
- EA = 1; //開總中斷
- ET0 = 1; //開定時(shí)器T0中斷
- TMOD = 0x01; //定時(shí)器T0用工作方式1(16位計(jì)數(shù)器)
- while(!flag)
- {
- i = 0;
- while(song[i] != 0xff)
- {
- C = HALFF/song[i];
- STH0 = (MAX - C) / 256; // 高8位
- STL0 = (MAX - C) % 256; // 低8位
- TR0 = 1; //啟動(dòng)定時(shí)器
- for(j=0; j<JP[i]; j++) //控制節(jié)拍
- delay(); //延時(shí)1個(gè)延時(shí)單位
- TR0 = 0; //關(guān)閉定時(shí)器
- i++; //播放下一個(gè)音符
- }
- }
- }
- void key_play()
- {
- uchar temp;
- uchar num;
- input = 0xff;
- if(input!=0xff) //按鍵輸入P1口
- {
- DelayMs(5);
- if(input!=0xff)
- {
- temp = input;
- }
- }
- switch(temp)
- {
- case 0xfe:
- num=0;
- break;
- case 0xfd:
- num=1;
- break;
- case 0xfb:
- num=2;
- break;
- case 0xf7:
- num=3;
- break;
- case 0xef:
- num=4;
- break;
- case 0xdf:
- num=5;
- break;
- case 0xbf:
- num=6;
- break;
- case 0x7f:
- num=7;
- break;
- default:
- num=8;
- break;
- }
- C = lab[num]; //定時(shí)器0的初值
- if( C == 0XFF )
- {
- STH0 = (MAX - C) / 256; // 高8位
- STL0 = (MAX - C) % 256; // 低8位
- TR0 = 1;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
設(shè)計(jì)一 電子琴.rar
(1014.66 KB, 下載次數(shù): 56)
2020-11-5 15:49 上傳
點(diǎn)擊文件名下載附件
PCB,代碼,仿真 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|