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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1388|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于單片機電子琴程序DS1302萬年歷顯示及源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:190577 發(fā)表于 2023-11-18 15:15 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
一、系統(tǒng)方案
1、本設(shè)計采用51單片機作為主控器。
2、DS1302計時顯示年月日時分秒。
3、按鍵可以彈奏以及播放音樂,內(nèi)置16首音樂。


二、硬件設(shè)計
原理圖如下:
三、單片機軟件設(shè)計
  1. 1、首先是系統(tǒng)初始化
  2. /*************時鐘顯示***************/
  3. void init_1602_ds1302()
  4. {
  5.         write_sfm2_ds1302(1,1,shi);                   //顯示時
  6.         write_sfm2_ds1302(1,4,fen);                   //顯示分
  7.         write_sfm2_ds1302(1,7,miao);           //顯示秒
  8.         write_sfm2_ds1302(2,2,nian);   //顯示年
  9.         write_sfm2_ds1302(2,5,yue);           //顯示月        
  10.         write_sfm2_ds1302(2,8,ri);           //顯示日                        
  11. }
  12. 2、液晶顯示程序
  13. /***********************延時函數(shù)************************/
  14. void delay_uint(uint q)
  15. {
  16.         while(q--);
  17. }

  18. /***********************lcd1602寫命令函數(shù)************************/
  19. void write_com(uchar com)
  20. {
  21.         e=0;
  22.         rs=0;
  23.         rw=0;
  24.         P0=com;
  25.         delay_uint(3);
  26.         e=1;
  27.         delay_uint(25);
  28.         e=0;
  29. }

  30. /***********************lcd1602寫數(shù)據(jù)函數(shù)************************/
  31. void write_data(uchar dat)
  32. {
  33.         e=0;
  34.         rs=1;
  35.         rw=0;
  36.         P0=dat;
  37.         delay_uint(3);
  38.         e=1;
  39.         delay_uint(25);
  40.         e=0;        
  41. }

  42. /***********************lcd1602初始化設(shè)置************************/
  43. void init_1602()         //lcd1602初始化設(shè)置
  44. {
  45.         write_com(0x38);        //
  46.         write_com(0x0c);
  47.         write_com(0x06);
  48. }

  49. /***********************lcd1602上顯示一位十進制數(shù)************************/
  50. void write_sfm1(uchar hang,uchar add,uchar date)
  51. {
  52.         if(hang==1)   
  53.                 write_com(0x80+add);
  54.         else
  55.                 write_com(0x80+0x40+add);
  56.         write_data(table_num[date % 10]);        
  57. }

  58. /***********************lcd1602上顯示兩位十進制數(shù)************************/
  59. void write_sfm2(uchar hang,uchar add,uchar date)
  60. {
  61.         if(hang==1)   
  62.                 write_com(0x80+add);
  63.         else
  64.                 write_com(0x80+0x40+add);
  65.         write_data(table_num[date / 10 % 10]);        
  66.         write_data(table_num[date % 10]);        
  67. }

  68. void write_sfm2_ds1302(uchar hang,uchar add,uchar date)
  69. {
  70.         if(hang==1)   
  71.                 write_com(0x80+add);
  72.         else
  73.                 write_com(0x80+0x40+add);         
  74.         write_data(table_num[date/16]);
  75.         write_data(table_num[date%16]);        
  76. }

  77. /***********************lcd1602上顯示這字符函數(shù)************************/
  78. void write_string(uchar hang,uchar add,uchar *p)
  79. {
  80.         if(hang==1)   
  81.                 write_com(0x80+add);
  82.         else
  83.                 write_com(0x80+0x40+add);
  84.                 while(1)                                                                                                                 
  85.                 {
  86.                         if(*p == '\0')  break;
  87.                         write_data(*p);
  88.                         p++;
  89.                 }        
  90. }

  91. /*****************控制光標(biāo)函數(shù)********************/
  92. void write_guanbiao(uchar hang,uchar add,uchar date)
  93. {               
  94.         if(hang==1)   
  95.                 write_com(0x80+add);
  96.         else
  97.                 write_com(0x80+0x40+add);
  98.         if(date == 1)
  99.                 write_com(0x0f);     //顯示光標(biāo)并且閃爍        
  100.         else
  101.                 write_com(0x0c);   //關(guān)閉光標(biāo)
  102. }        

  103. /***********************lcd1602清除顯示************************/
  104. void clear_1602()
  105. {
  106.         write_string(1,0,"                ");
  107.         write_string(2,0,"                ");
  108. }

  109. /****************開機液晶顯示函數(shù) 初始化液晶的內(nèi)容********************************/
  110. void init_1602_dis_csf()  //初始化液晶
  111. {
  112.         write_string(1,0,"   :  :        ");               
  113.         write_string(2,0,"20  -  -       ");        
  114. }

  115. 3、按鍵電路程序
  116. void anjian()                                 //按鍵鍵值識別
  117. {   
  118.         P1=0xf0;                                 //P1口賦值
  119.         if((P1&0xf0)!=0xf0)            //判斷是否有按鍵按下
  120.         {
  121.                 delay();                      //去抖
  122.                 if((P1&0xf0)!=0xf0)  //再次判斷有無按鍵按下  
  123.                 {
  124.                         key=getkey();         //掃描按鍵
  125.                         Tone_Index=0;    //播放音符順序清零
  126.                         switch(key)            //根據(jù)掃描的按鍵編碼將k賦值
  127.                         {
  128.                                 case 0x88:         //按鍵編碼為0x88
  129.                                 k = 0;                 //k賦值0
  130.                                 break;                  //已經(jīng)確定鍵值后提前跳出switch
  131.                                 case 0x48:   //如果不滿足上一個case則繼續(xù)向下判斷,直到有符合
  132.                                 k = 1;                  //k賦值1
  133.                                 break;       //下同,略         
  134.                                 case 0x28:   
  135.                                 k = 2 ;
  136.                                 break;  
  137.                                 case 0x18:   
  138.                                 k = 3 ;
  139.                                 break;  
  140.                                 case 0x84:   
  141.                                 k = 4 ;
  142.                                 break;
  143.                                 case 0x44:   
  144.                                 k = 5 ;
  145.                                 break;
  146.                                 case 0x24:   
  147.                                 k = 6 ;
  148.                                 break;
  149.                                 case 0x14:   
  150.                                 k = 7 ;
  151.                                 break;
  152.                                 case 0x82:   
  153.                                 k = 8 ;
  154.                                 break;
  155.                                 case 0x42:   
  156.                                 k = 9 ;
  157.                                 break;
  158.                                 case 0x22:   
  159.                                 k = 10 ;
  160.                                 break;
  161.                                 case 0x12:   
  162.                                 k = 11 ;
  163.                                 break;
  164.                                 case 0x81:   
  165.                                 k = 12 ;
  166.                                 break;
  167.                                 case 0x41:   
  168.                                 k = 13 ;
  169.                                 break;
  170.                                 case 0x21:   
  171.                                 k = 14 ;
  172.                                 break;
  173.                                 case 0x11:   
  174.                                 k = 15 ;
  175.                                 break;
  176.                                 default :                 //如果以上都不符合,直接跳出,無鍵值輸出
  177.                                 break;
  178.                         }
  179.                 }
  180.         }
  181. }
  182. 4、核心算法程序
  183. void main(void)                                                   //主函數(shù)
  184. {
  185.         SPK=0;
  186.         LED1=1;                                                           
  187.         LED2=0;                                                    //開機默認彈奏模式
  188.         senddata_74595(0xc0);                                                   //數(shù)碼管顯示0
  189.         IE=0x87;                                                   //定義外部中斷控制器
  190.         TMOD=0x01;                                                   //定義定時器0的工作方式
  191.         IT0=1;                                                           //外部中斷0為下降沿觸發(fā)
  192.         IT1=1;                                                           //外部中斷1為下降沿觸發(fā)
  193.         init_1602();                 //lcd1602初始化
  194.         init_1602_dis_csf(); //lcd1602初始化顯示

  195.         while(1)                                                   //進入死循環(huán)
  196.         {
  197.                 read_time();                  //讀時間
  198.                                 init_1602_ds1302();   //顯示時鐘        

  199.                 P1=0xf0;                                            //P1口賦值
  200.                 if((P1&0xf0)!=0xf0)                           //判斷P0口是否有變化
  201.                 {        
  202.                         anjian();                                   //讀取鍵值
  203.                         senddata_74595(DSY_CODE[k]);                           //顯示鍵值,也就是顯示音符
  204.                         if(FY==0)                                   //如果是彈奏模式
  205.                         {
  206.                                 STH0 = tab[k]/256;
  207.                                 STL0 = tab[k]%256;           //根據(jù)k的值賦初值給T0
  208.                                 TR0 = 1;               //打開定時器用于定時產(chǎn)生頻率發(fā)生     
  209.                                 while ((P1&0xf0)!=0xf0); //按鍵不松開的話,T0就一直產(chǎn)生頻率
  210.                                 TR0=0;                 //按鍵松開后關(guān)閉T0計時,頻率停止
  211.                         }
  212.                         else  //如果是播放模式(上面的if語句不成立就執(zhí)行else)
  213.                         {
  214.                                 while (FY==1)                                                          //進入播放模式
  215.                                 {
  216.                                         read_time();                  //讀時間
  217.                                 init_1602_ds1302();   //顯示時鐘
  218.                                         if(Song[k][Tone_Index]==-1)                  //一首播放完退出
  219.                                         {
  220.                                                 Tone_Index=0;
  221.                                                 SPK=0;
  222.                                                 break;
  223.                                         }  
  224.                                         STH0=(tab[Song[k][Tone_Index]])/256;
  225.                                         STL0=(tab[Song[k][Tone_Index]])%256; //將內(nèi)置音樂數(shù)組的數(shù)據(jù)賦給定時器做為初值計時
  226.                                 //        P0=DSY_CODE[Song[k][Tone_Index]];          //顯示播放的音符
  227.                                         TR0 = 1;                                                          //打開定時器定時開關(guān)
  228.                                         delay1(300*Len[k][Tone_Index]);          //節(jié)拍數(shù)組延時
  229.                                         Tone_Index++;                                                  //變量加準備播放下一個音符
  230.                                         TR0=0;                                                                 //停止定時器
  231.                                         anjian();                                                         //掃描按鍵
  232.                                         senddata_74595(DSY_CODE[k]);                                         //顯示音樂序號
  233.                                         while((P1&0xf0)!=0xf0);
  234.                                 }
  235.                         }
  236.                 }
  237.         }
  238. }
