項目7 模擬電子鬧鐘的設(shè)計_第1頁
項目7 模擬電子鬧鐘的設(shè)計_第2頁
項目7 模擬電子鬧鐘的設(shè)計_第3頁
項目7 模擬電子鬧鐘的設(shè)計_第4頁
項目7 模擬電子鬧鐘的設(shè)計_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、電子工業(yè)出版社單片機(jī)控制技術(shù)單片機(jī)控制技術(shù) 項目式教程項目式教程 (C C語言版)語言版)電子工業(yè)出版社項目項目7 7 模擬電子模擬電子 鬧鐘鬧鐘的設(shè)計的設(shè)計l 能了解常用鍵盤的分類;能了解常用鍵盤的分類; l 能掌握鍵盤的工作原理;能掌握鍵盤的工作原理; l 能理解矩陣鍵盤的識別和控制方法;能理解矩陣鍵盤的識別和控制方法;l 能掌握秒表的設(shè)計方法;能掌握秒表的設(shè)計方法;l 能掌握模擬鬧鐘的設(shè)計方法;能掌握模擬鬧鐘的設(shè)計方法;l 能熟練編寫鍵盤識別程序。能熟練編寫鍵盤識別程序。 學(xué)習(xí)目標(biāo)學(xué)習(xí)目標(biāo) l 敘述鍵盤的類別和工作原理;敘述鍵盤的類別和工作原理;l 敘述矩陣鍵盤的識別方法;敘述矩陣鍵盤的

2、識別方法;l 設(shè)計秒表的硬件電路和控制程序;設(shè)計秒表的硬件電路和控制程序;l 設(shè)計模擬鬧鐘的硬件電路和控制程序。設(shè)計模擬鬧鐘的硬件電路和控制程序。 工作任務(wù)工作任務(wù) 任務(wù)任務(wù)7.1 7.1 鍵盤的應(yīng)用鍵盤的應(yīng)用 項目項目7 7 模擬電子鬧鐘的設(shè)計模擬電子鬧鐘的設(shè)計任務(wù)任務(wù)7.2 7.2 電子秒表的設(shè)計電子秒表的設(shè)計項目拓展項目拓展 實驗板簡易電子琴的設(shè)計實驗板簡易電子琴的設(shè)計 項目小結(jié)項目小結(jié)思考與訓(xùn)練思考與訓(xùn)練任務(wù)任務(wù)7.3 7.3 模擬電子鬧鐘的設(shè)計模擬電子鬧鐘的設(shè)計 單片機(jī)與鍵盤的接口及其軟件的任務(wù)主要包括以下幾個方面:單片機(jī)與鍵盤的接口及其軟件的任務(wù)主要包括以下幾個方面:鍵盤概述鍵盤概

3、述l是一種常見的輸入設(shè)備,根據(jù)按鍵的識別方法分類,鍵盤有編碼鍵盤和非編碼鍵盤兩種。l根據(jù)鍵盤的結(jié)構(gòu)分類,鍵盤可分為獨立式按鍵鍵盤和行列式按鍵鍵盤。 任務(wù)任務(wù)7.1 鍵盤的應(yīng)用鍵盤的應(yīng)用 ()檢測并判斷是否有鍵按下;()按鍵開關(guān)的延時去抖動功能;()計算并確定按鍵的鍵值;()程序根據(jù)計算出的鍵值進(jìn)行一系列的動作處理和執(zhí)行 7.1.1獨立鍵盤控制獨立鍵盤控制LED的點亮的點亮7.1.1.1 獨立鍵盤的工作原理獨立鍵盤的工作原理XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5

4、/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51C122pFC222pFC310uFX112MR110kD1R2220D2R3220D3R4220D4R5220K1K2K3K4K1,K2

