|
51單片機電子琴設計(可顯示光敏、溫度、日期)
作者:林宏偉 學校:shaoguandada 時間:2019/11/26
首先,看圖:下面這張圖是基于51單片機設計的基礎要求,一共是10個小課題,難度的話,初步認為是半顆星,說難不算難,說簡單確實很簡單,這對于那些有基礎的同學而言輕松,基本幾個小時就搞定了。
編號 | | | | | | 1、電子萬年歷功能;2、可設置三組以上的鬧鐘;3、溫度檢測功能;4、倒計時功能 | | | | 1、可檢測顯示0~5V的直流電壓;2、可檢測環境光照功能,將系統工作環境的光線分為強、中、弱三個等級并在液晶上顯示。 | | | | 1、可輸出0~5V的直流電壓。直流電壓的大小用鍵盤設置確定,精度為0.1V;2、可輸出正弦波、方波和三角波。波形的頻率不限,但是幅度可在1~5V之間用鍵盤設置, 精度為0.1V。 | | | | 1、檢測顯示當前的環境溫度和光線強度。2、鍵盤設置溫度和光強的上限與下限值,如果溫度與光強超出界限值,則蜂鳴器發出警報。同時液晶顯示警報的類型。 | | | | 1、高、中、低音調選擇功能;2、手動演奏功能;3、至少能自動演奏一首歌曲;4、完美的中文操作界面。 | | | | 1、基本的加減乘除運算功能;2、乘方、開方運算;3、三角函數運算;4十進制、二進制、十六進制轉換功能。 | | | | file:///C:\Users\LITTLE~1\AppData\Local\Temp\ksohtml84440\wps1.jpg1、時分秒顯示;2、時分秒可以現場鍵盤設置;3、斷電后下一次通電時,時鐘能在原來的基礎上繼續運行;4、溫度檢測顯示;5、秒表功能 | | | | 1、 利用LCD圖型模式,編程實現時鐘功能。顯示模式參考圖如右圖所示。 2、鍵盤實時調整時鐘數據 | | | | 1、開機密碼設置功能。系統通電后,要輸入6位的密碼才能進入系統。3、進入系統后,可以輸入英文文章。即系統按鍵具有數字、標點符號、大小寫字母、空格,回車等字符輸入功能。4、附加功能。進入系統后,密碼可以用按鍵更改;輸入的文章,液晶界面顯示滿之后,能夠分頁切換,并且具有保存、清楚功能。 | | | | 1、利用單片機控制DA轉換器,變出控制輸出兩路相位相反的PWM信號;2、PWM信號的幅度可在0.1V~5V之間用鍵盤按照0.1V的分辨率任意設定;3、PWM的展空比,可在1%~99%之間,按照1%的精度,用鍵盤設定控制;4、PWM的頻率,可在10~100Hz之間,按照1Hz的分辨率,任意設定。 | |
1.首先,講一下思路,這些基礎要求其實用一塊板就可以實現全部,因為是設計,設計要求電路板是自己焊接,不能買現成的,這對很多小可愛來說是一件十分痛苦的事情,下面是我自己的電路圖,遵循簡單化原則,盡量把電路精簡
51hei圖片_20191126210248.jpg (726.56 KB, 下載次數: 29)
下載附件
2019-11-26 21:04 上傳
(1)原理圖
51hei圖片_20191126210254.png (79 KB, 下載次數: 26)
下載附件
2019-11-26 21:04 上傳
(2)PCB圖
51hei圖片_20191126210326.jpg (3.69 MB, 下載次數: 36)
下載附件
2019-11-26 21:05 上傳
(3)實物圖
(1)LCD12864模塊 :這個模塊的通信方式有兩種,一種是并行,一種是串行,并行雖然網上歷程很多,但是焊接電路時候卻很多線,于是我對這個模塊的硬件圖進行了修改,把并行改成串行,修改硬件圖,這樣就不用模塊的引腳,下面是這個模塊的部分說明: 我采用短接J2,這樣PSB這個引腳就可以丟掉了,我再短接了背光電源和供電電源,這樣就并行,總體這個模塊就只需要用三條線,供電2條,數據線3條。無需多余的線路了,十分精簡。
特色:(1)模組背部自帶 10K 3*3 硬封可調電位器,可以調到
理想對比度
(2)LED 背光極性可調,JP4 為液晶背光正負反接處,此模組
背光為 4 顆 LED 燈,非普通背光
(3)模組自帶原裝三星正品防靜電電容,抗干擾性更強 C6 C7
C8
(4)串并口可通過兩種方式調節 1 PSB 腳控制 2 JP2 短路到+
為并口 短路到-為串口
(5)自改 3.3V 可通過 JP3 調節,默認接+級為 5V,接-為 3.3V,
C4 C5 加極性電容即可 型號
為 106A 14FH4,背光電阻 33 歐改成 3.3 歐
51hei圖片_20191126210308.jpg (3.59 MB, 下載次數: 31)
下載附件
2019-11-26 21:12 上傳
51hei圖片_20191126210314.jpg (801.34 KB, 下載次數: 25)
下載附件
2019-11-26 21:05 上傳
(4)LCD12864硬件修改和電路板布局
(2)DS18B20模塊,這個模塊是溫度傳感器,這個不需要修改什么,直接使用就行了
(3)DS1302模塊 同上,注意副電源是否需要
(4)其他模塊,不多解釋了,模塊只需要看網上使用手冊就行了
2.如何實現上面的功能?
這塊板可以實現的功能有:顯示溫度、光敏值、時間、獨立按鍵可用、矩陣按鍵可用。
(1)矩陣按鍵驅動程序:這個采用最最基礎的掃描程序,還有狀態機、翻轉兩種,比較高階,如果是新手就建議不要采用(怕看不懂)
- #include "DS1302.h"
- /*----------------------DS1302相關聲明-------------------------*/
- char TAB_1302[]={ 0x00,0x29,0x02, //秒:分:時.
- 0x18,0x06,0x06,0x08}; //日:月:星期:年.
- uchar code TAB_XQ[]={"一二三四五六日"};//把DS1302數字日期轉換為中文字符.
- /*----------------以下為DS1302相關函數-------------------------*/
- /**************************************************************
- 函數名稱:void w_1302byte(uchar date)
- 函數功能:寫一個字節(上升沿)
- ***************************************************************/
- void w_1302byte(uchar date)
- {
- uchar i;
- datbyte=date;
- for(i=0;i<8;i++)
- {
- T_IO=datbyte0; //寫最低位
- T_CLK=0;
- T_CLK=1;
- datbyte>>=1;
- }
- }
- /**************************************************************
- 函數名稱:uchar r_1302byte(void)
- 函數功能:讀一個字節(下降沿)
- ***************************************************************/
- uchar r_1302byte(void)
- {
- uchar i;
- datbyte=0;
- for(i=0;i<8;i++)
- {
- datbyte7=T_IO; //讀最低位
- T_CLK=1;
- T_CLK=0;
- datbyte>>=1;
- }
- return(datbyte);
- }
- /***************************************************************
- 函數名稱:void write_1302(uchar addr,uchar date)
- 函數功能: 指定位置寫數據
- ****************************************************************/
- void write_1302(uchar addr,uchar date)
- {
- T_RST=0;
- T_CLK=0;
- T_RST=1;
- w_1302byte(addr);
- w_1302byte(date);
- T_CLK=0;
- T_RST=0;
- }
- /**************************************************************
- 函數名稱:uchar read_1302(uchar addr)
- 函數功能: 指定位置讀數據
- ****************************************************************/
- uchar read_1302(uchar addr)
- {
- uchar dat1,dat2,temp;
- T_RST=0;
- T_CLK=0;
- T_RST=1;
- w_1302byte(addr);
- temp=r_1302byte();
- T_RST=0;
- T_CLK=0;
- dat1=temp/16;
- dat2=temp%16;
- temp=dat1*10+dat2;
- return(temp);
- }
- /***************************************************************
- 函數名稱:void init_1302(void)
- 函數功能: 初始化
- *****************************************************************/
- void init_1302(void)
- {
- uchar i;
- uchar addr=0x80;
- write_1302(0x8e,0x00);
- for(i=0;i<7;i++)
- {
- write_1302(addr,TAB_1302[i]);
- addr+=2;
- }
- write_1302(0x8e,0x80);
- }
- /****************************************************************
- 函數名稱:void get_1302(void)
- 功能說明:讀取DS1302時鐘信息.
- *****************************************************************/
- void get_1302(void)
- {
- uchar i,addr=0x81;
- for(i=0;i<7;i++)
- {
- TAB_1302[i]=read_1302(addr);
- addr+=2;
- }
- }
復制代碼 (4)其他驅動程序在附件下載
51hei圖片_20191126212617.jpg (3.18 MB, 下載次數: 28)
下載附件
2019-11-26 21:26 上傳
也就是說,上面驅動搞定,基本是完成50%的要求,是不是很簡單,剩下的就是自己的控制程序了,這個設計其實難點在驅動程序,只要搞定驅動程序,剩下的就是所謂的if啥的,好,下面看看我設計的電子琴,是在這個基礎上擴展的,沒加什么,就是加了一些蜂鳴器的控制程序
3 電子琴的設計
其實,對于基于51單片機的電子琴在網上已經是爛透的那種了,本人也參考了網上大神的程序,然后修改了一下下,實現了藍牙控制電子琴,電腦實現遠程控制電子琴演奏。
51hei圖片_20191126213243.jpg (2.4 MB, 下載次數: 34)
下載附件
2019-11-26 21:33 上傳
51hei圖片_20191126213247.jpg (3.58 MB, 下載次數: 30)
下載附件
2019-11-26 21:33 上傳
(5)電子琴設計實物圖
藍牙控制和PC遠程控制:選用的是HC05,通過修改串口的收發程序,實現了接收串口數據后進行演奏,其實原理很簡單,下面是控制程序。利用兩個按鍵掃描程序,實現多功能的控制,多次收發的控制。基本功能就是按鍵選擇高低音,按鍵演奏,擴展功能就是藍牙控制,電腦演奏
- KeyScan1(); //電子琴功能按鍵
- Keyscan(); //行列式掃描比較慢,耐心長按
- switch(key)
- {
- case 0: time = 1;break;
- case 1: time = 2;break;
- case 2: time = 3;break;
- case 3: time = 4;break;
- case 4: time = 5;break;
- case 5: time = 6;break;
- case 6: time = 7;break;
- case 7: time = 8;break;
- case 8: time = 9;break;
- case 9: time = 10;break;
- case 10: time = 11;break;
- case 11: time = 12;break;
- case 12: time = 13;break;
- case 13: time = 14;break;
- case 14: time = 15;break;
- default: time = 0; break;//無按鍵按下
-
- }
- if(time==0) TR0=0,Beep=1;
- else high=freq[7*Music_Freq+time-1][1],low= freq[7*Music_Freq+time-1][0],TR0=1;
- Q(Music_Freq,time);//顯示
復制代碼 4 其他選題的實現
如果對其他選題不懂,或者不會修改的可以看看網上的相關控制歷程,結合這里的驅動程序應該是很簡單就可以完成的。
|