|
該系統由延時子函數、初始化子函數、數碼管顯示子函數、高低音選擇子函數、播放音樂子函數、演奏模式子函數、定時器0中斷子函數、外部0中斷子函數、定時器1中斷子函數、主函數和數據定義這幾部分組成。
3.2 各部分軟件分析3.2.1 延時子函數
//延時子函數
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=340;y>0;y--);
}
3.2.2 初始化子函數
//初始化子函數
void init()
{
beep=0;
D1=1;
D2=0;
EA=1;//開總中斷
TCON=0x01;//外部中斷0設置為邊沿觸發
EX0=1;//開外部中斷0
ET0=1;
ET1=1;
TMOD=0x11;//定時器0,1工作在定時狀態,均為方式1
}
3.2.3 數碼管顯示子函數
//數碼管顯示子函數
void display1()
{
in(table1[aa]); //再傳段碼
out();
W1=0;;
delay(1); //延遲時間2ms以內
W1=1;
in(table1[cc+1]); //再傳段碼
out();
W2=0;
delay(1); //延遲時間2ms以內
W2=1;
}
3.2.4 高低音選擇子函數
//高低音選擇子函數
void yinjie()
{
if(k10==0)
{
delay(5);
if(k10==0)
{
aa=10;
bb=0;//返回10為seg[10]顯示C
}
}
if(k9==0)
{
delay(5);
if(k9==0)
{
aa=11;
bb=1;//返回11為seg[11]顯示L
}
}
if(k11==0)
{
delay(5);
if(k11==0)
{
aa=12;
bb=2;//返回12為seg[12]顯示H
}
}
if(aa==0)
{
aa=13;
}
}
3.2.5 播放音樂子函數
//播放音樂子函數
void display_music()
{
TH0=table2[table4-1];
TL0=table3[table4-1];
while(flag==0)
{
if(i<32)
{
TR0=1;
delay(57*table5);
i++;
}
if(i==32)
{
i=0;
}
}
}
3.2.6 演奏模式子函數
//演奏模式子函數
void display_play()
{
TR0=0;
TR1=0;
yinjie();
WE2=1;//關數碼管2
WE1=0;//開數碼管1
P0=table1[aa];
if(aa!=13&&flag==1)
{
if(k1==0)
{
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
TR1=1;
while(k1==0)
{
cc=0;
display1();
}
}
if(k2==0)
{
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
TR1=1;
while(k2==0)
{
cc=1;
display1();
}
}
if(k3==0)
{
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
TR1=1;
while(k3==0)
{
cc=2;
display1();
}
3.2.7 外部0中斷子函數
//外部0中斷子函數
void wb0() interrupt 0
{
if(k8==0)
{
delay(5);
while(k8==0);
flag=~flag;
D1=~D1;
D2=~D2;
}
}
3.2.8 定時器0中斷子函數
//定時器0中斷子函數
void t0() interrupt 1
{
TR0=0;
TH0=table2[table4-1];
TL0=table3[table4-1];
beep=~beep;
TR0=1;
}
3.2.9 定時器1中斷子函數
//定時器1中斷子函數
void t1() interrupt 3
{
TR1=0;
TH1=table2[7*bb+cc];
TL1=table3[7*bb+cc];
beep=~beep;
TR1=1;
}
3.2.10 主函數
//主函數
void main()
{
init();
while(1)
{
if(flag==0)
display_music();
else
display_play();
}
}
3.3 總源程序
#include<reg51.h>
#include<intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit SDA1=P0^2;//串行數據輸入,對應595的14腳SER
sbit SCL1=P0^1;//移位寄存器時鐘輸入,對應595的11腳SCK
sbit SCL2=P0^0;//存儲寄存器時鐘輸入,對應595的12腳RCK
sbit W1=P0^3;
sbit W2=P0^4;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit D1=P2^6;//播放音樂模式
sbit D2=P2^7;//彈奏模式
sbit k8=P3^2;//功能切換鍵
sbit k9=P3^3;//低音
sbit k10=P3^4;//中音
sbit k11=P3^5;//高音
sbit beep=P2^2;//蜂鳴器接口
uchar code table1[]={
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
0x37,/*N*///中音
0x38,/*L*///低音
0x76,/*H*///高音
0x79 /*E*/
};//共陰極數碼管
uchar code table2[]={
0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//中音
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,//低音的高8位
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};//音階頻率表 低八位
uchar code table3[]={
0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x2D,//中音
0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,//低音的低8位
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
uchar code table4[]={
1,2,3,1,
1,2,3,1,
3,4,5,
3,4,5,
5,6,5,4,3,1,
5,6,5,4,3,1,
1,12/*低音5*/,1,
1,12,1
};
uchar code table5[]={
4,4,4,4,
4,4,4,4,
4,4,8,
4,4,8,
2,1,2,1,4,4,
2,1,2,1,4,4,
4,4,6,
4,4,6
};
uchar i;
uchar key,aa=0;
uchar bb,cc;
bit flag=0;
//延時子函數
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=340;y>0;y--);
}
void in(uchar Data)
{
uchar i;
for(i=0;i<8;i++) //循環8次,剛好移完8位
{
Data<<=1;
SCL1=CY;
SDA1=1; //先將移位寄存器控制引腳置為低
_nop_();
_nop_();
SDA1=0;
}
}
void out()
{
SCL2=0; //先將存儲寄存器引腳置為低
_nop_();
SCL2=1; //再置為高,產生移位時鐘上升沿,上升沿時移位寄存器的數據進入數據存儲寄存器,更新顯示數據。
_nop_();
SCL2=0;
}
//初始化子函數
void init()
{
beep=0;
D1=1;
D2=0;
EA=1;//開總中斷
TCON=0x01;//外部中斷0設置為邊沿觸發
EX0=1;//開外部中斷0
ET0=1;
ET1=1;
TMOD=0x11;//定時器0,1工作在定時狀態,均為方式1
}
//數碼管顯示子函數
void display1()
{
in(table1[aa]); //再傳段碼
out();
W1=0;;
delay(1); //延遲時間2ms以內
W1=1;
in(table1[cc+1]); //再傳段碼
out();
W2=0;
delay(1); //延遲時間2ms以內
W2=1;
}
/部分代碼在壓縮包
|
-
PCB圖.png
(23.63 KB, 下載次數: 29)
下載附件
2020-11-2 15:37 上傳
PCB
-
元件清單.png
(11.85 KB, 下載次數: 44)
下載附件
2020-11-2 15:38 上傳
元器件
-
-
簡易電子琴設計.rar
2020-11-2 15:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
413.22 KB, 下載次數: 13, 下載積分: 黑幣 -5
|