找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的电子琴设计全套资料分享(PCB原理图+仿真+源码+文档)

  [复制链接]
跳转到指定楼层
楼主
设计内容是电子琴设计,分为高中低三个音域
有哆唻咪发嗖拉嘻七个音符
有仿真图,文档,原理图,源程序,PCB图
希望帮助到大家!


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



Altium Designer画的单片机电子琴设计原理图和PCB图如下:(51hei附件中可下载工程文件)





单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. typedef unsigned int  uint;   
  4. typedef unsigned char uchar;
  5. sbit SDA1=P0^2;//串行数据输入,对应595的14脚SER
  6. sbit SCL1=P0^1;//移位寄存器时钟输入,对应595的11脚SCK
  7. sbit SCL2=P0^0;//存储寄存器时钟输入,对应595的12脚RCK
  8. sbit W1=P0^3;
  9. sbit W2=P0^4;
  10. sbit k1=P1^0;
  11. sbit k2=P1^1;
  12. sbit k3=P1^2;
  13. sbit k4=P1^3;
  14. sbit k5=P1^4;
  15. sbit k6=P1^5;
  16. sbit k7=P1^6;
  17. sbit D1=P2^6;//播放音乐模式
  18. sbit D2=P2^7;//弹奏模式
  19. sbit k8=P3^2;//功能切换键
  20. sbit k9=P3^3;//低音
  21. sbit k10=P3^4;//中音
  22. sbit k11=P3^5;//高音
  23. sbit beep=P2^2;//蜂鸣器接口
  24. uchar code table1[]={   
  25.                                                 0x3F,/*0*/
  26.                                                 0x06,/*1*/
  27.                                                 0x5B,/*2*/
  28.                                                 0x4F,/*3*/
  29.                                                 0x66,/*4*/
  30.                                                 0x6D,/*5*/
  31.                                                 0x7D,/*6*/
  32.                                                 0x07,/*7*/
  33.                                                 0x7F,/*8*/
  34.                                                 0x6F,/*9*/
  35.                                                 0x37,/*N*///中音        
  36.                                                 0x38,/*L*///低音
  37.                                                 0x76,/*H*///高音
  38.                                                 0x79 /*E*/
  39.                                         };//共阴极数码管
  40. uchar code table2[]={                 
  41.                                                 0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//中音
  42.                                                 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,//低音的高8位
  43.                                                 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
  44.                         };//音阶频率表 低八位
  45. uchar code table3[]={               
  46.                                                 0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x2D,//中音
  47.                                                 0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,//低音的低8位
  48.                                                 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
  49.                                         };
  50. uchar code table4[]={
  51.                                                 1,2,3,1,      
  52.                                                 1,2,3,1,      
  53.                                                 3,4,5,   
  54.                                                 3,4,5,     
  55.                                                 5,6,5,4,3,1,   
  56.                                                 5,6,5,4,3,1,   
  57.                                                 1,12/*低音5*/,1,     
  58.                                                 1,12,1
  59.                                         };
  60. uchar code table5[]={
  61.                                                 4,4,4,4,   
  62.                                                 4,4,4,4,     
  63.                                                 4,4,8,   
  64.                                                 4,4,8,     
  65.                                                 2,1,2,1,4,4,   
  66.                                                 2,1,2,1,4,4,   
  67.                                                 4,4,6,      
  68.                                                 4,4,6
  69.                                         };
  70. uchar i;
  71. uchar key,aa=0;
  72. uchar bb,cc;
  73. bit flag=0;
  74. //延时子函数
  75. void delay(uint z)
  76. {
  77.         uint x,y;
  78.         for(x=z;x>0;x--)
  79.                 for(y=340;y>0;y--);               
  80. }
  81. void in(uchar Data)
  82. {
  83.         uchar i;
  84.         for(i=0;i<8;i++)   //循环8次,刚好移完8位
  85.         {
  86.               Data<<=1;
  87.                   SCL1=CY;
  88.                   SDA1=1;        //先将移位寄存器控制引脚置为低   
  89.               _nop_();
  90.                   _nop_();
  91.               SDA1=0;
  92.         }
  93. }
  94. void out()
  95. {
  96.         SCL2=0;   //先将存储寄存器引脚置为低
  97.         _nop_();
  98.         SCL2=1;    //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
  99.         _nop_();
  100.         SCL2=0;
  101. }
  102. //初始化子函数
  103. void init()
  104. {
  105.         beep=0;
  106.         D1=1;
  107.         D2=0;
  108.         EA=1;//开总中断
  109.         TCON=0x01;//外部中断0设置为边沿触发
  110.         EX0=1;//开外部中断0
  111.         ET0=1;
  112.         ET1=1;
  113.         TMOD=0x11;//定时器0,1工作在定时状态,均为方式1
  114. }
  115. //数码管显示子函数
  116. void display1()
  117. {
  118.         in(table1[aa]);  //再传段码
  119.         out();
  120.         W1=0;;
  121.         delay(1);             //延迟时间2ms以内
  122.         W1=1;
  123.         in(table1[cc+1]);  //再传段码
  124.         out();
  125.         W2=0;
  126.         delay(1);             //延迟时间2ms以内
  127.         W2=1;
  128. }
  129. //高低音选择子函数
  130. void yinjie()
  131. {
  132.         if(k10==0)
  133.         {        
  134.                 delay(5);
  135.                 if(k10==0)
  136.                 {   
  137.                         aa=10;
  138.                         bb=0;//返回10为seg[10]显示C
  139.                 }
  140.         }
  141.         if(k9==0)
  142.         {        
  143.                 delay(5);
  144.                 if(k9==0)
  145.                 {        
  146.                         aa=11;
  147.                         bb=1;//返回11为seg[11]显示L
  148.                 }
  149.         }
  150.         if(k11==0)
  151.         {        
  152.                 delay(5);
  153.                 if(k11==0)
  154.                 {        
  155.                         aa=12;
  156.                         bb=2;//返回12为seg[12]显示H
  157.                 }
  158.         }
  159.         if(aa==0)
  160.         {
  161.                 aa=13;
  162.         }
  163. }
  164. //播放音乐子函数
  165. void display_music()
  166. {        
  167.         TH0=table2[table4[i]-1];
  168.         TL0=table3[table4[i]-1];
  169.         while(flag==0)
  170.         {        
  171.                 if(i<32)
  172.                 {
  173.                         TR0=1;
  174.                         delay(57*table5[i]);
  175.                         i++;
  176.                 }
  177.                 if(i==32)
  178.                 {
  179.                         i=0;
  180.                 }
  181.         }        
  182. }
  183. //演奏模式子函数
  184. void display_play()
  185. {
  186.         TR0=0;
  187.         TR1=0;
  188.         yinjie();
  189.         in(table1[aa]);  //再传段码
  190.         out();
  191.         W1=0;;
  192.         delay(1);             //延迟时间2ms以内
  193.         W1=1;
  194.         if(aa!=13&&flag==1)
  195.         {        
  196.                 if(k1==0)
  197.                 {        
  198.                         TH1=table2[7*bb+cc];
  199.                         TL1=table3[7*bb+cc];
  200.                         TR1=1;        
  201.                         while(k1==0)
  202.                         {        
  203.                                 cc=0;
  204.                                 display1();
  205.                         }
  206.                 }
  207.                 if(k2==0)
  208.                 {        
  209.                         TH1=table2[7*bb+cc];
  210.                         TL1=table3[7*bb+cc];
  211.                         TR1=1;
  212.                         while(k2==0)
  213.                         {        
  214.                                 cc=1;
  215.                                 display1();
  216.                         }
  217.                 }        
  218.                 if(k3==0)
  219.                 {               
  220.                         TH1=table2[7*bb+cc];
  221.                         TL1=table3[7*bb+cc];
  222.                         TR1=1;
  223.                         while(k3==0)
  224.                         {        
  225.                                 cc=2;
  226.                                 display1();
  227.                         }
  228.                 }
  229.                 if(k4==0)
  230.                 {
  231.                         TH1=table2[7*bb+cc];
  232.                         TL1=table3[7*bb+cc];
  233.                         TR1=1;
  234.                         while(k4==0)
  235.                         {        
  236.                                 cc=3;
  237.                                 display1();               
  238.                         }
  239.                 }
  240.                 if(k5==0)
  241.                 {        
  242.                         TH1=table2[7*bb+cc];
  243.                         TL1=table3[7*bb+cc];
  244.                         TR1=1;
  245.                         while(k5==0)
  246.                         {
  247.                                 cc=4;
  248.                                 display1();
  249.                         }
  250.                 }
  251.                 if(k6==0)
  252.                 {        
  253.                         TH1=table2[7*bb+cc];
  254.                         TL1=table3[7*bb+cc];
  255.                         TR1=1;
  256.                         while(k6==0)
  257.                         {
  258.                                 cc=5;
  259.                                 display1();                                                        
  260.                         }
  261.                 }
  262.                 if(k7==0)
  263.                 {               
  264.                         TH1=table2[7*bb+cc];
  265.                         TL1=table3[7*bb+cc];
  266.                         TR1=1;        
  267.                         while(k7==0)
  268.                         {
  269.                                 cc=6;
  270.                                 display1();        
  271.                         }
  272.                 }               
  273.         }
  274. }
  275. //主函数
  276. void main()
  277. {
  278.         init();
  279.         while(1)
  280.         {        
  281.                 if(flag==0)
  282.                         display_music();
  283.                 else
  284.                         display_play();
  285.         }
  286. }
  287. //外部0中断子函数
  288. void wb0() interrupt 0
  289. {
  290.         if(k8==0)
  291.         {
  292.                 delay(5);
  293.                 while(k8==0);
  294.                 flag=~flag;
  295.                 D1=~D1;
  296.                 D2=~D2;
  297.         }               
  298. }
  299. //定时器0中断子函数
  300. void t0() interrupt 1
  301. {        
  302.         TR0=0;
  303.         TH0=table2[table4[i]-1];
  304.         TL0=table3[table4[i]-1];
  305.         beep=~beep;
  306.         TR0=1;
  307. }
  308. //定时器1中断子函数
  309. void t1() interrupt 3
  310. {        
  311.         TR1=0;
  312.         TH1=table2[7*bb+cc];
  313.         TL1=table3[7*bb+cc];
  314.         beep=~beep;
  315.         TR1=1;
  316. }
