久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10175|回復: 3
打印 上一主題 下一主題
收起左側

51單片機電子琴程序代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:76127 發表于 2015-4-16 03:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
51 電子琴程序代碼 姬家寨電子科技實驗室 程序編程:姬學瑞   版權所有,侵權必究!
  1. #include <REGX51.H>
  2. #define   FOSC    12000000
  3. //=================================================================================================
  4. //--- 音階頻率表 ---
  5. unsigned int code JINJIEFREQ[] =
  6. {
  7.   262,294,330,349,392,440,494,
  8.   523,587,659,699,784,880,988,
  9.   1046,1175,1319,1391,1568,1760,1976,
  10. };
  11. //sfr     P4    = 0xC0;
  12. //sfr     P5    = 0xC8;
  13. //sbit    P5_5  = P5^5;
  14. #define SPK     P3_7//P5_5
  15. bit RunFlag = 0;
  16. unsigned char STH0,STL0;
  17. //sfr     AUXR  = 0x8E;
  18. #define T0FENPING  12
  19. //=================================================================================================
  20. //--- 定時器T0溢出中斷服務程序 ---
  21. void T0_ISR(void) interrupt 1
  22. {
  23.   if(1 == RunFlag)                                  //--- 在音階播放標志為1情況下 ---
  24.     {
  25.       TH0 = STH0;                                   //--- 重新裝初值 ---
  26.       TL0 = STL0;
  27.       SPK = ~SPK;                                   //--- P5.5引腳上的電平翻轉 ---
  28.     }
  29. }
  30. //=================================================================================================
  31. //--- main()主程序 ---
  32. void main(void)
  33. {
  34.   unsigned int i;
  35.   unsigned char j;

  36. //  AUXR |= 0x80;                                     //--- 使能T0的計數器時鐘分頻值為1 ---
  37.   TMOD = 0x01;                                      //--- 配置T0為定時模式,工作于方式2 ---
  38.   ET0 = 1;                                          //--- 使能T0中斷 ---
  39.   TR0 = 1;
  40.   EA = 1;                                           //--- CPU開中斷 ---
  41.   while(1)
  42.     {
  43.       for(j=0;j<7;j++)
  44.         {
  45.           if(0 == (P1 & (1 << j)))                  //--- 判斷低音部分是否有鍵按下 ---
  46.             {
  47.               for(i=0;i<2000;i++);                  //--- 去按鍵抖動 ---
  48.               if(0 == (P1 & (1 << j)))              //--- 再判斷低音部分是否真得有鍵按下 ---
  49.                 { //--- 根據表計算低音音階頻率的定時器T0的初值 ---
  50.                   STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j]) / 256;
  51.                   STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j]) % 256;
  52.                   TH0 = STH0;                       //--- 裝入TH0,TL0的計數寄存器 ---
  53.                   TL0 = STL0;
  54.                   RunFlag = 1;                      //--- 置音階播放標志為1 ---
  55.                 }
  56.               while(0 == (P1 & (1 << j)));          //--- 等待按鍵釋放 ---
  57.               RunFlag = 0;                          //--- 清音階播放標志 ---
  58.               SPK = 1;
  59.             }
  60.           if(0 == (P3 & (1 << j)))                  //--- 判斷中音部分是否有鍵按下 ---
  61.             {
  62.               for(i=0;i<2000;i++);                  //--- 去按鍵抖動 ---
  63.               if(0 == (P3 & (1 << j)))              //--- 再判斷中音部分是否真得有鍵按下 ---
  64.                 { //--- 根據表計算中音音階頻率的定時器T0的初值 ---
  65.                   STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 7]) / 256;
  66.                   STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 7]) % 256;
  67.                   TH0 = STH0;                       //--- 裝入TH0,TL0的計數寄存器 ---
  68.                   TL0 = STL0;
  69.                   RunFlag = 1;                      //--- 置音階播放標志為1 ---
  70.                 }
  71.               while(0 == (P3 & (1 << j)));          //--- 等待按鍵釋放 ---
  72.               RunFlag = 0;                          //--- 清音階播放標志 ---
  73.               SPK = 1;
  74.             }
  75.           if(0 == (P2 & (1 << j)))                  //--- 判斷高音部分是否有鍵按下 ---
  76.             {
  77.               for(i=0;i<2000;i++);                  //--- 去按鍵抖動 ---
  78.               if(0 == (P2 & (1 << j)))              //--- 再判斷高音部分是否真得有鍵按下 ---
  79.                 { //--- 根據表計算高音音階頻率的定時器T0的初值 ---
  80.                   STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 14]) / 256;
  81.                   STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 14]) % 256;
  82.                   TH0 = STH0;                       //--- 裝入TH0,TL0的計數寄存器 ---
  83.                   TL0 = STL0;
  84.                   RunFlag = 1;                      //--- 置音階播放標志為1 ---
  85.                 }
  86.               while(0 == (P2 & (1 << j)));          //--- 等待按鍵釋放 ---
  87.               RunFlag = 0;                          //--- 清音階播放標志 ---
  88.               SPK = 1;
  89.             }
  90.         }
  91.     }
  92. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:76386 發表于 2015-5-7 15:44 | 只看該作者
好東西,謝謝
回復

使用道具 舉報

板凳
ID:75461 發表于 2015-5-8 17:28 | 只看該作者
謝謝分享
回復

使用道具 舉報

地板
ID:79329 發表于 2015-5-8 19:16 | 只看該作者
樓主真厲,不錯!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区在线视频 | 精品国产乱码久久久久久蜜退臀 | 成人免费共享视频 | 888久久久 | 欧美视频日韩 | 午夜丰满寂寞少妇精品 | 久久久久网站 | 久久精品小视频 | 天天躁日日躁aaaa视频 | 日韩精品一区二区三区在线观看 | 色在线免费视频 | 亚洲欧美日韩精品久久亚洲区 | 午夜在线视频一区二区三区 | 日韩av在线一区 | 一区二区三区四区在线视频 | 色综合天天天天做夜夜夜夜做 | 中文字幕在线观看 | 亚洲网站在线观看 | 日本在线一区二区 | 欧一区二区 | 日韩精品一区二区三区在线观看 | 亚洲国产精品一区在线观看 | 久久综合一区二区三区 | h在线看 | 欧美黑人国产人伦爽爽爽 | 欧美日韩综合 | 免费看一级毛片 | 欧美日韩综合视频 | 狠狠色综合网站久久久久久久 | 91资源在线| 99re6在线| 亚洲一区国产精品 | 欧美午夜在线 | 精品国产色 | 综合色站导航 | 在线免费看黄 | 欧美视频一区二区三区 | 日日爽 | 久久精品一级 | 成人免费网站 | 91成人免费看 |