5、按下時按下時LED亮亮,松開時滅松開時滅K3,K4按下時按下時LED亮亮,再次按下時滅再次按下時滅 獨立式按鍵鍵盤的每個按鍵都單獨接到單片機(jī)的一個I/O口上,通過判斷按鍵端口的電位即可識別按鍵操作。例如:K1鍵的一端接地,另一端接P1.0,當(dāng)K1鍵按下,P1.0端口就會檢測到低電平“0”信號,否則檢測到的應(yīng)該是高電平“1”信號。所以一旦查詢到P1.0口為“0”就說明K1鍵按下了,也就是識別了按鍵。7.1.1獨立鍵盤控制獨立鍵盤控制LED的點亮的點亮7.1.1.1 獨立鍵盤的工作原理獨立鍵盤的工作原理 在按鍵被按下或釋放時按鍵會出現(xiàn)抖動現(xiàn)象,這種現(xiàn)象會干擾按鍵的識別。因此需要對按鍵進(jìn)行消抖動處理

6、,也稱為去抖動。按鍵去抖動一般有硬件和軟件兩種方法。 7.1.1獨立鍵盤控制獨立鍵盤控制LED的點亮的點亮7.1.1.1 獨立鍵盤的工作原理獨立鍵盤的工作原理硬件去抖通常采用R-S觸發(fā)器或單穩(wěn)電路構(gòu)成去抖電路。每一個按鍵都要連接一個硬件去抖動的電路,所以當(dāng)電路中按鍵較多時電路就顯得十分復(fù)雜。硬件去抖硬件去抖 7.1.1獨立鍵盤控制獨立鍵盤控制LED的點亮的點亮7.1.1.1 獨立鍵盤的工作原理獨立鍵盤的工作原理 判斷按鍵被按下后,加一個10ms的延時程序,待按鍵穩(wěn)定后,再次檢測按鍵,按鍵仍處于被按下狀態(tài),就可以確認(rèn)確實有按鍵被按下。軟件去抖軟件去抖 7.1.1.2 獨立鍵盤控制獨立鍵盤控制LE

7、D的點亮的點亮應(yīng)用實例1: 要求K1或K2按下時D1或D2點亮,松開時對應(yīng)LED熄滅;K3或K4按下并釋放時D3或D4點亮,再次按下并釋放時對應(yīng)LED熄滅。操作實例操作實例 源程序編寫如下:源程序編寫如下:/宏定義宏定義#include #define uchar unsigned char#define uint unsigned int/端口位定義sbit D1=P0_0;sbit D2=P0_1;sbit D3=P0_2;sbit D4=P0_3;sbit K1=P1_0;sbit K2=P1_1;sbit K3=P1_2;sbit K4=P1_3;/延時延時1ms子程序子程序void

8、DelayMS(uint x) uchar i; while(x-) for(i=0; i120; i+);/按鍵控制按鍵控制LED燈主程序燈主程序void main() P1=0 xFF; /讓P1口處于高電平狀態(tài) P0=0 xFF; /讓P0口處于高電平狀態(tài) while(1) D1=K1; /將K1按下后P1.0的值直接送給P0.0去點亮D1 D2=K2; /將K2按下后P1.1的值直接送給P0.1去點亮D2 if(K3=0) /判斷K3是否按下 while(K3=0); /等待K3釋放 D3=D3; if(K4=0) /判斷K4是否按下 while(K4=0); /等待K3釋放 D4=D

9、4; DelayMS(10); 7.1.2 矩陣鍵盤控制數(shù)碼管顯示矩陣鍵盤控制數(shù)碼管顯示7.1.2.1 矩陣鍵盤的工作原理矩陣鍵盤的工作原理 矩陣鍵盤由行線和列線組成,按鍵位于行、列的交叉點上。 如圖所示,1個44的行、列結(jié)構(gòu)可以構(gòu)成1個含有16個按鍵的鍵盤。在按鍵數(shù)量較多的場合,矩陣鍵盤與獨立鍵盤相比要節(jié)省很多I/O口線。 7.1.2 矩陣鍵盤控制數(shù)碼管顯示矩陣鍵盤控制數(shù)碼管顯示7.1.2.1 矩陣鍵盤的工作原理矩陣鍵盤的工作原理矩陣鍵盤的按鍵識別方法: 掃描法和線反轉(zhuǎn)法掃描法第一步:識別鍵盤是否有鍵閉合第二步:識別具體閉合的按鍵7.1.2 矩陣鍵盤控制數(shù)碼管顯示矩陣鍵盤控制數(shù)碼管顯示7.1