复制代码
Keil代码与Proteus8.8 7.5仿真和文档下载:
电子琴仿真程序.7z (418.25 KB, 下载次数: 692)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏35 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
ID:233745 发表于 2018-10-24 19:07 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:340039 发表于 2018-10-27 16:43 | 只看该作者
再研究中
回复

使用道具 举报

地板
ID:416511 发表于 2018-10-30 23:50 来自手机 | 只看该作者
这里面得仿真可以直接用软件打开使用么
回复

使用道具 举报

5#
ID:416511 发表于 2018-10-30 23:51 来自手机 | 只看该作者
anying 发表于 2018-10-24 19:07
兄弟,你是大家的救星!

你好   你下载了吗?这里面包含仿真和程序么?
回复

使用道具 举报

6#
ID:548614 发表于 2019-5-27 18:12 来自手机 | 只看该作者
右边的元件怎么连接
回复

使用道具 举报

7#
ID:541054 发表于 2019-6-10 13:04 来自手机 | 只看该作者
可以联系一下您吗,做实物的时候怎么上电?74hc595驱动数码管有十个引脚,但原理图只有5个
回复

使用道具 举报

8#
ID:541054 发表于 2019-6-10 14:48 来自手机 | 只看该作者
WQ5201314 发表于 2019-5-27 18:12
右边的元件怎么连接

