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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

4X4鍵盤數碼管顯示及控制單片機io口定時播放音樂

[復制鏈接]
跳轉到指定樓層
樓主
制作出來的51單片機矩陣鍵盤控制播放音樂的實物圖如下:


在前人的基礎上改進了一下,按鍵共陽數碼管顯示,同時控制11個io口,定時播放音樂,按鍵P2^6是取消定時及播放。

單片機源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define GPIO_KEY P1
  5. #define weixuan P2
  6. sbit  BEEP=P2^5;
  7. sbit a= P3^7;sbit b= P3^3;sbit c= P3^4;sbit d= P3^5;
  8. sbit e= P3^6;sbit f= P2^2;sbit g= P2^3;sbit h= P2^4;
  9. sbit fm=P2^5; sbit key=P2^6;
  10. //uchar //用于存放定時器的高8

  11. //0~F的共陽數碼管段碼,最后一個是黑屏
  12. const uchar SEG_CODE[] =
  13. { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  14.   0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF
  15. };
  16. sbit wei1=P2^0;
  17. sbit wei2=P2^1;
  18. sbit led1=P0^7;
  19. uchar ge,shi,bai;qian;KeyValue,j;timeh,timel;

  20. char aa=0;
  21. /*****延時函數*****/
  22. void delay1ms(uint z)
  23. {
  24.         uint x,y;
  25.         for(x=z;x>0;x--)
  26.                 for(y=112;y>0;y--);  //12M晶振下,延時1MS
  27. }

  28. void delay(uchar x)   
  29. {
  30.    uchar i;
  31.    while(x--)
  32.    {
  33.      for (i = 0; i<13; i++) {;}
  34.    }
  35. }
  36. void beep()
  37. {
  38.   
  39. BEEP=0;    //關閉蜂鳴器
  40.    delay(10);      //延時  
  41.    BEEP=1;   }


  42. /*****顯示函數*****/
  43. void xianshi(uchar k)
  44. {                 
  45.           ge=k%10;  //個位
  46.           shi=k/10; //十位
  47.           bai=0;
  48.          
  49.           if(k>9)
  50.           {         
  51.                 weixuan=0xfd;
  52.                 P0=SEG_CODE[ge];//個位段選
  53.                 delay1ms(10);
  54.                 weixuan=0xfe;
  55.                 P0=SEG_CODE[shi];//十位段碼,顯示
  56.                 delay1ms(10);
  57.           }
  58.           else
  59.           {         
  60.                 weixuan=0xfe;
  61.                 P0=SEG_CODE[ge];//個位段選
  62.                 delay1ms(10);
  63.                                                                    
  64.           }
  65. }
  66. /***鍵盤掃描函數***/
  67. uchar keyscan()
  68. {

  69.                 GPIO_KEY=0x0f;   //P1口值準備
  70.                         if(GPIO_KEY!=0x0f)
  71.                         {
  72.                                 delay1ms(10);   //延時消抖
  73.                                 if(GPIO_KEY!=0x0f)//再次判斷
  74.                                 {
  75.                                         GPIO_KEY=0x0f;  //再次裝值準備
  76.                                         switch(GPIO_KEY)  //測試行
  77.                                         {
  78.                                                 case(0x07):KeyValue=0;break; //第一行
  79.                                                 case(0x0b):KeyValue=1;break; //第二行
  80.                                                 case(0x0d):KeyValue=2;break; //第三行
  81.                                                 case(0x0e):KeyValue=3;break; //第四行                                                       
  82.                                         }
  83.                                         GPIO_KEY=0xf0;   //高四位賦1,判斷準備
  84.                                         switch(GPIO_KEY) //測試行
  85.                                         {
  86.                                                 case(0x70):KeyValue=KeyValue; break;         //0-3
  87.                                                 case(0xb0):KeyValue=KeyValue+4; break;  //4-7
  88.                                                 case(0xd0):KeyValue=KeyValue+8;break;  //8-11
  89.                                                 case(0xe0):KeyValue=KeyValue+12;break;//12-15
  90.                                                                
  91.                                         }
  92.                                         while((GPIO_KEY!=0x0f)&&(aa<10)) //判斷是否松手,假若沒有松手,
  93.                                                                            //一段延時后依舊判斷松手完成
  94.                                         {   beep();
  95.                                                 delay1ms(5);
  96.                                                 aa++;
  97.                                        
  98.                                         }
  99.                                         aa=0;               
  100.                                 }
  101.                         }        
  102.                         return KeyValue;                                                 
  103. }

  104. uchar code zbjbxf[]=
  105.    { //定義豬八戒背媳婦的簡譜數組
  106.    0x64,0xA3,0xC1,0xA2,0x62,0x84,0x61,0x81,0x61,0xA4,
  107.    0xA1,0x91,0xA1,0x81,0x64,0xA3,0xC1,0xD2,0xD2,0xD2,
  108.    0xA2,0xC4,0xA1,0xC1,0xA1,0xC1,0xD2,0xD2,0xD2,0xA2,
  109.    0xC4,0xC2,0x62,0xC2,0x62,0xA2,0xA2,0x84,0x94,0x94,
  110.    0x92,0x81,0x91, 0xA2,0xC2,0xD4,0xE4,0xA4,0xE4,0xA2,
  111.    0xE2,0xA2,0xE2,0xA2, 0xA2,0x84,0x94,0x94,0x92,0x81,
  112.    0x91,0xA2,0xC2,0xD8
  113.    }; //適合12M 的晶振定時器初值表,高低 位分開

  114. uchar code chuzhi[]=
  115.    {
  116.    0xff,0xff,0xFC,0x8E,0xFC, 0xED,0xFD,0x43,0xFD,0x6A,
  117.    0xFD,0xB3,0xFD,0xF3,0xFE,0x2D,0xFE, 0x47,0xFE,0x76,
  118.    0xFE,0xA1,0xFE,0xC7,0xFE,0xD9,0xFE,0xF9,0xFF,0x16
  119.    };
  120. void timer0() interrupt 1 //定時器0中斷服務程序
  121. {
  122. TH0=timeh;//將timeh 賦給計時器的高8
  123. TL0=timel;//將timel 賦給計時器的低8
  124. fm=~fm;
  125. }//定時器每次到時將蜂鳴器反相

  126. void delay0(uint z)
  127. {        uint y;
  128.     for(z;z>0;z--)
  129.         for(y=19000;y>0;y--);
  130. }

  131. void delay1(uint z)
  132. {        uint y;
  133.     for(z;z>0;z--)
  134.         for(y=112;y>0;y--);
  135. }
  136. void delay3(unsigned int x)
  137. {
  138.         unsigned int i;
  139.         while(x--)
  140.         {        if(key==0){delay1(5);if(key==0){break;}}
  141.                 for(i=0;i<113;i++);

  142.         }
  143. }

  144. void play1()
  145. {        uint temp; //存放簡譜數組中的每一個音符的臨時變量
  146.     uchar jp; //jp 用于取出temp
  147.     uchar i=0;
  148.    

  149.    while(1)
  150.    {
  151.            temp=zbjbxf[i];
  152.     if(temp==0xff) break;
  153.     jp=temp/16;
  154.             if(jp!=0)
  155.          {
  156.            timeh=chuzhi[jp*2];
  157.            timel=chuzhi[jp*2+1];
  158.            TR0=1;//開定時器
  159.          }
  160.          else {TR0=0;fm=1;}
  161.         delay0(temp%16);TR0=0;fm=1; delay1(5); TR0=1;i++;//關定時器
  162.         if(key==0){delay1(5);if(key==0){break;}}
  163.    }
  164.     TR0=0;//關定時器
  165.     fm=1; //關蜂鳴器
  166. }
  167. /*****主函數*******/
  168. void main()
  169. {                
  170.         uchar b;
  171.         a=1; b=1;c=1;d=1;e=1;f=1;g=1;h=1;key=1;
  172.         TMOD=0x01;//設置定時器T0工作于方式1
  173.     IE=0x82; //允許T0 中斷       
  174.         while(1)
  175.         {       
  176.                 if((GPIO_KEY!=0x0f)&&(aa<10))       
  177.                         { delay1ms(10);//aa++;
  178.                           b=keyscan();               
  179. ……………………

  180. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
4X4鍵盤數碼管顯示及控制io 口.rar (56.94 KB, 下載次數: 19)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美一二三区 | 国产精品一区在线播放 | 精品日韩一区 | 亚洲一区二区三区视频 | 一区二区三区四区在线视频 | 国产午夜精品一区二区三区 | 在线观看毛片网站 | 欧美日韩一区二区三区四区 | 99精品欧美一区二区蜜桃免费 | av黄色在线播放 | 久久国产精品网站 | 91成人在线视频 | 久久精品99| 久久久久久久久久久久久久av | 久久久久久国产精品免费免费狐狸 | 超碰一区二区 | 欧美一区二区精品 | 欧美久久久久久 | 91美女视频| 极品在线 | 精品欧美一区二区在线观看欧美熟 | 成人精品在线视频 | 久久久综合精品 | 精品粉嫩aⅴ一区二区三区四区 | 亚洲欧美激情国产综合久久久 | 国产欧美一区二区三区日本久久久 | 亚洲精品1区 | 国产精品永久免费视频 | 成人午夜电影网 | 麻豆av一区二区三区久久 | 91精品在线播放 | 一色一黄视频 | 欧美亚洲一级 | 国产一级视频 | 国产成人精品久久二区二区91 | 日韩一区二区在线播放 | 91看片在线 | 欧美三区在线观看 | 欧美精品欧美精品系列 | 99视频入口 | 午夜a区|