找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的电子琴课设

[复制链接]
跳转到指定楼层
楼主
基于51单片机的电子琴课设

下载:
电子琴.zip (16.84 KB, 下载次数: 41)


  1. #include <AT89X51.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[]=      //音符表
  8. {64021,64103,64260,64400,
  9. 64524,64580,64684,64777,
  10. 64820,64898,64968,65030,
  11. 65058,65110,65157,65178};

  12. void main(void){                          //主程序
  13.         TMOD=0x01;
  14.         ET0=1;
  15.         EA=1;
  16.         while(1){
  17.                 P3=0xff;
  18.                 P3_4=0;
  19.                 temp=P3;
  20.                 temp=temp & 0x0f;
  21.                 if (temp!=0x0f)        {                  //从第一行开始扫描键盘
  22.                         for(i=50;i>0;i--)          //延时,反弹跳
  23.                         for(j=200;j>0;j--);
  24.                         temp=P3;
  25.                         temp=temp & 0x0f;
  26.                         if (temp!=0x0f){
  27.                                 temp=P3;
  28.                                 temp=temp & 0x0f;
  29.                                 switch(temp){         //读取按键值
  30.                                         case 0x0e:
  31.                                                 key=0;
  32.                                                 break;
  33.                                         case 0x0d:
  34.                                                 key=1;
  35.                                                 break;
  36.                                         case 0x0b:
  37.                                                 key=2;
  38.                                                 break;
  39.                                         case 0x07:
  40.                                                 key=3;
  41.                                                 break;
  42.                                 }
  43.                                 temp=P3;
  44.                                 P1_0=~P1_0;
  45.                                 STH0=tab[key]/256;        //计算音符对应的定时器计数值
  46.                                 STL0=tab[key]%256;
  47.                                 TR0=1;
  48.                                 temp=temp & 0x0f;
  49.                                 while(temp!=0x0f){
  50.                                         temp=P3;
  51.                                         temp=temp & 0x0f;
  52.                                 }
  53.                         TR0=0;
  54.                         }
  55.                 }

  56.                 P3=0xff;
  57.                 P3_5=0;
  58.                 temp=P3;
  59.                 temp=temp & 0x0f;
  60.                 if (temp!=0x0f){                           //扫描键盘第二行
  61.                         for(i=50;i>0;i--)
  62.                         for(j=200;j>0;j--);
  63.                         temp=P3;
  64.                         temp=temp & 0x0f;
  65.                         if (temp!=0x0f){
  66.                                 temp=P3;
  67.                                 temp=temp & 0x0f;
  68.                                 switch(temp){
  69.                                         case 0x0e:
  70.                                                 key=4;
  71.                                                 break;
  72.                                         case 0x0d:
  73.                                                 key=5;
  74.                                                 break;
  75.                                         case 0x0b:
  76.                                                 key=6;
  77.                                                 break;
  78.                                         case 0x07:
  79.                                                 key=7;
  80.                                                 break;
  81.                                 }
  82.                                 temp=P3;
  83.                                 P1_0=~P1_0;
  84.                                 STH0=tab[key]/256;
  85.                                 STL0=tab[key]%256;
  86.                                 TR0=1;
  87.                                 temp=temp & 0x0f;
  88.                                 while(temp!=0x0f){
  89.                                         temp=P3;
  90.                                         temp=temp & 0x0f;
  91.                                 }
  92.                                 TR0=0;
  93.                         }
  94.                 }

  95.                 P3=0xff;
  96.                 P3_6=0;
  97.                 temp=P3;
  98.                 temp=temp & 0x0f;
  99.                 if (temp!=0x0f){                        //扫描键盘第三行
  100.                         for(i=50;i>0;i--)
  101.                         for(j=200;j>0;j--);
  102.                         temp=P3;
  103.                         temp=temp & 0x0f;
  104.                         if (temp!=0x0f){
  105.                                 temp=P3;
  106.                                 temp=temp & 0x0f;
  107.                                 switch(temp){
  108.                                         case 0x0e:
  109.                                                 key=8;
  110.                                                 break;
  111.                                         case 0x0d:
  112.                                                 key=9;
  113.                                                 break;
  114.                                         case 0x0b:
  115.                                                 key=10;
  116.                                                 break;
  117.                                         case 0x07:
  118.                                                 key=11;
  119.                                                 break;
  120.                                 }
  121.                                 temp=P3;
  122.                                 P1_0=~P1_0;
  123.                                 STH0=tab[key]/256;
  124.                                 STL0=tab[key]%256;
  125.                                 TR0=1;
  126.                                 temp=temp & 0x0f;
  127.                                 while(temp!=0x0f){
  128.                                         temp=P3;
  129.                                         temp=temp & 0x0f;
  130.                                 }
  131.                                 TR0=0;
  132.                         }
  133.                 }

  134.                 P3=0xff;
  135.                 P3_7=0;
  136.                 temp=P3;
  137.                 temp=temp & 0x0f;
  138.                 if (temp!=0x0f){                         //扫描键盘第四行
  139.                         for(i=50;i>0;i--)
  140.                         for(j=200;j>0;j--);
  141.                         temp=P3;
  142.                         temp=temp & 0x0f;
  143.                         if (temp!=0x0f){
  144.                                 temp=P3;
  145.                                 temp=temp & 0x0f;
  146.                                 switch(temp){
  147.                                         case 0x0e:
  148.                                                 key=12;
  149.                                                 break;
  150.                                         case 0x0d:
  151.                                                 key=13;
  152.                                                 break;
  153.                                         case 0x0b:
  154.                                                 key=14;
  155.                                                 break;
  156.                                         case 0x07:
  157.                                                 key=15;
  158.                                                 break;
  159.                                 }
  160.                                 temp=P3;
  161.                                 P1_0=~P1_0;
  162.                                 STH0=tab[key]/256;
  163.                                 STL0=tab[key]%256;
  164.                                 TR0=1;
  165.                                 temp=temp & 0x0f;
  166.                                 while(temp!=0x0f){
  167.                                         temp=P3;
  168.                                         temp=temp & 0x0f;
  169.                                 }
  170.                                 TR0=0;
  171.                         }
  172.                 }
  173.         }
  174. }

  175. void t0(void) interrupt 1 using 0 {     //定时器T0中断服务函数
  176.         TH0=STH0;
  177.         TL0=STL0;
  178.         P1_0=~P1_0;                                  //产生方波
  179. }
复制代码


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

使用道具 举报

沙发
ID:400529 发表于 2018-9-20 14:41 来自触屏版 | 只看该作者
666666666666666
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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