你弄好了吗
回复

使用道具 举报

9#
ID:429171 发表于 2019-6-10 15:27 | 只看该作者
keyi非常好
回复

使用道具 举报

10#
ID:649099 发表于 2019-11-25 17:28 | 只看该作者
非常非常全面
回复

使用道具 举报

11#
ID:666092 发表于 2019-12-17 21:27 | 只看该作者
咋弄的?
回复

使用道具 举报

12#
ID:725013 发表于 2020-4-8 20:18 | 只看该作者
能发出不同音色吗?
回复

使用道具 举报

13#
ID:747955 发表于 2020-5-10 21:18 | 只看该作者
疯狂学习中,膜拜
回复

使用道具 举报

14#
ID:786781 发表于 2020-6-22 15:57 | 只看该作者
如果需要实现上位机通讯的话应该从哪个思路扩展呢
回复

使用道具 举报

15#
ID:788495 发表于 2020-6-27 09:11 | 只看该作者
感谢分享,正在努力学习中
回复

使用道具 举报

16#
ID:971835 发表于 2021-11-4 02:39 来自手机 | 只看该作者
可以做实物吗?
回复

使用道具 举报

17#
ID:1022888 发表于 2022-4-30 11:18 | 只看该作者
可以直接用软件打开吗
回复

使用道具 举报

18#
ID:1028830 发表于 2022-5-24 18:25 | 只看该作者
晨曦826 发表于 2018-10-30 23:50
这里面得仿真可以直接用软件打开使用么

dsn文件是Proteus7.5版本的工程文件,只能用Proteus7.5打开
回复

使用道具 举报

19#
ID:1015893 发表于 2022-6-16 16:20 来自手机 | 只看该作者
想问一下aa,bb,cc是什么意思
回复

使用道具 举报

20#
ID:88606 发表于 2022-7-11 11:29 | 只看该作者
试试看看好不好用?
回复

使用道具 举报

21#
ID:88606 发表于 2022-7-11 14:21 | 只看该作者
都说内容有误,我来看看
回复

使用道具 举报

22#
ID:88606 发表于 2022-7-11 14:30 | 只看该作者
刚才试过了,仿真正常,文件都正常。谢谢楼主!!!
回复

使用道具 举报

23#
ID:1083350 发表于 2023-6-19 20:20 | 只看该作者
是一份好资料,解决了我的燃眉之急,点赞,51黑有你更精彩!!!
回复

使用道具 举报

24#
ID:1076950 发表于 2023-9-13 15:06 | 只看该作者
Jacoky 发表于 2019-6-10 13:04
可以联系一下您吗,做实物的时候怎么上电?74hc595驱动数码管有十个引脚,但原理图只有5个

可以给他接排针,然后利用烧入器供电,我做了实物,感觉楼主的作品有些小问题
回复

使用道具 举报

25#
ID:281040 发表于 2023-9-16 09:26 | 只看该作者
好资料点赞,51黑有你更精彩!!!
回复

使用道具 举报

26#
ID:1106402 发表于 2024-1-3 00:31 | 只看该作者
青桐与蓝桉 发表于 2023-9-13 15:06
可以给他接排针,然后利用烧入器供电,我做了实物,感觉楼主的作品有些小问题

大佬,蜂鸣器是有源的还是无源的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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