10、.2.1 矩陣鍵盤的工作原理矩陣鍵盤的工作原理掃描法圖7.7按鍵掃描流程圖7.1.2.1 矩陣鍵盤的工作原理矩陣鍵盤的工作原理線反轉(zhuǎn)法第一步:將行線編程為輸入線,列線編程為輸出線,并使輸出線輸出為全零電平,則行線中電平由高到低所在行為按鍵所在行。 第二步:將行線編程為輸出線,列線編 程為輸入線,并使輸出線為全零電平,則列線中電平由高到低所在列為按鍵所在列。 綜合一二步的結(jié)果可確定按鍵所在行和列,從而識別出所按的鍵。 7.1.2 矩陣鍵盤控制數(shù)碼管顯示矩陣鍵盤控制數(shù)碼管顯示7.1.2.1 矩陣鍵盤的工作原理矩陣鍵盤的工作原理矩陣按鍵鍵盤常用的有2種編碼方式:(1) 對于矩陣式鍵盤,按鍵的位置由行

11、號和列號確定,分別對行號和列號進(jìn)行二進(jìn)制編碼,然后將兩值合成1個字節(jié),高4位表示行號,低4位表示列號。如12H表示第1行第2列的按鍵。(2)采用依次排列鍵號的方式對按鍵進(jìn)行編碼。以44鍵盤為例,可以將鍵號編碼為:0 x00、0 x01、0 x02、0 x0D、0 x0E、0 x0F共16個。7.1.2 矩陣鍵盤控制數(shù)碼管顯示矩陣鍵盤控制數(shù)碼管顯示7.1.2.1 矩陣鍵盤的工作原理矩陣鍵盤的工作原理對鍵盤的控制方式主要有:定時掃描 中斷掃描 定時掃描就是每隔一定的時間讀取一次鍵盤I/O 口狀態(tài)。中斷方式下,當(dāng)有鍵按下時,就會有一根行線被拉為低電平,經(jīng)過與門之后就會觸發(fā)一次外中斷,這種方式避免了對

12、鍵盤的空掃描,可以提高CPU 的效率。 任務(wù)操作任務(wù)操作1任務(wù)要求任務(wù)要求 設(shè)計一個電路,AT89C51單片機(jī)的P1口連接一個44矩陣鍵盤,其中P1.0P1.3為行線,P1.4P1.7為列線,P0端口連接一只共陰極的一位數(shù)碼管,要求按下一只按鍵時在數(shù)碼管上顯示器對應(yīng)的鍵號,如按下K1則顯示“1”,按下K2則顯示“2”, 按下KF則顯示“F”。 2任務(wù)分析任務(wù)分析鍵號2進(jìn)制鍵值取反的2進(jìn)制鍵值取反的16進(jìn)制鍵值K011101110000100010 x11K111101101000100100 x12K211101011000101000 x14K311100111000110000 x18K4

13、11011110001000010 x21K511011101001000100 x22K611011011001001000 x24K711010111001010000 x28K810111110010000010 x41K910111101010000100 x42KA10111011010001000 x44KB10110111010010000 x48KC01111110100000010 x81KD01111101100000100 x82KE01111011100001000 x84KF01110111100010000 x88矩陣鍵盤按鍵特征碼值表3任務(wù)設(shè)計任務(wù)設(shè)計(1)器件的

14、選擇器件名稱數(shù)量(只)AT89C51112MHz晶體122pF瓷片電容210uF電解電容110k電阻11kX8排阻1輕觸按鍵16一位共陰極數(shù)碼管1矩陣鍵盤設(shè)計器件列表(2)硬件原理圖設(shè)計 (3)軟件程序設(shè)計 源程序編寫如下:源程序編寫如下:/宏定義#include #include #define uchar unsigned char/0F的數(shù)碼管共陰極段碼表uchar code DSY_CODE=0 x3F, 0 x06, 0 x5B, 0 x4F, 0 x66, 0 x6D, 0 x7D, 0 x07,0 x7F, 0 x6F, 0 x77 , 0 x7C , 0 x 39, 0 x5E

