单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机8键电子琴源程序+PCB工程+Proteus仿真

[复制链接]
跳转到指定楼层
楼主
制作出来的实物图如下:


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机电子琴仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.H>
  2. unsigned char temp;
  3. unsigned char key;
  4. unsigned char i,j;
  5. unsigned char STH0;
  6. unsigned char STL0;
  7. unsigned int code tab[]=  {64820,64898,64968,65030,65058,65110,65157,65178};  //音符表 do re mi fa sol la xi duo

  8. sbit K1=P1^0;  //音符按键
  9. sbit K2=P1^1;
  10. sbit K3=P1^2;
  11. sbit K4=P1^3;
  12. sbit K5=P1^4;
  13. sbit K6=P1^5;
  14. sbit K7=P1^6;
  15. sbit K8=P1^7;

  16. sbit Speak=P2^0; //喇叭
  17. /***********************1ms*****************************/
  18. void delay_1ms(unsigned int q)
  19. {
  20.         unsigned int i,j;
  21.         for(i=0;i<q;i++)
  22.                 for(j=0;j<120;j++);
  23. }

  24. void main(void)   //主程序
  25. {                         
  26.   TMOD=0x01;
  27.         ET0=1;
  28.         EA=1;
  29.         while(1)
  30.                 {
  31.        
  32.       if(!K1)               
  33.                     {
  34.                            delay_1ms(20);//延时去抖
  35.                                   if(!K1)
  36.                                   {
  37.            key=0;//将音乐的值赋值给定时器以便发出对应的声音
  38.                                          P0=0xC0;//显示0
  39.            STH0=tab[key]/256;        //计算音符对应的定时器计数值
  40.                                    STL0=tab[key]%256;
  41.                                    TR0=1;
  42.                                    while(!K1)
  43.                                    ;
  44.           }
  45.         }
  46.                                
  47.                          if(!K2)               
  48.                     {
  49.                            delay_1ms(20);//延时去抖
  50.                                   if(!K2)
  51.                                   {
  52.            key=1;
  53.                                          P0=0xF9;//显示1
  54.            STH0=tab[key]/256;        //计算音符对应的定时器计数值
  55.                                    STL0=tab[key]%256;
  56.                                    TR0=1;
  57.                                    while(!K2)
  58.                                    ;
  59.           }
  60.         }
  61.                                
  62.                         if(!K3)               
  63.                     {
  64.                            delay_1ms(20);//延时去抖
  65.                                   if(!K3)
  66.                                   {
  67.            key=2;
  68.                                          P0=0xA4;//显示2
  69.            STH0=tab[key]/256;        //计算音符对应的定时器计数值
  70.                                    STL0=tab[key]%256;
  71.                                    TR0=1;
  72.                                    while(!K3)
  73.                                    ;
  74.           }
  75.         }
  76.                                
  77.                         if(!K4)               
  78.                     {
  79.                            delay_1ms(20);//延时去抖
  80.                                   if(!K4)
  81.                                   {
  82.            key=3;
  83.                                          P0=0xB0;//显示3
  84.            STH0=tab[key]/256;        //计算音符对应的定时器计数值
  85.                                    STL0=tab[key]%256;
  86.                                    TR0=1;
  87.                                    while(!K4)
  88.                                    ;
  89.           }
  90.         }
  91.                                
  92.                         if(!K5)               
  93.                     {
  94.                            delay_1ms(20);//延时去抖
  95.                                   if(!K5)
  96.                                   {
  97.            key=4;
  98.                                          P0=0x99;//显示4
  99.            STH0=tab[key]/256;        //计算音符对应的定时器计数值
  100.                                    STL0=tab[key]%256;
  101.                                    TR0=1;
  102.                                    while(!K5)
  103.                                    ;
  104.           }
  105.         }
  106.                                
  107.                         if(!K6)               
  108.                     {
  109.                            delay_1ms(20);//延时去抖
  110.                                   if(!K6)
  111.                                   {
  112.            key=5;
  113.                                          P0=0x92;//显示5
  114.            STH0=tab[key]/256;        //计算音符对应的定时器计数值
  115.                                    STL0=tab[key]%256;
  116.                                    TR0=1;
  117.                                    while(!K6)
  118.                                    ;
  119.           }
  120.         }
  121.                                
  122.                         if(!K7)               
  123.                     {
  124.                            delay_1ms(20);//延时去抖
  125.                                   if(!K7)
  126.                                   {
  127.            key=6;
  128.                                          P0=0x82;//显示6
  129.            STH0=tab[key]/256;        //计算音符对应的定时器计数值
  130.                                    STL0=tab[key]%256;
  131.                                    TR0=1;
  132.                                    while(!K7)
  133.                                    ;
  134.           }
  135.         }
  136.                                
  137.                 if(!K8)               
  138.                     {
  139.                            delay_1ms(20);//延时去抖
  140.                                   if(!K8)
  141.                                   {
  142.            key=7;
  143.                                          P0=0xF8;//显示7
  144.            STH0=tab[key]/256;        //计算音符对应的定时器计数值
  145.                                    STL0=tab[key]%256;
  146.                                    TR0=1;
  147.                                    while(!K8)
  148.                                    ;
  149.           }
  150.         }
  151.                                
  152.                        
  153.                           delay_1ms(20);
  154.                                 TR0=0;
  155.                           Speak=1;//当按键弹起的时候,蜂鸣器停止发音
  156.                                
  157. }                       


  158. }

  159. void t0(void) interrupt 1 using 0 {     //定时器T0中断服务函数
  160.         TH0=STH0;
  161.         TL0=STL0;
  162.         Speak=~Speak;                                  //产生方波
  163. }
复制代码

所有资料51hei提供下载:
电子琴(8键).7z (414.72 KB, 下载次数: 110)

评分

参与人数 2黑币 +62 收起 理由
3333大赛的 + 12 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
HJF499602059 发表于 2020-4-19 15:20 | 只看该作者
真的能够发声?
回复

使用道具 举报

板凳
3333大赛的 发表于 2020-5-20 08:33 | 只看该作者
楼主借下您的贴我做个eagle软件的使用教学
回复

使用道具 举报

地板
zlyzlyzly 发表于 2020-6-10 20:48 | 只看该作者
请问楼主实物是自己焊接的吗????有没有什么地方可以焊接???
回复

使用道具 举报

5#
0807lj 发表于 2020-6-29 19:39 | 只看该作者
能解释一下 原理图 那个电源部分是什么吗
回复

使用道具 举报

6#
88888123 发表于 2020-6-30 10:03 | 只看该作者
这个电子琴的21种音调嘛?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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