復(fù)制代碼


四、 proteus仿真設(shè)計
Proteus軟件是一款應(yīng)用比較廣泛的工具,它可以在沒有硬件平臺的基礎(chǔ)上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設(shè)計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設(shè)定的目的,避免我們搭建實物的時候,如果當(dāng)初選擇的方案有問題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發(fā)者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設(shè)計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設(shè)計的最優(yōu)方案。最后根據(jù)測試沒問題的仿真圖紙,焊接實物,調(diào)試,最終完成本設(shè)計的作品。

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美视频在线 | 中文字幕在线精品 | 正在播放一区二区 | 美女久久久久久久 | 日韩国产在线 | 高清视频一区二区三区 | 毛片一区二区三区 | 91资源在线 | 欧美片网站免费 | 大学生a级毛片免费视频 | 国产精品久久久爽爽爽麻豆色哟哟 | 免费成人高清在线视频 | 综合精品久久久 | 妞干网视频 | av网址在线播放 | 久草青青草 | 在线观看你懂的网站 | 一级毛片,一级毛片 | 五月婷婷丁香 | 久草新在线 | 欧产日产国产精品国产 | 亚洲日日 | 久久手机在线视频 | 亚洲精品二区 | 国产一区二区三区色淫影院 | 欧美国产日韩精品 | 韩日精品一区 | 久久久成人精品 | 日韩国产在线 | 免费一区 | 毛片黄片免费看 | 国产一区二区精品在线观看 | 欧美在线观看一区 | av天天看| 欧美福利视频 | 国产综合av| 成人性生交大片免费看中文带字幕 | 狠狠的干| 久久久久国产一级毛片高清网站 | 黄色片在线观看网址 | 婷婷毛片|