15、 , 0 x79 , 0 x71 ;/矩陣鍵盤按鍵特征碼表uchar code KeyCodeTable=0 x11,0 x12,0 x14,0 x18,0 x21,0 x22,0 x24, 0 x28, 0 x41,0 x42,0 x44,0 x48,0 x81,0 x82,0 x84,0 x88;/延時子函數(shù)void Delay( ) uchar i ; for(i = 0; i200;i+);/矩陣鍵盤掃描子函數(shù)uchar Keys_Scan( ) uchar sCode, kCode, i, k; P1=0 xF0; /低4位置0,放入四行 if (P1 & 0 xF0) !=

16、 0 xF0) Delay( ); if (P1 & 0 xF0) != 0 xF0) sCode = 0 xFE; /行掃描碼初值 for(k = 0;k4; k+) /對 4行分別掃描 P1= sCode; if (P1 & 0 xF0) != 0 xF0) kCode = P1; for(i=0; i16; i+) /查表得到按鍵序號并返回 if (kCode = = KeyCodeTablei) return i; else sCode = _crol_(sCode,1); return -1; /主函數(shù)void main ( ) uchar KeyNo = 1; /按

17、鍵序號,表示無按鍵 while (1) KeyNo = Keys_Scan( ); /掃描鍵盤獲取按鍵序號KeyNo if (KeyNo != 1) P2 = code DSY_CODEKeyNo; /數(shù)碼管顯示按鍵序號 任務(wù)任務(wù)7.2 電子秒表的設(shè)計電子秒表的設(shè)計1任務(wù)要求任務(wù)要求 設(shè)計一只電子秒表,從0秒計到59秒,并用兩只一位的共陰極數(shù)碼管實時顯示當(dāng)前的秒數(shù),按鍵控制秒表的啟動和清零。2任務(wù)分析任務(wù)分析 采用T0的定時工作方式1,則TMOD=0 x01,由于晶體振蕩頻率為12MHz,機(jī)器周期就為1us,設(shè)置定時時間為 50000us(50ms),反復(fù)計數(shù)20次就為1s。 把計數(shù)的實時數(shù)值

18、用兩只一位的共陰極數(shù)碼管顯示,采用靜態(tài)的顯示方式,計數(shù)值的十位和個位分別顯示在不同的數(shù)碼管上即可。 在任意的兩根口線上分別連接一只輕觸按鍵,分別控制秒表的啟動和數(shù)碼管清零。 3任務(wù)設(shè)計(1)器件的選擇器件名稱數(shù)量(只)AT89C51112MHz晶體122pF瓷片電容210uF電解電容110k電阻11kX8排阻1輕觸按鍵1一位共陰極數(shù)碼管2電子秒表設(shè)計器件列表(2)硬件原理圖設(shè)計 (3)軟件程序設(shè)計 源程序編寫如下:源程序編寫如下:/宏定義#include#define uchar unsigned char#define uint unsigned intsbit K1=P32;sbit K2

19、=P33;/09的數(shù)碼管共陰極段碼表uchar code DSY_CODE=0 x3F, 0 x06, 0 x5B, 0 x4F, 0 x66, 0 x6D, 0 x7D, 0 x07,0 x7F, 0 x6F;/延時1ms子程序void DelayMS(uint x) uchar i; While(x-) for(i=0; i120; i+);/定時1s子程序void sTime ( ) uint i; TMOD=0 x01; /設(shè)定時器1為方式0 TH0=(65536-50000)/256; /置定時器初值 TL0=(65536-50000)%256; TR0=1; /啟動T1 for(i

20、=0; i=20 ; ) if ( TF0 = 1) /查詢計數(shù)溢出 i+; TF0=0; TH0=(65536-50000)/256; /重新置定時器初值 TL0=(65536-50000)%256; return ;/秒表主程序void main() uchar s; P0= DSY_CODE0; P2= DSY_CODE0; K1=1; K2=1; while(1) if(K1=0) /K1鍵按下 DelayMS(10); /按鍵去抖動 if(K1=0) /再次檢查按鍵 for (s=1;s=60;s+) /從0到59顯示秒數(shù) P0= DSY_CODEs/10; /顯示秒的十位 P2=

