标题:
stc15f2k60s2单片机电子琴的源程序和仿真
[打印本页]
作者:
a281096058
时间:
2018-5-28 23:10
标题:
stc15f2k60s2单片机电子琴的源程序和仿真
作为保存吧
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(19.11 KB, 下载次数: 46)
下载附件
2018-5-29 03:37 上传
单片机源程序如下:
#include "stc15f2k60s2.h" //调系统头文件
#define Display P0 //定义数码管显示端
#define Speak P24 //定义蜂鸣器接口
#define uint unsigned int
#define uchar unsigned char
unsigned char sth,stl; //定义全局变量 sth stl
unsigned int i,j; //定义循环变量i j
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义数码管显示 0-9,A-F
unsigned char code Music_Code[]={ //八个音符 do re mi fa so la si 高音do
0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66,
0xfb,0x03,0xfb,0x8f,0xfc,0x0b,0xfd,0xee};
void delay_ms(unsigned int time) //毫秒延时函数
{
uint z;
uchar x,y;
for(z=0;z<time;z++)
for(x=5;x>0;x--)
for(y=97;y>0;y--);
}
void Time0_Init() //定时器T0初始化函数
{
TMOD=0x01; //工作方式1
TH0=sth; //定时器高八位赋初值
TL0=stl; //定时器低八位赋初值
ET0=1; //使能T0中断
EA=1; //打开全局中断
TR0=0; //关闭定时器T0
}
void main() //主函数入口
{
Time0_Init(); //定时器T0初始化
P2=0x00;
Speak=1; //蜂鸣器端口置1 停止工作。
while(1) //无限循环
{
switch(P1) //switch语句判断检测 P1按键状态
{
case 0xfe: //P1=0xfe "do"按键按下
delay_ms(10); //延时去抖
if(P1==0xfe) //再判断"do"按键是否按下
{
Display=table[1]; //数码管显示"1"
i=0; //i置0
TR0=0; //关闭定时器T0
sth=Music_Code[2*i]; //定时器高八位赋值 "do"
stl=Music_Code[2*i+1]; //定时器低八位赋值 "do"
TR0=1; //启动定时器T0
for(j=0;j<=1000;j++) //软件延时,在一定时间里检测
{
delay_ms(10); //延时一下
if(P1==0xfe) continue; //"do"按键按下,跳出(继续发音)
else break; //松开了,则返回
}
Display=0x00; //关闭数码管显示
Speak=1; //蜂鸣器端口置1 停止工作。 TR0=0; //关闭定时器T0
for(;;)
{
while(P1==0xfe); //等待按键松开
delay_ms(10); //延时去抖
if(P1==0xfe) continue;
else break; //确定松开,退出
}
TR0=0; //关闭定时器T0
}
break; //返回
case 0xfd: //P1=0xfd "re"按键按下
delay_ms(10); //延时去抖
if(P1==0xfd) //再判断"re"按键是否按下
{
Display=table[2]; //数码管显示"2"
i=1; //i置1
TR0=0; //关闭定时器T0
sth=Music_Code[2*i]; //定时器高八位赋值 "re"
stl=Music_Code[2*i+1]; //定时器低八位赋值 "re"
TR0=1; //启动定时器T0
for(j=0;j<=1000;j++) //软件延时,在一定时间里检测
{
delay_ms(10); //延时一下
if(P1==0xfd) continue; //"re"按键按下,跳出(继续发音)
else break; //松开了,则返回
}
Display=0x00; //关闭数码管显示
Speak=1; //蜂鸣器端口置1停止工作。 TR0=0; //关闭定时器T0
for(;;)
{
while(P1==0xfd); //等待按键松开
delay_ms(10); //延时去抖
if(P1==0xfd) continue;
else break; //确定松开,退出
}
}
TR0=0; //关闭定时器T0
break; //返回
case 0xfb: // "mi"按键按下
delay_ms(10); //延时去抖
if(P1==0xef) //再判断"mi"按键是否按下
{
Display=table[3]; //数码管显示"3"
i=2; //i置2
TR0=0; //关闭定时器T0
sth=Music_Code[2*i]; //定时器高八位赋值 "mi"
stl=Music_Code[2*i+1]; //定时器低八位赋值 "mi"
TR0=1; //启动定时器T0
for(j=0;j<=1000;j++) //软件延时,在一定时间里检测
{
delay_ms(10); //延时一下
if(P1==0xef) continue; //"mi"按键按下,跳出(继续发音)
else break; //松开了,则返回
}
Display=0x00; //关闭数码管显示
Speak=1; //蜂鸣器端口置1,停止工作。
TR0=0; //关闭定时器T0
for(;;)
{
while(P1==0xef); //等待按键松开
delay_ms(10); //延时去抖
if(P1==0xef) continue;
else break; //确定松开,退出
}
}
TR0=0; //关闭定时器T0
break; //返回
case 0xf7: //"fa"按键按下
delay_ms(10); //延时去抖
if(P1==0xf7) //再判断"fa"按键是否按下
{
Display=table[4]; //数码管显示"4"
i=3; //i置3
TR0=0; //关闭定时器T0
sth=Music_Code[2*i]; //定时器高八位赋值 "fa"
stl=Music_Code[2*i+1]; //定时器低八位赋值 "fa"
TR0=1; //启动定时器T0
for(j=0;j<=1000;j++) //软件延时,在一定时间里检测
{
delay_ms(10); //延时一下
if(P1==0xf7) continue; //"fa"按键按下,跳出(继续发音)
else break; //松开了,则返回
}
Display=0x00; //关闭数码管显示
Speak=1; //蜂鸣器端口置1停止工作。 TR0=0; //关闭定时器T0
for(;;)
{
while(P1==0xf7); //等待按键松开
delay_ms(10); //延时去抖
if(P1==0xf7) continue;
else break; //确定松开,退出
}
}
TR0=0; //关闭定时器T0
break; //返回
case 0xef: //"so"按键按下
delay_ms(10); //延时去抖
if(P1==0xef) //再判断"so"按键是否按下
{
Display=table[5]; //数码管显示"5"
i=4; //i置4
TR0=0; //关闭定时器T0
sth=Music_Code[2*i]; //定时器高八位赋值 "so"
stl=Music_Code[2*i+1]; //定时器低八位赋值 "so"
TR0=1; //启动定时器T0
for(j=0;j<=1000;j++) //软件延时,在一定时间里检测
{
delay_ms(10); //延时一下
if(P1==0xef) continue; //"so"按键按下,跳出(继续发音)
else break; //松开了,则返回
}
Display=0x00; //关闭数码管显示
Speak=1; //蜂鸣器端口置1 停止工作。 TR0=0; //关闭定时器T0
for(;;)
{
while(P1==0xef); //等待按键松开
delay_ms(10); //延时去抖
if(P1==0xef) continue;
else break; //确定松开,退出
}
}
TR0=0; //关闭定时器T0
break; //返回
case 0xdf: //"la"按键按下
delay_ms(10); //延时去抖
if(P1==0xdf) //再判断"la"按键是否按下
{
Display=table[6]; //数码管显示"6"
i=5; //i置5
TR0=0; //关闭定时器T0
sth=Music_Code[2*i]; //定时器高八位赋值 "la"
stl=Music_Code[2*i+1]; //定时器低八位赋值 "la"
TR0=1; //启动定时器T0
for(j=0;j<=1000;j++) //软件延时,在一定时间里检测
{
delay_ms(10); //延时一下
if(P1==0xdf) continue; //"la"按键按下,跳出(继续发音)
else break; //松开了,则返回
}
Display=0x00; //关闭数码管显示
Speak=1; //蜂鸣器端口置1停止工作。
TR0=0; //关闭定时器T0
for(;;)
{
while(P1==0xdf); //等待按键松开
delay_ms(10); //延时去抖
if(P1==0xdf) continue;
else break; //确定松开,退出
}
}
TR0=0; //关闭定时器T0
break; //返回
case 0xbf: //"si"按键按下
delay_ms(10); //延时去抖
if(P1==0xbf) //再判断"si"按键是否按下
{
Display=table[7]; //数码管显示"7"
i=6; //i置6
TR0=0; //关闭定时器T0
sth=Music_Code[2*i]; //定时器高八位赋值 "si"
stl=Music_Code[2*i+1]; //定时器低八位赋值 "si"
TR0=1; //启动定时器T0
for(j=0;j<=1000;j++) //软件延时,在一定时间里检测
{
delay_ms(10); //延时一下
if(P1==0xbf) continue; //"si"按键按下,跳出(继续发音)
else break; //松开了,则返回
}
Display=0x00; //关闭数码管显示
Speak=1; //蜂鸣器端口置1停止工作。 TR0=0; //关闭定时器T0
for(;;)
{
while(P1==0xbf); //等待按键松开
delay_ms(10); //延时去抖
if(P1==0xbf) continue;
else break; //确定松开,退出
}
}
TR0=0; //关闭定时器T0
break; //返回
case 0x7f: //"高音do"按键按下
delay_ms(10); //延时去抖
if(P1==0x7f) //再判断"高音do"按键是否按下
{
Display=0x86; //数码管显示"1"带小数点(1.)
i=7; //i置7
TR0=0; //关闭定时器T0
sth=Music_Code[2*i]; //定时器高八位赋值 "高音do"
stl=Music_Code[2*i+1]; //定时器低八位赋值 "高音do"
TR0=1; //启动定时器T0
for(j=0;j<=1000;j++) //软件延时,在一定时间里检测
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
(45.98 KB, 下载次数: 42)
下载附件
2018-5-29 03:38 上传
所有资料51hei提供下载:
111.rar
(71.71 KB, 下载次数: 96)
2018-5-28 23:10 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
hui133767
时间:
2019-3-3 16:01
你好,请教下你,你这个源程序能生成hex文件吗?仿真不成功。能帮帮忙看看问题出在哪?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1