找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5773|回复: 1
打印 上一主题 下一主题
收起左侧

stc15f2k60s2单片机电子琴的源程序和仿真

[复制链接]
跳转到指定楼层
楼主
作为保存吧
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include "stc15f2k60s2.h"                //调系统头文件

  2. #define Display P0                //定义数码管显示端
  3. #define Speak P24        //定义蜂鸣器接口
  4. #define         uint unsigned int
  5. #define         uchar unsigned char
  6. unsigned char sth,stl;                    //定义全局变量 sth stl
  7. unsigned int i,j;                                //定义循环变量i j

  8. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义数码管显示 0-9,A-F
  9.    
  10. unsigned char code Music_Code[]={                 //八个音符        do re mi fa so la si 高音do
  11.         0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66,
  12.         0xfb,0x03,0xfb,0x8f,0xfc,0x0b,0xfd,0xee};                                                                          

  13. void delay_ms(unsigned int time)        //毫秒延时函数
  14. {                                                               
  15.         uint z;
  16.         uchar x,y;
  17.         for(z=0;z<time;z++)
  18.         for(x=5;x>0;x--)
  19.         for(y=97;y>0;y--);
  20. }

  21. void Time0_Init()                        //定时器T0初始化函数               
  22. {
  23.         TMOD=0x01;        //工作方式1
  24.         TH0=sth;    //定时器高八位赋初值     
  25.         TL0=stl;        //定时器低八位赋初值
  26.         ET0=1;                //使能T0中断
  27.         EA=1;                //打开全局中断
  28.         TR0=0;                //关闭定时器T0
  29. }

  30. void main()         //主函数入口
  31. {
  32.         Time0_Init();        //定时器T0初始化
  33. P2=0x00;
  34.         Speak=1;                //蜂鸣器端口置1 停止工作。
  35.         while(1)        //无限循环       
  36.         {
  37.                 switch(P1)                //switch语句判断检测 P1按键状态
  38.                 {  
  39.                         case 0xfe:        //P1=0xfe    "do"按键按下                        
  40.                                                 delay_ms(10);        //延时去抖       
  41.                                                 if(P1==0xfe)        //再判断"do"按键是否按下
  42.                                                 {                               
  43.                                                         Display=table[1];        //数码管显示"1"       
  44.                                                         i=0;                        //i置0
  45.                                     TR0=0;                  //关闭定时器T0
  46.                                                         sth=Music_Code[2*i];        //定时器高八位赋值 "do"
  47.                                                     stl=Music_Code[2*i+1];        //定时器低八位赋值 "do"
  48.                                                         TR0=1;                        //启动定时器T0
  49.                                                         for(j=0;j<=1000;j++)        //软件延时,在一定时间里检测
  50.                                                         {                                                                                        
  51.                                                                 delay_ms(10);                //延时一下
  52.                                                                 if(P1==0xfe) continue;        //"do"按键按下,跳出(继续发音)
  53.                                                                 else break;                        //松开了,则返回
  54.                                                         }
  55.                                                         Display=0x00;        //关闭数码管显示
  56.                                                         Speak=1;        //蜂鸣器端口置1 停止工作。                                                                        TR0=0;                //关闭定时器T0
  57.                                                         for(;;)       
  58.                                                         {
  59.                                                                 while(P1==0xfe);        //等待按键松开                                                                                                        
  60.                                                                 delay_ms(10);                //延时去抖
  61.                                                                 if(P1==0xfe) continue;       
  62.                                                                 else break;                        //确定松开,退出
  63.                                                         }
  64.                                                         TR0=0;                //关闭定时器T0
  65.                                                 }
  66.                                                 break;                        //返回
  67.                         case 0xfd:        //P1=0xfd        "re"按键按下                
  68.                                                 delay_ms(10);        //延时去抖
  69.                                                 if(P1==0xfd)        //再判断"re"按键是否按下
  70.                                         {
  71.                                                         Display=table[2];        //数码管显示"2"
  72.                                                         i=1;                        //i置1
  73.                                                         TR0=0;                  //关闭定时器T0
  74.                                                         sth=Music_Code[2*i];        //定时器高八位赋值 "re"
  75.                                                         stl=Music_Code[2*i+1];        //定时器低八位赋值 "re"
  76.                                                         TR0=1;                        //启动定时器T0               
  77.                                                         for(j=0;j<=1000;j++)        //软件延时,在一定时间里检测
  78.                                                         {                                                                                                        
  79.                                                                 delay_ms(10);        //延时一下       
  80.                                                                 if(P1==0xfd) continue;        //"re"按键按下,跳出(继续发音)       
  81.                                                                 else break;                //松开了,则返回
  82.                                                         }
  83.                                                         Display=0x00;        //关闭数码管显示
  84.                                                         Speak=1;        //蜂鸣器端口置1停止工作。                                                                        TR0=0;                //关闭定时器T0
  85.                                                         for(;;)
  86.                                                         {
  87.                                                                 while(P1==0xfd);        //等待按键松开
  88.                                                                 delay_ms(10);                //延时去抖
  89.                                                                 if(P1==0xfd) continue;       
  90.                                                                 else break;                        //确定松开,退出
  91.                                                         }
  92.                                                 }
  93.                                                 TR0=0;                        //关闭定时器T0
  94.                                                 break;                        //返回
  95.                         case 0xfb:        //        "mi"按键按下
  96.                                                 delay_ms(10);        //延时去抖                       
  97.                                                 if(P1==0xef)        //再判断"mi"按键是否按下
  98.                                                 {
  99.                                                         Display=table[3];        //数码管显示"3"
  100.                                                         i=2;                        //i置2       
  101.                                                         TR0=0;                  //关闭定时器T0       
  102.                                                         sth=Music_Code[2*i];        //定时器高八位赋值 "mi"       
  103.                                                         stl=Music_Code[2*i+1];        //定时器低八位赋值 "mi"
  104.                                                         TR0=1;                        //启动定时器T0       
  105.                                                         for(j=0;j<=1000;j++)        //软件延时,在一定时间里检测
  106.                                                         {                                                                                        
  107.                                                                 delay_ms(10);        //延时一下
  108.                                                                 if(P1==0xef) continue;        //"mi"按键按下,跳出(继续发音)
  109.                                                                 else break;                //松开了,则返回
  110.                                                         }
  111.                                                         Display=0x00;        //关闭数码管显示
  112.                                                         Speak=1;        //蜂鸣器端口置1,停止工作。
  113.                                                         TR0=0;                //关闭定时器T0
  114.                                                         for(;;)
  115.                                                         {
  116.                                                                 while(P1==0xef);        //等待按键松开       
  117.                                                                 delay_ms(10);                //延时去抖
  118.                                                                 if(P1==0xef) continue;
  119.                                                                 else break;                        //确定松开,退出
  120.                                                         }
  121.                                                 }
  122.                                                 TR0=0;                        //关闭定时器T0
  123.                                                 break;                        //返回       
  124.                                                
  125.                         case 0xf7:        //"fa"按键按下
  126.                                                 delay_ms(10);        //延时去抖       
  127.                                                 if(P1==0xf7)        //再判断"fa"按键是否按下
  128.                                                 {
  129.                                                         Display=table[4];        //数码管显示"4"
  130.                                                         i=3;                        //i置3
  131.                                                         TR0=0;                  //关闭定时器T0       
  132.                                                         sth=Music_Code[2*i];        //定时器高八位赋值 "fa"       
  133.                                                         stl=Music_Code[2*i+1];        //定时器低八位赋值 "fa"
  134.                                                         TR0=1;                        //启动定时器T0       
  135.                                                         for(j=0;j<=1000;j++)        //软件延时,在一定时间里检测       
  136.                                                         {                                                                                        
  137.                                                 delay_ms(10);        //延时一下
  138.                                                                 if(P1==0xf7) continue;        //"fa"按键按下,跳出(继续发音)
  139.                                                                 else break;                //松开了,则返回
  140.                                                         }
  141.                                                         Display=0x00;        //关闭数码管显示
  142.                                                         Speak=1;        //蜂鸣器端口置1停止工作。                                                                        TR0=0;                //关闭定时器T0
  143.                                                         for(;;)
  144.                                                         {
  145.                                                                 while(P1==0xf7);        //等待按键松开
  146.                                                                 delay_ms(10);                //延时去抖
  147.                                                                 if(P1==0xf7) continue;
  148.                                                                 else break;                        //确定松开,退出
  149.                                                         }
  150.                                                 }
  151.                                                 TR0=0;                //关闭定时器T0       
  152.                                                 break;                //返回
  153.                         case 0xef:         //"so"按键按下
  154.                                                 delay_ms(10);        //延时去抖                       
  155.                                                 if(P1==0xef)        //再判断"so"按键是否按下
  156.                                                 {
  157.                                                         Display=table[5];        //数码管显示"5"       
  158.                                                         i=4;                        //i置4                       
  159.                                                         TR0=0;                  //关闭定时器T0               
  160.                                                         sth=Music_Code[2*i];        //定时器高八位赋值 "so"
  161.                                                         stl=Music_Code[2*i+1];        //定时器低八位赋值 "so"
  162.                                                         TR0=1;                        //启动定时器T0               
  163.                                                         for(j=0;j<=1000;j++)        //软件延时,在一定时间里检测       
  164.                                                         {                                                                                                        
  165.                                                                 delay_ms(10);                //延时一下
  166.                                                                 if(P1==0xef) continue;        //"so"按键按下,跳出(继续发音)
  167.                                                                 else break;                        //松开了,则返回
  168.                                                         }
  169.                                                         Display=0x00;        //关闭数码管显示
  170.                                                         Speak=1;        //蜂鸣器端口置1 停止工作。                                                                        TR0=0;                //关闭定时器T0
  171.                                                         for(;;)
  172.                                                         {
  173.                                                                    while(P1==0xef);        //等待按键松开               
  174.                                                                 delay_ms(10);                //延时去抖
  175.                                                                 if(P1==0xef) continue;
  176.                                                                 else break;                        //确定松开,退出
  177.                                                         }
  178.                                                   }
  179.                                                 TR0=0;                //关闭定时器T0
  180.                                                 break;                //返回
  181.                         case 0xdf:         //"la"按键按下
  182.                                                 delay_ms(10);        //延时去抖
  183.                                                 if(P1==0xdf)        //再判断"la"按键是否按下
  184.                                                 {
  185.                                                         Display=table[6];        //数码管显示"6"
  186.                                                         i=5;                        //i置5
  187.                                                         TR0=0;                  //关闭定时器T0
  188.                                                         sth=Music_Code[2*i];        //定时器高八位赋值 "la"
  189.                                                         stl=Music_Code[2*i+1];        //定时器低八位赋值 "la"
  190.                                                         TR0=1;                        //启动定时器T0               
  191.                                                         for(j=0;j<=1000;j++)        //软件延时,在一定时间里检测       
  192.                                                         {                                                                                        
  193.                                                                 delay_ms(10);                //延时一下
  194.                                                                 if(P1==0xdf) continue;        //"la"按键按下,跳出(继续发音)
  195.                                                                 else break;                        //松开了,则返回
  196.                                                         }
  197.                                                         Display=0x00;        //关闭数码管显示
  198.                                                         Speak=1;        //蜂鸣器端口置1停止工作。
  199.                                                         TR0=0;                //关闭定时器T0
  200.                                                         for(;;)
  201.                                                         {
  202.                                                                 while(P1==0xdf);        //等待按键松开       
  203.                                                                 delay_ms(10);                //延时去抖
  204.                                                                 if(P1==0xdf) continue;
  205.                                                                 else break;                        //确定松开,退出
  206.                                                         }       
  207.                                                 }
  208.                                                 TR0=0;                //关闭定时器T0       
  209.                                                 break;                //返回
  210.                         case 0xbf:         //"si"按键按下
  211.                                                 delay_ms(10);        //延时去抖
  212.                                                 if(P1==0xbf)        //再判断"si"按键是否按下
  213.                                                 {
  214.                                                         Display=table[7];        //数码管显示"7"       
  215.                                                         i=6;                        //i置6
  216.                                                         TR0=0;                  //关闭定时器T0
  217.                                                         sth=Music_Code[2*i];        //定时器高八位赋值 "si"
  218.                                                         stl=Music_Code[2*i+1];        //定时器低八位赋值 "si"
  219.                                                         TR0=1;                        //启动定时器T0       
  220.                                                         for(j=0;j<=1000;j++)        //软件延时,在一定时间里检测       
  221.                                                         {                                                                                        
  222.                                                                 delay_ms(10);                //延时一下
  223.                                                                 if(P1==0xbf) continue;        //"si"按键按下,跳出(继续发音)
  224.                                                                 else break;                        //松开了,则返回
  225.                                                         }
  226.                                                         Display=0x00;        //关闭数码管显示
  227.                                                         Speak=1;        //蜂鸣器端口置1停止工作。                                                                        TR0=0;                //关闭定时器T0
  228.                                                         for(;;)
  229.                                                         {
  230.                                                                 while(P1==0xbf);        //等待按键松开
  231.                                                                 delay_ms(10);                //延时去抖
  232.                                                                 if(P1==0xbf) continue;
  233.                                                                 else break;                        //确定松开,退出
  234.                                                         }
  235.                                                 }
  236.                                                 TR0=0;                //关闭定时器T0
  237.                                                 break;                //返回
  238.                         case 0x7f:        //"高音do"按键按下
  239.                                                 delay_ms(10);        //延时去抖       
  240.                                                 if(P1==0x7f)        //再判断"高音do"按键是否按下
  241.                                                 {
  242.                                                         Display=0x86;  //数码管显示"1"带小数点(1.)
  243.                                                         i=7;                //i置7               
  244.                                                         TR0=0;          //关闭定时器T0
  245.                                                         sth=Music_Code[2*i];        //定时器高八位赋值 "高音do"
  246.                                                         stl=Music_Code[2*i+1];        //定时器低八位赋值 "高音do"
  247.                                                         TR0=1;                //启动定时器T0                       
  248.                                                         for(j=0;j<=1000;j++)        //软件延时,在一定时间里检测               
  249.                                                         {                                                                                        
  250. ……………………

  251. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
111.rar (71.71 KB, 下载次数: 96)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:482565 发表于 2019-3-3 16:01 | 只看该作者
你好,请教下你,你这个源程序能生成hex文件吗?仿真不成功。能帮帮忙看看问题出在哪?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表