21、DSY_CODEs%10; /顯示秒的個位 sTime (); /調(diào)用1s定時 if(K2=0) DelayMS(10); /按鍵去抖動 if(K2=0) /再次檢查按鍵 P0= DSY_CODE0; /十位清零 P2=DSY_CODE0; /個位清零 任務(wù)任務(wù)7.3 模擬電子鬧鐘的設(shè)計模擬電子鬧鐘的設(shè)計 1任務(wù)要求 設(shè)計一只模擬電子鬧鐘,要求用矩陣鍵盤輸入設(shè)置,用4位共陽極的數(shù)碼管顯示模擬時間,用蜂鳴器提醒設(shè)置的時間已到。 具體要求如下: (1)用按鍵K0、K1、K2、K3、K4、K5、K6、K7、K8、K9輸入00009999中的任意一個數(shù)值作為設(shè)定時間,數(shù)值的1表示1s,比如輸入0060

22、就表示60s即1分鐘,輸入0600就表示600s即10分鐘。 (2)數(shù)值由四位共陽極的數(shù)碼管動態(tài)顯示,實時顯示當(dāng)前的數(shù)值(時間); (3)K10鍵作為開始鍵,按下后設(shè)置的數(shù)值以1s的時間間隔減1倒數(shù); (4)K11鍵作為取消鍵,按下后取消前面的輸入重新設(shè)置; (5)當(dāng)設(shè)置的數(shù)值減到0時蜂鳴器報警。2任務(wù)分析 采用矩陣鍵盤:用AT89C51的P1.0P1.3作為矩陣鍵盤的行線,P1.4P1.7作為列線。 采用一只4位的共陽極數(shù)碼管,動態(tài)地顯示模擬的時間,由于4位最大只能顯示9999,所以顯示的時間范圍是09999秒。用AT89C51的P0口連接數(shù)碼管的段線,用P2.0P2.3連接位線。 由定時/

23、計數(shù)器的中斷來實現(xiàn)1s定時??梢圆捎肨1的8位自動重裝載初值方式2,TMOD為0 x20,采用12MHz晶體,設(shè)置定時時間為250us中斷,中斷4000次就為1s。 鍵盤一位一位地輸入需要設(shè)置的時間數(shù)值,按下開始鍵后,定時器開始計數(shù),每過1s數(shù)值減1,直到數(shù)值減為0則啟動蜂鳴器報警。3任務(wù)設(shè)計(1)器件的選擇器件名稱數(shù)量(只)AT89C51112MHz晶體122pF瓷片電容210uF電解電容110k電阻1510電阻1輕觸按鍵164位共陽極數(shù)碼管1BC850B三極管4BC858B三極管1有源蜂鳴器1模擬電子鬧鐘設(shè)計器件列表(2)硬件原理圖設(shè)計 p1.0p1.1p1.2p1.3p1.4p1.5p1

24、.6p1.7P1.4P1.5P1.6P1.7P1.0P1.3P1.2P1.1XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.

25、2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51C122PFC222PFC310uFX112MR110kK0K1K2K3K4K5K6K7K8K9K10K11K12K13K14K15LS1BEEPQ1BC850BQ2BC850BQ3BC850BQ4BC850BQ5BC858BR2510主函數(shù)main():T1初始化子函數(shù)init_time1():初始化定時器1T1的1s定時減1中斷函數(shù) timer1():定時250us 減1子函數(shù)plus():動態(tài)顯示子函數(shù)display():顯示鍵盤掃描子函數(shù)keyscan():矩陣鍵盤掃描延時1

26、ms子程序 DelayMS():延時1ms。(3)軟件程序設(shè)計:模塊程序設(shè)計模塊程序設(shè)計源程序編寫如下:源程序編寫如下:/宏定義#include#include#define uchar unsigned char#define uint unsigned intsbit BEEP=P27;/矩陣鍵盤鍵值表uchar code KeyCodeTable=0 x11,0 x21,0 x41,0 x81,0 x12,0 x22,0 x42,0 x82, 0 x14,0 x24,0 x44,0 x84,0 x18,0 x28,0 x48,0 x88;/共陽極數(shù)碼管段碼表uchar code Disp

27、layTable=0 xc0,0 xF9,0 xA4,0 xB0,0 x99, 0 x92,0 x82,0 xF8,0 x80,0 x90;/定義全局變量uchar digbit;/ 字位uchar wordbuf4;/ 字型碼緩沖區(qū)uchar count;/ 字型碼緩沖區(qū)計數(shù)int t1count;/ 定時器1計數(shù)/延時1ms子程序void DelayMS(uint x) uchar i; While(x-) for(i=0; i120; i+);/ 鍵盤掃描子函數(shù) uchar keyscan() uchar sCode, kCode, i, k; P1=0 xF0; /低位行線置 if (

28、P1&0 xF0)!=0 xF0) DelayMS (10); if (P1&0 xF0)!=0 xF0) sCode = 0 xFE; /設(shè)置行掃描碼初值 for (k=0;k4;k+) /對4行分別掃描 P1= sCode; if (P1&0 xF0)!=0 xF0) kCode =P1; doP1=0 xF0; /等待按鍵彈起 while(P1&0 xF0)!=0 xF0); for (i=0;i16;i+) /查表得到按鍵序號并返回 if (kCode=KeyCodeTablei) return i ; else sCode = _crol_(sCode

29、,1); return -1; /減1子函數(shù)void plus() int i; i=wordbuf0*1000+wordbuf1*100+wordbuf2*10+wordbuf3; /將千百十個位合成一整數(shù) i-; if(i=0) /數(shù)值減為0時使蜂鳴器響 BEEP=0; wordbuf0=i/1000; /減1后的數(shù)值再分為一位一位的放入數(shù)組去顯示 wordbuf1=i%1000/100; wordbuf2=i%100/10; wordbuf3=i%10;/初始化定時器1函數(shù)(定時器1,8位自動重裝載初值模式2,250次計數(shù))void init_time1() TMOD=0 x20; TH

30、1=0 x06; TL1=0 x06; EA=1; ET1=1; TR1=1; /定時器1,1s定時減1中斷函數(shù) timer1() interrupt 3 t1count+; if(t1count=4000) /進(jìn)入中斷4000次為1s t1count=0;plus(); /調(diào)用減1函數(shù) / 數(shù)碼管動態(tài)顯示子函數(shù) void display() uchar i; switch (digbit) case 1:i=0;break; case 2:i=1;break; case 4:i=2;break; case 8:i=3;break; default: break; P2= 0 x00; / 關(guān)

31、閉顯示 P0 = DisplayTablewordbufi; / 送字型碼 P2= digbit; / 送字位碼 DelayMS (2); if (digbit0 x08) / 共4位 digbit = digbit*2;/ 左移一位 else digbit = 0 x01;/ 主函數(shù) void main() int m, j,key; count = 0; / 初始沒有輸入,計數(shù)器設(shè)為0 for (j=0;j4;j+) / 剛加電時,初始0000 wordbufj =0; while(count=0&key10) m=1; / 輸入09 else if(key=10) m=2; /

32、開始倒計時鍵 else if(key=11) m=3; / 取消鍵 else m=4; / 其他按鍵switch(m) case 1: if (count4) wordbufcount=key;/ 將按鍵序號即數(shù)字存入數(shù)組 P0=DisplayTablekey; / 每次輸入一個數(shù)字時4位都顯示該數(shù) count+; break; case 2: count=5; / 按下開始鍵就跳出此循環(huán) break; case 3: count = 0; / 計數(shù)清零 for (j=0;j4;j+) wordbufj = 0; / 數(shù)碼管顯示0000 P0=DisplayTable0; break;defa

33、ult: break; digbit = 0 x01;init_time1(); /打開T1的1s計時while(1) display(); /調(diào)用動態(tài)顯示項目項目拓展拓展 簡易電子琴的設(shè)計簡易電子琴的設(shè)計 在實驗板上設(shè)計一個簡易的電子琴,具體要求:按K1鍵發(fā)1音,按K2鍵發(fā)2音按K8鍵發(fā)高音1 。由蜂鳴器來發(fā)出相應(yīng)的音調(diào)。1任務(wù)要求2任務(wù)分析 音樂主要是由音符和節(jié)拍決定的,“哆、唻、咪、法、嗦、啦、唏”音符對應(yīng)于不同的聲波頻率,而節(jié)拍則表達(dá)的是聲音持續(xù)的時間。通過控制單片機(jī)定時器的定時時間可以產(chǎn)生不同頻率的方波,用于驅(qū)動無源蜂鳴器就能發(fā)出不同的音符,然后利用延時子程序來控制發(fā)音時間的長短,即

34、可控制節(jié)拍。把樂譜中的音符和相應(yīng)的節(jié)拍變換成定時常數(shù)和延時常數(shù),做成數(shù)據(jù)表格存放在存儲器中。由程序查表得到定時常數(shù)和延時常數(shù),用1個定時器控制產(chǎn)生方波的頻率,用延時程序控制發(fā)出該頻率方波的持續(xù)時間。當(dāng)延時時間到后再查詢下1個音符的定時常數(shù)和延遲常數(shù),依次進(jìn)行下去即可。 發(fā)音原理: 在方式在方式1 1的定時狀態(tài)下,改變定時器的計數(shù)初值來產(chǎn)的定時狀態(tài)下,改變定時器的計數(shù)初值來產(chǎn)生不同的頻率。生不同的頻率。音符(低音)頻率Hz簡譜碼(T值)音符(中音)頻率Hz簡譜碼(T值)音符(高音)頻率Hz簡譜碼(T值)低126263628152364580高1104765058低2294638352587646

35、84高2117565110低333064021365964777高3131965157低434964103469964820高4139765178低539264260578464898高5156965127低644064400688064968高6176065252低749464524798865030高7197665283C調(diào)音符、頻率、定時常數(shù)關(guān)系表 用杜邦線將單片機(jī)外圍用杜邦線將單片機(jī)外圍的的J22J22的的3 3腳與腳與J42J42的的7 7腳連接,腳連接,就用就用P1.2P1.2控制喇叭的發(fā)聲了;控制喇叭的發(fā)聲了;J26J26連接連接8 8只獨立按鍵只獨立按鍵K1K8K1K8,見見“

36、獨立按鍵獨立按鍵”電路,用杜電路,用杜邦線將邦線將J22J22的的10171017腳與腳與J26J26連連接上,這樣就用接上,這樣就用P3P3口控制口控制8 8只只獨立按鍵。獨立按鍵。 3任務(wù)設(shè)計簡易電子琴源簡易電子琴源程序如下程序如下:/宏定義 #include#define KeyPort P3/定義全局變量unsigned char High,Low; /定時器預(yù)裝值的高8位和低8位sbit SPK=P12; /定義喇叭接口unsigned char code freq2= 0 x44,0 xFC, / 523Hz “1” 0 xAC,0 xFC, / 587 Hz “2” 0 x09,

37、0 xFD, / 659 Hz “3” 0 x34,0 xFD, / 699 Hz “4” 0 x82,0 xFD, / 784 Hz “5” 0 xC8,0 xFD, / 880 Hz “6” 0 x06,0 xFE, / 988 Hz “7” 0 x22,0 xFE, / 1047 Hz “高1”/ 函數(shù)聲明void Init_Timer0(void); /初始化定時器/主函數(shù)void main (void) unsigned char num; Init_Timer0(); /初始化定時器0 SPK=0; /在未按鍵時,喇叭低電平,防止長期高電平損壞喇叭while (1) /主循環(huán) switch(KeyPort) case 0 xfe: num= 1; break; case 0 xfd: num= 2; break; case 0 xfb: num= 3; break; case 0 xf7: num= 4; break; case 0 xef: num=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論