版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p><b> 第1章 緒論1</b></p><p> 1.1單片機(jī)的現(xiàn)狀1</p><p> 1.1.1 單片機(jī)在我國(guó)的普及1</p><p> 1.2 單片機(jī)的發(fā)展趨勢(shì)2</p><p>
2、 1.2.2 單片機(jī)速度越來越快2</p><p> 1.2.3 低電壓與低電耗2</p><p> 1.2.4 微型單片化2</p><p> 1.2.5 大容量 高性能3</p><p> 1.2.6 串行擴(kuò)展技術(shù)3</p><p> 第2章 8051單片機(jī) 芯片的特點(diǎn)及引腳4&
3、lt;/p><p> 2.1 8051單片機(jī) 芯片的特點(diǎn)4</p><p> 2.3 8051單片機(jī)的擴(kuò)展及系統(tǒng)電路5</p><p> 第三章 相關(guān)軟件的說明7</p><p> 第三章 相關(guān)軟件的說明8</p><p> 3.1 proteus8</p><p
4、> 3.1.1 proteus簡(jiǎn)介8</p><p> 3.1.2 proteus功能介紹9</p><p> 3.2 keil軟件10</p><p> 第四章 單詞記憶測(cè)試器的設(shè)計(jì)11</p><p> 4.1 硬件模塊設(shè)計(jì)11</p><p> 4.1.1中央處理模塊
5、11</p><p> 4.1.2 顯示模塊的硬件部分介紹12</p><p> 4.1.3 矩陣鍵盤15</p><p> 4.2 電路原理圖設(shè)計(jì)16</p><p> 4.3 軟件程序設(shè)計(jì)17</p><p> 4.3.1 程序設(shè)計(jì)思路17</p><p> 4.3
6、.2矩陣鍵盤的程序設(shè)計(jì)18</p><p> 4.3.3 LCD12864顯示模塊的驅(qū)動(dòng)程序19</p><p> 4.3.4 顯示字模碼的提取20</p><p> 4.3 系統(tǒng)軟件主程序結(jié)構(gòu)及其函數(shù)21</p><p> 4.4 軟件的仿真26</p><p> 第五章 結(jié)語28&l
7、t;/p><p> 附 錄 單片機(jī)單詞記憶測(cè)試器C程序源代碼</p><p> 基于單片機(jī)的單詞記憶測(cè)試器</p><p><b> 摘要</b></p><p> 本論文的研究對(duì)象是基于單片機(jī)的單詞記憶測(cè)試器的設(shè)計(jì),此單詞記憶測(cè)試器可以實(shí)現(xiàn)單詞的輸入并判斷輸入的單詞是否正確,單詞背完后給出正確率。該單片機(jī)單
8、詞記憶測(cè)試器為在現(xiàn)實(shí)生活中有著廣泛的應(yīng)用,特別是對(duì)學(xué)習(xí)英語方面有很大的作用。</p><p> 本設(shè)計(jì)以STC89C52單片機(jī)為處理器,以12854點(diǎn)陣液晶屏為顯示器件,并使用5×6距陣鍵盤為輸入設(shè)備,實(shí)現(xiàn)了功能全面的人機(jī)界面和高速的數(shù)據(jù)處理功能,利用單片機(jī)片上FLASH ROM,可儲(chǔ)存10-20個(gè)英文單詞和漢字,作為記憶測(cè)試用。</p><p> 關(guān)鍵詞: 單片機(jī)
9、 單詞記憶測(cè)試器 AT89C52 12864液晶屏</p><p> 第四章 單詞記憶測(cè)試器的設(shè)計(jì)</p><p> 4.1 硬件模塊設(shè)計(jì)</p><p> 本單詞記憶測(cè)試器系統(tǒng)硬件部分分為三個(gè)模塊:中央處理模塊、顯示模塊、鍵盤輸入模塊。系統(tǒng)模型圖如下:</p><p> 圖4 系統(tǒng)硬件模塊圖</p>
10、;<p> 4.1.1中央處理模塊</p><p> 中央處理模塊選用STC89C52單片機(jī)系統(tǒng)組成,電路包括:STC89C52單片機(jī)、復(fù)位電路、時(shí)鐘振蕩電路。</p><p> STC89C52單片機(jī)需在復(fù)位電路和時(shí)鐘振蕩電路組成的最小系統(tǒng)下工作,單片機(jī)引腳圖如圖5,外圍電路如圖6和圖7所示,時(shí)鐘電路采用頻率采用為12MHZ的晶振,C1、C2與晶振構(gòu)成了外部振蕩電路。
11、復(fù)位電路采用電解電容與電阻串聯(lián),當(dāng)系統(tǒng)上電時(shí),由于電容充電,在RST端會(huì)產(chǎn)生一個(gè)高電平,高電平持續(xù)的時(shí)間由電容和電阻的值決定,當(dāng)RESET信號(hào)為低電平時(shí),系統(tǒng)為工作狀態(tài)。 STC89C52具有ISP的功能,可以通過串行口直接將程序下載到單片機(jī)內(nèi)。在下載程序狀態(tài)下,RESET信號(hào)被拉高,系統(tǒng)進(jìn)行程序下載,待程序下載完畢后,RESET重新拉低。用戶可以通過切斷電源進(jìn)行手動(dòng)復(fù)位,或者通過重新下載新的程序進(jìn)行復(fù)位。</p><
12、;p> 圖5 STC89C52的引腳排列圖</p><p> 圖6 時(shí)鐘電路圖 圖7復(fù)位電路圖</p><p> 4.1.2 顯示模塊的硬件部分介紹</p><p> 顯示模塊采用單色點(diǎn)陣液晶屏12864模塊,該模塊在點(diǎn)陣液晶屏基礎(chǔ)上集成了控制器kS0108,用戶只需設(shè)計(jì)好接口程序
13、,就可讓模塊顯示出各種字符和圖像。</p><p> 通常我們所見到的 LCD 模塊,分為幾部分:LCM(玻璃)、背光、PCB 板;而背光和PCB板部分其實(shí)是可有可無的,視具體的LCD 模塊而定。點(diǎn)陣的LCD 模塊按照驅(qū)動(dòng)控制器的集成方式,大可分為兩種:COB 和COG;COG 其實(shí)就是將驅(qū)動(dòng)控制IC 集成到了玻璃里面,這樣的而后面的PCB 板上其實(shí)只是一些驅(qū)動(dòng)控制IC 無法集成的電容電阻而已;COB 也就是把
14、驅(qū)動(dòng)控制IC 焊接在LCD 模塊后面的PCB 板上。</p><p> 12864 為一塊128X64 點(diǎn)陣的LCD 顯示模塊,模塊上的 LCM 采用COG 技術(shù)將控制</p><p> (包括顯存)、驅(qū)動(dòng)器集成在LCM 的玻璃上,接口簡(jiǎn)單、操作方便;為方便用戶的使用,</p><p> 在LCM 的基礎(chǔ)上設(shè)計(jì)了12864 模塊,將模塊所必需的外圍電容電阻集成
15、到模塊上,</p><p> 并引出多種形式的引線接口方便用戶使用。12864 模塊與各種MCU 均可進(jìn)行方便簡(jiǎn)</p><p><b> 單的接口操作。</b></p><p><b> LCD 的接口:</b></p><p> 一般來說,LCD 模塊(帶有驅(qū)動(dòng)控制器)的接口多為總線的接
16、口,不是6800 就是8080,或者是串行SPI(及類SPI 時(shí)序);除了這些總線的端口外,有的LCD 模塊還引出了一些功能性的端口,如偏壓調(diào)節(jié)輸入、負(fù)壓輸出等。</p><p> 圖8 12864 模塊接口定義表</p><p> 顯示 RAM 區(qū)映射情況:</p><p> 對(duì)于 LCD 模塊,了解清楚驅(qū)動(dòng)控制IC 當(dāng)中的顯存與LCD 玻璃上的點(diǎn)的對(duì)應(yīng)關(guān)系
17、是非常重要的,這是編寫LCD 的驅(qū)動(dòng)程序的基礎(chǔ)。12864 液晶顯示模塊的顯示器(玻璃)上的顯示點(diǎn)與驅(qū)動(dòng)控制芯片中的顯示緩存RAM是一一對(duì)應(yīng)的;驅(qū)動(dòng)控制芯片當(dāng)中共有65(8 Page x 8 bit+1)X 132 個(gè)位的顯示RAM 區(qū)。而顯示器的顯示點(diǎn)陣大小為64X128 點(diǎn),所以實(shí)際上在液晶顯示模塊中有用的顯示RAM 區(qū)為64 X 128 個(gè)位;按byte 為單位劃分,共分為8 個(gè)Page,每個(gè)Page 為8 行,而每一行為128
18、個(gè)位(即128 列)。</p><p> 驅(qū)動(dòng)控制芯片的顯示RAM區(qū)每個(gè)byte的數(shù)據(jù)對(duì)應(yīng)屏上的點(diǎn)的排列方式為:縱向排列,低位在上高位在下;如圖 8所示</p><p> 圖8 驅(qū)動(dòng)控制芯片的顯示RAM區(qū)</p><p> 12864 液晶顯示模塊的顯示屏上的每一個(gè)點(diǎn)都對(duì)應(yīng)有控制器片內(nèi)的顯示緩存RAM中</p><p> 的一個(gè)位,顯
19、示屏上64X128 個(gè)點(diǎn)分別對(duì)應(yīng)著顯示RAM的8 個(gè)Page,每一個(gè)Page有128 個(gè)byte的空間對(duì)應(yīng)。因此可知顯示RAM區(qū)中的一個(gè)Page空間對(duì)應(yīng)8 行的點(diǎn),而該P(yáng)age中的一個(gè)byte數(shù)據(jù)則對(duì)應(yīng)一列(8 個(gè)點(diǎn))。圖9 為顯示RAM區(qū)與顯示屏的點(diǎn)映射圖:</p><p> 圖9 顯示RAM區(qū)與顯示屏的點(diǎn)映射圖</p><p><b> 行、列地址:</b>&
20、lt;/p><p> 用戶如要點(diǎn)亮 LCD 屏上的某一個(gè)點(diǎn)時(shí),實(shí)際上就是對(duì)該點(diǎn)所對(duì)應(yīng)的顯示RAM 區(qū)中的某一個(gè)位進(jìn)行置1 操作;所以就要確定該點(diǎn)所處的行地址、列地址。從上圖中可以看出,</p><p> MzL02-12864 液晶顯示模組的行地址實(shí)際上就是Page 的信息,每一個(gè)Page 應(yīng)有8 行;而列地址則表示該點(diǎn)的橫坐標(biāo),在屏上為從左到右排列,Page 中的一個(gè)Byte 對(duì)應(yīng)的是一
21、列(8行,即8 個(gè)點(diǎn)),達(dá)128 列??梢愿鶕?jù)這樣的關(guān)系在程序中控制 LCD 顯示屏的顯示。注意:MzL02-12864 的顯示緩存RAM 區(qū)實(shí)際上比模塊上的顯示器所對(duì)應(yīng)的RAM 區(qū)要大;而LCD 模塊具體設(shè)置Page(有時(shí)也稱頁(yè))時(shí),屏上的位置與驅(qū)動(dòng)控制IC 當(dāng)中的哪里的RAM區(qū)對(duì)應(yīng),還與驅(qū)動(dòng)控制IC 與屏的連接有關(guān);所以,實(shí)際在使用時(shí),請(qǐng)參考所提供的范例設(shè)置(主要是設(shè)置COM 反向掃描、SEG 設(shè)置為正向掃描,以此設(shè)置方法,則每個(gè)P
22、age 中的前三列以及最后一列是不對(duì)應(yīng)在LCD 屏幕上的)。</p><p> 4.1.3 矩陣鍵盤</p><p> 要測(cè)試記憶的單詞,就要有字母的輸入接口,本接口設(shè)計(jì)為5×6矩陣鍵盤輸入,接入單片機(jī)的P1口和P3口進(jìn)行鍵盤掃描。最大程度地提高了單片機(jī)IO口的利用率,設(shè)計(jì)共30個(gè)接鍵,包括了26個(gè)英文字母以及四個(gè)功能鍵:“確定”、“不認(rèn)識(shí)”、“上一個(gè)”、“下一個(gè)”。<
23、/p><p> 矩陣鍵盤如圖10,由30個(gè)輕觸按鍵按照6行5列排列,連接到P1、P3端口。其掃描的原理是:先將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時(shí),所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會(huì)被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。然后再將行線所接的單片機(jī)的I/O口作為輸入端,而列線所接的I/O口則作為輸
24、出,以相同的方法讀一次端口,程序中就可識(shí)別是啊個(gè)坐標(biāo)的按鍵按下了。</p><p> 圖10 5×6矩陣鍵盤</p><p> 4.2 電路原理圖設(shè)計(jì)</p><p> 電路原理圖設(shè)計(jì)使用集原理圖設(shè)計(jì)、PCB設(shè)計(jì)、電路仿真功能為一體的PROTUES軟件。以該軟件設(shè)計(jì)的電路原理圖圖11。</p><p> 圖11 單片機(jī)單詞記
25、憶測(cè)試器電路原理圖</p><p><b> 電路設(shè)計(jì)參數(shù):</b></p><p> C1 C2 為20-30PF瓷片電容,與12M晶振組成時(shí)鐘振蕩電路;</p><p> 復(fù)位電路使用R1為10K電阻、C3為10uF電解電容;</p><p> 12864液晶模塊與單片機(jī)P0口連接,因P0口為真正的三態(tài)門結(jié)構(gòu)
26、,因些作數(shù)據(jù)總線使用時(shí)要外接上拉電阻,可使用10K的排阻;</p><p> 按鍵如圖的行相連,列相連的矩陣接法連入單片機(jī)IO口;</p><p> 電路的供電為5V直流電源;</p><p> D1為輸入錯(cuò)誤的狀態(tài)指示燈,加220歐限流電阻連到VCC,因?yàn)镾TC89C51單片機(jī)IO的電流灌入能力要強(qiáng)于電流輸出能力,因此一般使IO為低電平時(shí)點(diǎn)亮LED燈。<
27、;/p><p> 4.3 軟件程序設(shè)計(jì)</p><p> 4.3.1 程序設(shè)計(jì)思路</p><p> 因本系統(tǒng)為模塊化設(shè)計(jì),為方便軟件編寫和移植,程序設(shè)計(jì)采用C語言,程序流程圖如下:</p><p> 4.3.2矩陣鍵盤的程序設(shè)計(jì)</p><p> 矩陣鍵盤采用5×6 列與行掃描法,P1口依次接鍵盤的每
28、一行,而P3口依次接鍵盤的每一列,程序開始先令P1全為高電平,P3口全為低電平,這樣一旦矩陣鍵盤中有一個(gè)鍵按下時(shí),就會(huì)在某一行中出現(xiàn)低電平,而某一列中出現(xiàn)高電平,程序先讀P1口,以檢測(cè)到有低電平來確定行。再使P1全為低電平,P3口全為高電平,再讀P3口,以檢測(cè)到低電平來確定列。</p><p> 這里還要考慮按鍵的機(jī)械抖動(dòng)問題,因?yàn)榘存I的機(jī)械特性,可能在按下瞬間會(huì)有一組抖動(dòng)的脈沖,一般程序中采用延時(shí)方法來去抖動(dòng)
29、。</p><p> 實(shí)現(xiàn)的C程序函數(shù)如下:</p><p> /*************************************************</p><p><b> ** 鍵盤掃描程序</b></p><p> **************************************
30、***********/</p><p> unsigned char kbscan() //鍵盤掃描</p><p><b> {</b></p><p> uchar hang,lie,key; //P1連行,P3連列</p><p> if(P1!=0xFF||P3!=0
31、) //按鍵去抖動(dòng)</p><p> delayms(5); //延時(shí)5ms</p><p> if(P1!=0xFF||P3!=0)</p><p><b> {</b></p><p> switch(P1&0xFF) //
32、P1 掃行</p><p><b> {</b></p><p> case 0xFE:hang=5;break; //P1.0為第6行</p><p> case 0xFD:hang=4;break; //P1.1為第5行</p><p> case 0xFB:hang=3;break; //P1.2為第4行&
33、lt;/p><p> case 0xF7:hang=2;break; //P1.3為第3行</p><p> case 0xEF:hang=1;break; //P1.4為第2行</p><p> case 0xDF:hang=0;break; //P1.5為第1行</p><p><b> }</b></p
34、><p> P1=0; //P1全低電平 </p><p> P3=0xFF;//P3全高電平</p><p> switch(P3&0xFF)</p><p><b> {</b></p><p> case 0xFE:lie=
35、4;break; //P1.0為第5列</p><p> case 0xFD:lie=3;break; //P0.5為第4列</p><p> case 0xFB:lie=2;break; //P0.6為第3列</p><p> case 0xF7:lie=1;break; //P0.7為第2列</p><p> case 0xEF:
36、lie=0;break; //P0.7為第1列</p><p><b> }</b></p><p> P1=0xFF; //P1全高電平 </p><p> P3=0; //P3全低電平</p><p> while(P1!=0xFF||P3!=0); //按鍵松開后才返回值</p>&l
37、t;p> key=tab1[hang][lie];</p><p><b> }</b></p><p><b> else</b></p><p> key='_'; //沒鍵按下返回空</p><
38、p> return (key);</p><p><b> }</b></p><p> 4.3.3 LCD12864顯示模塊的驅(qū)動(dòng)程序</p><p> LCD12864顯示模塊的程序作為顯示部分的底層程序,用戶可直接調(diào)用其函數(shù)來達(dá)到驅(qū)動(dòng)和顯示功能。</p><p> 主要顯示命令和顯示的函數(shù)說明如下
39、:</p><p> 清顯示屏:void ClearLCD() ,將LCD上的顯示字符清空</p><p> 漢字的顯示函數(shù):void hz_disp(unsigned char x,unsigned char y,unsigned char n,unsigned char code * hz,bit flag) ;</p><p> 其中X Y為漢字的起始
40、坐標(biāo),n為字?jǐn)?shù),hz為存儲(chǔ)漢字字模碼(后述)的地址,flag為顯示為黑還是白。</p><p> 英文的顯示函數(shù)為:void en_disp(unsigned char x,unsigned char y,unsigned char n,unsigned char code *asc,unsigned char *string,bit flag) ;</p><p> 其中其中X Y為
41、字母的起始坐標(biāo),n為字?jǐn)?shù),asc為存儲(chǔ)字形碼(后述)的地址,flag為顯示為黑還是白。</p><p> LCD12864顯示一個(gè)單詞的示例代碼如下:</p><p> en_disp(6,0,8,Asc,"correct:",1); //在第7行,第1列開始顯示correct;</p><p> LCD12864顯示一個(gè)漢字的示
42、例代碼如下:</p><p> hz_disp(0,48,1,hz1+hz_Num*32,1); //在第1行,第49列開始顯示測(cè)試的漢字</p><p> 4.3.4 顯示字模碼的提取</p><p> 為了使LCD12864能夠顯示用戶存儲(chǔ)的中文漢字和英文單詞,用戶必須將要顯示的漢字字模及英文字母字模碼存入單片機(jī)存儲(chǔ)器中,因LCD12864只能顯示點(diǎn)陣圖
43、形,因此存儲(chǔ)入單片機(jī)的字模碼必須是通過點(diǎn)陣碼轉(zhuǎn)換而成,為了軟換更方便,設(shè)計(jì)使用了字模轉(zhuǎn)換軟件實(shí)現(xiàn)漢字和英文碼的取模。</p><p> 圖12 中英文取字模軟件界面</p><p> 例如漢字“中國(guó)”,取得的字模碼為:</p><p> /*-- 文字: 中 --*/</p><p> 0x00,0x00,0xFC,0x08,0
44、x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,</p><p> 0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,</p><p> /*-- 文字: 國(guó) --*/</p><p
45、> 0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00,</p><p> 0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00,</p><p> 將此碼存入單片機(jī)
46、程序存儲(chǔ)器里,使用液晶顯示的函數(shù)就可方便地顯示漢字或英文字形。</p><p> 本單片機(jī)記憶測(cè)試系統(tǒng)的程序中將英文字符的字模碼表以asc.h文件形式保存,為節(jié)約單片機(jī)的RAM,生成的二進(jìn)制文件以只讀形式儲(chǔ)在單片機(jī)的FLASH ROM中。</p><p> 4.3 系統(tǒng)軟件主程序結(jié)構(gòu)及其函數(shù)</p><p> 系統(tǒng)主程序完成主循環(huán)和對(duì)各模塊函數(shù)的調(diào)用,調(diào)用的
47、文件包括:reg52.h、asc.h、 12864.h,其中reg52.h是 8051內(nèi)核單片機(jī)的標(biāo)準(zhǔn)頭文件,定義了單片機(jī)內(nèi)部各寄存器的地址,使用戶編程更方便;asc.h存儲(chǔ)了本單詞記憶測(cè)試器的單詞和中文漢字字模塊,供顯示函數(shù)調(diào)用,而12864.h為L(zhǎng)CD12864顯示屏的底層驅(qū)動(dòng)程序,包括了屏顯示的指令函數(shù)和顯示中英文的函數(shù)。</p><p> 在KEIL uV3環(huán)境下將 主程序文件和reg52.h、a
48、sc.h、12864.h放在同一工程工作組中,以便主程序調(diào)用,如圖13。</p><p> 圖13 keil下的 程序工程文件</p><p><b> 主程序的函數(shù):</b></p><p> 主程序首先進(jìn)行存儲(chǔ)變量的定義:</p><p> bit ERROR; //輸入字符錯(cuò)誤
49、標(biāo)志位,輸入錯(cuò)誤為 1</p><p> bit result; //輸入的最終結(jié)果對(duì)錯(cuò)的標(biāo)志位,為0是正確</p><p> bit verify; //標(biāo)志按過一次確認(rèn)鍵</p><p> sbit ERR=P2^7; //P2.7 口接一個(gè)指示燈警告輸入錯(cuò)誤</p>
50、<p> uchar correctNUM; //統(tǒng)計(jì)測(cè)試正確的單詞數(shù),即得分</p><p> uchar code SL[10]={4,4,5,3,2,4,4,3,4,3}; </p><p> //存儲(chǔ)各測(cè)試單詞的長(zhǎng)度,如果輸入的單詞長(zhǎng)度與存儲(chǔ)的不同,也為錯(cuò)誤</p><p> 為能動(dòng)態(tài)地顯示測(cè)試的單詞,先將要測(cè)試的單詞存在一
51、個(gè)二維數(shù)組中,顯示了該數(shù)組中的字符時(shí),12864.h中的顯示函數(shù)會(huì)調(diào)用 相應(yīng)字符的字模碼(asc.h中);</p><p> /*****************************************</p><p> /** 存儲(chǔ)要測(cè)試的單詞,放在ROM中</p><p> /************************************
52、****/</p><p> uchar code S[10][5]={ "tree ", //樹</p><p> "rain ", //雨</p><p> "water", //水</p><p> "
53、fly ", //飛</p><p> "go ", //去</p><p> "fish ", //魚</p><p> "snow ", //雪</p><p> "eat
54、", //吃</p><p> "rice ", //米</p><p> "ice ", //冰</p><p><b> } ;</b></p><p> 該二維數(shù)組為行*列 10*5,即10行5列,1
55、0行表示有10個(gè)單詞,實(shí)際根據(jù)存儲(chǔ)ROM的大小,可以增加單詞數(shù);列數(shù)表示單詞在存儲(chǔ)器中占的字符數(shù),以最長(zhǎng)單詞(5個(gè)字符)定義,不足5個(gè)字符的單詞后補(bǔ)空格表示。</p><p> 前節(jié)介紹過鍵盤的輸入是通過矩陣掃描的方法,通過矩陣掃描可使單片機(jī)找到按鍵所在的某行某列,但要得到一個(gè)英文字母值,還得在單片機(jī)返回的某行某列位置預(yù)先定義個(gè)字母值,因此5*6矩陣鍵盤的整個(gè)返回字母表可定義一個(gè)二維數(shù)組存儲(chǔ):</p>
56、;<p> /*****************************************</p><p> /** 存儲(chǔ)鍵盤的字母值 ,放在ROM中</p><p> /****************************************/</p><p> uchar code tab1[6][5]={{'a
57、9;,'b','c','d','e'},</p><p> {'f','g','h','i','j' },</p><p> {'k','l','m','n','o
58、39; },</p><p> {'p','q','r','s','t' },</p><p> {'u','v','w','x','y'},</p><p> {'z', 1, 2
59、, 3 , 4} };</p><p> 例如在按下鍵盤時(shí),單片機(jī)返回鍵盤位置為 第二行第三列,就可從上表中查出是對(duì)應(yīng)位置的字母。 鍵盤掃描函數(shù)返回的是鍵值。 </p><p> key=tab1[hang][lie];</p><p> 進(jìn)入主程序后,先對(duì)LCD12864屏進(jìn)行初始化和清屏操作,然后在LCD12864屏上顯示單片機(jī)單詞記憶測(cè)試器的
60、靜態(tài)的圖文,需要?jiǎng)討B(tài)刷新的字符則在主循環(huán)中進(jìn)行。</p><p> LCD12864_init();//LCD12864初始化</p><p> ClearLCD();//清屏</p><p> en_disp(2,1,11,Asc,"INPUT WORD:",1); //在第3行 第21列 顯示"INPUT W
61、ORD:"</p><p> //最后的“1”表示顯示為白底黑字,如是0則為黑底白字,即反顯</p><p> en_disp(4,1,1,Asc,">",1); //在第5行,第5列開始顯示">"</p><p> en_disp(6,0,8,Asc,&quo
62、t;correct:",1); //在第7行,第1列開始顯示"correct:"</p><p> en_disp(6,80,5,Asc,"00/10",1); //在第7行 第81列顯示"00/10"</p><p> LCD12864的顯示效果如下,此時(shí)系統(tǒng)進(jìn)入單
63、詞輸入測(cè)試就緒狀態(tài)。</p><p> 在系統(tǒng)進(jìn)入單詞輸入測(cè)試就緒狀態(tài)后,主程序即進(jìn)入while(1)的主循環(huán)中,循環(huán)進(jìn)行鍵盤掃描,并判斷鍵盤輸入值,再與待測(cè)試的單詞進(jìn)行比較,如果輸入的字符和字符長(zhǎng)度均與被測(cè)試的單詞一致,則顯示correct加1,即為加1分,并進(jìn)入下一個(gè)單詞的測(cè)試,測(cè)試完10個(gè)單詞后,重新進(jìn)入第1個(gè)單詞的測(cè)試。</p><p> 主程序的主循環(huán)部分代碼及注釋如下:&l
64、t;/p><p><b> while(1)</b></p><p> { </p><p> KeyNum[iword]=kbscan(); //進(jìn)行矩陣按鍵掃描,得到掃描鍵盤的輸入值</p><p> hz_disp(0,48,1,hz1+hz_N
65、um*32,1); //在第1行,第49列開始顯示測(cè)試的漢字</p><p> temp[0]=(hz_Num+1)/10+0x30; //將十進(jìn)制數(shù)轉(zhuǎn)換為ASCII字符</p><p> //temp數(shù)組用來存儲(chǔ)測(cè)試的序號(hào) </p><p> temp[1]=(hz_Num+
66、1)%10+0x30; //算出測(cè)試漢字的序號(hào)的第一位和第二位</p><p> en_disp(0,20,1,Asc,":",1); //在第1行 第21列顯示":"</p><p> en_disp(0,4,2,Asc,temp,1); //在第1行 第5列顯示測(cè)試序號(hào) </p>&l
67、t;p> if(KeyNum[iword]!='_') //鍵盤有按鍵按下,無按下返回的是'_'</p><p><b> {</b></p><p> if(KeyNum[iword]==1) //如果按下了確定鍵</p><p><b
68、> {</b></p><p> if(SL[hz_Num]==iword&&verify) </p><p> //輸入長(zhǎng)度等于測(cè)試單詞的長(zhǎng)度,則正確 ,verify表示按下了確認(rèn)后有效一次</p><p><b> {</b></p><p> correctNUM+
69、=1;</p><p> if(correctNUM>10)</p><p><b> {</b></p><p> correctNUM=10; //最多10個(gè)正確的</p><p><b> }</b></p><p> verify=0;
70、 //標(biāo)志位清零</p><p> hz_Num++; //測(cè)試下一個(gè)單詞</p><p> if(hz_Num==10) hz_Num=0; //最多設(shè)10個(gè)單詞</p><p> temp[0]=(correctNUM)/10+0x30; //將十進(jìn)制數(shù)轉(zhuǎn)換為AS
71、CII字符</p><p> temp[1]=(correctNUM)%10+0x30; //算出測(cè)試漢字的序號(hào)的第一位和第二位</p><p> en_disp(6,80,2,Asc,temp,1); //在第7行 第81列</p><p><b> iword=0;</b></p><p>
72、;<b> Nword=0;</b></p><p> en_disp(4,16,8,Asc," ",1); //在第5行,第17列開始顯示 </p><p><b> }</b></p><p><b> }</b></p><p&g
73、t; else if(KeyNum[iword]==2||KeyNum[iword]==4)</p><p> //如果按下了“不認(rèn)識(shí)”或“下一個(gè)”鍵 ,直接跳到下一個(gè)單詞</p><p><b> {</b></p><p> result=0; //跳下一個(gè)時(shí)錯(cuò)誤燈滅</p><p><b
74、> ERROR=0;</b></p><p> hz_Num++; //測(cè)試下一個(gè)單詞</p><p> if(hz_Num==10) hz_Num=0; //最多設(shè)10個(gè)單詞</p><p><b> iword=0;</b></p><p
75、><b> Nword=0;</b></p><p> en_disp(4,16,8,Asc," ",1); //在第5行,第17列開始顯示 </p><p><b> }</b></p><p> else if(KeyNum[iword]==3)
76、 //如果按下了“上一個(gè)”鍵 ,直接跳到上一個(gè)單詞</p><p><b> {</b></p><p> result=0; //跳下一個(gè)時(shí)錯(cuò)誤燈滅</p><p><b> ERROR=0;</b></p><p><b> //測(cè)試下一個(gè)單詞</b>
77、;</p><p> if(hz_Num==0) hz_Num=10; //最多設(shè)10個(gè)單詞</p><p> hz_Num--; </p><p><b> iword=0;</b></p><p><b> Nword=0;</b></p><p>
78、; en_disp(4,16,8,Asc," ",1); //在第5行,第17列開始顯示 </p><p><b> }</b></p><p> else if(S[hz_Num][iword]==KeyNum[iword])//輸入的字符與測(cè)試的標(biāo)準(zhǔn)字符比較</p><p> { temp
79、[0]=KeyNum[iword];</p><p> ERROR=0; //正確就標(biāo)志位置0</p><p> en_disp(4,Nword+16,1,Asc,temp,1); //在第5行,第17列開始顯示 </p><p><b> iword++;</b></p><p>
80、 if(iword==8) iword=0;</p><p> Nword=iword*8;</p><p> verify=1; </p><p><b> }</b></p><p><b> else </b></p>
81、<p> { temp[0]=KeyNum[iword];</p><p> ERROR=1;//錯(cuò)誤就置1</p><p> en_disp(4,Nword+16,1,Asc,temp,1); //在第5行,第17列開始顯示 </p><p><b> iword++;</b></p>&l
82、t;p> if(iword==8) iword=0;</p><p> Nword=iword*8;</p><p><b> }</b></p><p> result=ERROR|result;//0表示結(jié)果正確 </p><p><b> }</b></p>
83、<p> ERR=!result; //錯(cuò)誤指示燈</p><p><b> }</b></p><p><b> }</b></p><p> 4.4 軟件的仿真</p><p> 軟件的仿真使用protues環(huán)境,在畫好protues原理圖后,將keil
84、環(huán)境下生成的目標(biāo)文件HEX文件載入protues中,即可進(jìn)行軟件仿真。因仿真軟件中沒有STC89C52元件 ,故可使用完全兼容的AT89C52單片機(jī)仿真。</p><p><b> 仿真的結(jié)果:</b></p><p> 輸入錯(cuò)誤時(shí)黃色LED報(bào)警:</p><p><b> 第五章 結(jié)語</b></p>
85、<p> 由于本人對(duì)單片機(jī)的認(rèn)識(shí)有限,在設(shè)計(jì)過程中遇到不少困難。在設(shè)計(jì)程序方面出現(xiàn)不少問題,所以用了比較簡(jiǎn)單的程序運(yùn)算。雖然花了幾個(gè)月的時(shí)間盡力把畢業(yè)做好,但由于本人能力的原因,整個(gè)系統(tǒng)做的并不理想,但是在整個(gè)設(shè)計(jì)的過程中我積累了不少的經(jīng)驗(yàn),學(xué)會(huì)一些系統(tǒng)的應(yīng)用。</p><p> 我一直認(rèn)為畢業(yè)設(shè)計(jì)重在過程。確實(shí)是這樣的。這個(gè)畢業(yè)設(shè)計(jì)的過程,其實(shí)也就是我不斷學(xué)習(xí)的過程。在這個(gè)過程中我學(xué)到了許多新
86、的知識(shí),能力也提高了不少。這些收獲給我?guī)淼南矏傔h(yuǎn)遠(yuǎn)超過了完成畢業(yè)設(shè)計(jì)時(shí)給我?guī)淼南矏?。我相信,以后再做這些設(shè)計(jì)的時(shí)候一定還可以做得更好。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 何立民主編. 單片機(jī)應(yīng)用文集. 北京:北京航空航天大學(xué)出版社,1994</p><p> [2] 王福瑞主編. 單片微機(jī)測(cè)控系統(tǒng)設(shè)
87、計(jì)大全. 北京:北京航空航天大學(xué)出版社,</p><p><b> 1999</b></p><p> [3] 夏繼強(qiáng) 沈德金主編. 單片機(jī)實(shí)驗(yàn)與實(shí)踐教程. 北京:北京航空航天大學(xué)出版社,2002</p><p> [4] 李朝青主編. PC機(jī)及單片機(jī)數(shù)據(jù)通信技術(shù). 北京:北京航空航天大學(xué)出版社,2001</p><p
88、> [5] 馬忠梅主編. 單片機(jī)的c語言應(yīng)用程序設(shè)計(jì).北京:北京航空航天大學(xué)出版社,2003</p><p> [6] 沈美明、溫冬嬋主編.IBM-PC匯編語言程序設(shè)計(jì).北京:清華大學(xué)出版社2003</p><p> [7] 何立民主編. MCS-51系列單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì).北京:北京航空航天大學(xué)出版社2001</p><p> [8] 劉慶江 張曉光
89、. 一種實(shí)用的集成芯片測(cè)試儀的設(shè)計(jì). 中國(guó)礦業(yè)大學(xué)信息與電氣工程學(xué)院, 2005</p><p><b> 附 錄</b></p><p> 單片機(jī)單詞記憶測(cè)試器C程序源代碼</p><p> /***********************************************************************
90、*</p><p> /**單片機(jī)單詞測(cè)試程序</p><p> /**設(shè)計(jì)一個(gè)以單片機(jī)為核心的單詞記憶測(cè)試器;</p><p> /** 實(shí)現(xiàn)單詞的錄入(為使程序具有可演示性,單詞不少于10個(gè));</p><p> /**單詞用按鍵控制依次在屏幕上顯示,按鍵選擇認(rèn)識(shí)還是不認(rèn)識(shí),</p><p> /**也可
91、以直接進(jìn)入下一個(gè)或者上一個(gè);</p><p> /**單詞背完后給出正確率。</p><p> /*************************************************************************/</p><p> #define uchar unsigned char</p><p>
92、 #define uint unsigned int</p><p> #include <reg52.h></p><p> #include "asc.h" //ASCII字模表</p><p> #include "12864.h"//12864液晶屏底層驅(qū)動(dòng)程序</
93、p><p> bit ERROR=1; //輸入字符錯(cuò)誤標(biāo)志位</p><p> bit result=0; //輸入結(jié)果對(duì)錯(cuò)的標(biāo)志位,為0是正確</p><p> bit verify=1;//已按了確認(rèn)鍵后清零</p><p> sb
94、it ERR=P2^7;</p><p> uchar correctNUM; //統(tǒng)計(jì)測(cè)試正確的單詞數(shù),即得分</p><p> /*****************************************</p><p> /** 存儲(chǔ)要測(cè)試的單詞,放在ROM中</p><p> /****
95、************************************/</p><p> uchar code S[10][5]={ "tree ", //樹</p><p> "rain ", //雨</p><p> "water", //水<
96、/p><p> "fly ", //飛</p><p> "go ", //去</p><p> "fish ", //魚</p><p> "snow ", //雪</p><p> "eat
97、", //吃</p><p> "rice ", //米</p><p> "ice ", //冰</p><p><b> } ;</b></p><p> uchar code SL[10]={4,4,5,3,2,4,4,3,4,3};/
98、/存儲(chǔ)各測(cè)試單詞的長(zhǎng)度</p><p> uchar KeyNum[8]; //儲(chǔ)存輸入的單詞</p><p> /*****************************************</p><p> /** 存儲(chǔ)鍵盤的字母值 ,放在ROM中</p><p> /********************
99、********************/</p><p> uchar code tab1[6][5]={{'a','b','c','d','e'},</p><p> {'f','g','h','i','j'},</p
100、><p> {'k','l','m','n','o'},</p><p> {'p','q','r','s','t'},</p><p> {'u','v','w
101、39;,'x','y'},</p><p> {'z',1,2,3,4}}; </p><p> //最后的 1234 鍵盤值為功能鍵, 1表示確定鍵,2表示不認(rèn)識(shí),3表示上一個(gè),4表示下一個(gè) </p><p> /**************************************
102、***********</p><p><b> ** 鍵盤掃描程序</b></p><p> *************************************************/</p><p> unsigned char kbscan() //鍵盤掃描</p><p><
103、;b> {</b></p><p> uchar hang,lie,key; //P1連行,P3連列</p><p> if(P1!=0xFF||P3!=0)</p><p><b> {</b></p><p> switch(P1&0xFF) //P1 掃
104、行</p><p><b> {</b></p><p> case 0xFE:hang=5;break;//P1.0為第6行</p><p> case 0xFD:hang=4;break;//P1.1為第5行</p><p> case 0xFB:hang=3;break;//P1.2為第4行</p&g
105、t;<p> case 0xF7:hang=2;break;//P1.3為第3行</p><p> case 0xEF:hang=1;break;//P1.4為第2行</p><p> case 0xDF:hang=0;break;//P1.5為第1行</p><p><b> }</b></p><p
106、> P1=0; //P1全低電平 </p><p> P3=0xFF;//P3全高電平</p><p> switch(P3&0xFF)</p><p><b> {</b></p><p> case 0xFE:lie=4;break; //P1.0為第5列</p><p
107、> case 0xFD:lie=3;break; //P0.5為第4列</p><p> case 0xFB:lie=2;break; //P0.6為第3列</p><p> case 0xF7:lie=1;break; //P0.7為第2列</p><p> case 0xEF:lie=0;break; //P0.7為第1列</p>&
108、lt;p><b> }</b></p><p> P1=0xFF; //P1全高電平 </p><p> P3=0; //P3全低電平</p><p> while(P1!=0xFF||P3!=0); //按鍵松開后才返回值</p><p> key=tab1[hang][lie];</p&
109、gt;<p><b> }</b></p><p><b> else</b></p><p><b> key='_';</b></p><p> return (key);</p><p><b> }</b>&
110、lt;/p><p> /************************************************************************</p><p> /** 主函數(shù)</p><p><b> /** </b></p><p><b> /** </
111、b></p><p> /*************************************************************************/</p><p> void main(void)</p><p><b> { </b></p><p> uchar hz_N
112、um; //用于計(jì)當(dāng)前測(cè)試的是第幾個(gè)詞,第一個(gè)為0</p><p> uchar temp[8]; //用于送液晶屏顯示的臨時(shí)變量</p><p> uchar iword=0,Nword=0; //輸入單詞字母下一個(gè)計(jì)數(shù)</p><p>
113、 LCD12864_init(); //LCD12864初始化</p><p> ClearLCD();//清屏</p><p> en_disp(2,1,11,Asc,"INPUT WORD:",1); //在第2行 第1列</p><p> en_disp(4,1,1,Asc,">&quo
114、t;,1); //在第5行,第2列開始顯示</p><p> en_disp(6,0,8,Asc,"correct:",1); //在第7行,第1列開始顯示</p><p> en_disp(6,80,5,Asc,"00/10",1); //在第7行 第81列</p>
115、;<p> P1=0xFF; //P1全高電平 </p><p> P3=0; //P3全低電平</p><p><b> while(1)</b></p><p><b> {</b></p><p> KeyNum[iword]=kbscan(); //掃描
116、鍵盤的輸入值,沒按下時(shí)返回下橫線</p><p> hz_disp(0,48,1,hz1+hz_Num*32,1); //在第1行,第49列開始顯示測(cè)試的漢字</p><p> temp[0]=(hz_Num+1)/10+0x30; //將十進(jìn)制數(shù)轉(zhuǎn)換為ASCII字符</p><p> temp[1]=(hz_Num+1)%10+0x30;
117、//算出測(cè)試漢字的序號(hào)的第一位和第二位</p><p> en_disp(0,20,1,Asc,":",1); //在第1行 第21列 </p><p> en_disp(0,4,2,Asc,temp,1); //在第1行 第5列顯示測(cè)試序號(hào) </p><p> if(KeyNum[iword]!='
118、_') //鍵盤有按鍵按下</p><p><b> {</b></p><p> if(KeyNum[iword]==1) //如果按下了確定鍵</p><p><b> {</b></p><p> if(SL[h
119、z_Num]==iword&&verify) //輸入長(zhǎng)度等于測(cè)試單詞的長(zhǎng)度,則正確 ,verify表示按下了確認(rèn)后有效一次</p><p><b> {</b></p><p> correctNUM+=1;</p><p> if(correctNUM>10)</p><p><
120、b> {</b></p><p> correctNUM=10; //最多10個(gè)正確的</p><p><b> }</b></p><p> verify=0; //標(biāo)志位清零</p><p> hz_Num++;
121、 //測(cè)試下一個(gè)單詞</p><p> if(hz_Num==10) hz_Num=0; //最多設(shè)10個(gè)單詞</p><p> temp[0]=(correctNUM)/10+0x30; //將十進(jìn)制數(shù)轉(zhuǎn)換為ASCII字符</p><p> temp[1]=(correctNUM)
122、%10+0x30; //算出測(cè)試漢字的序號(hào)的第一位和第二位</p><p> en_disp(6,80,2,Asc,temp,1); //在第7行 第81列</p><p><b> iword=0;</b></p><p><b> Nword=0;</b></p>
123、<p> en_disp(4,16,8,Asc," ",1); //在第5行,第17列開始顯示 </p><p><b> }</b></p><p><b> }</b></p><p> else if(KeyNum[iword]==2||Key
124、Num[iword]==4)//如果按下了“不認(rèn)識(shí)”或“下一個(gè)”鍵 ,直接跳到下一個(gè)單詞</p><p><b> {</b></p><p> result=0; //跳下一個(gè)時(shí)錯(cuò)誤燈滅</p><p><b> ERROR=0;</b></p><p> hz_Num++;
125、 //測(cè)試下一個(gè)單詞</p><p> if(hz_Num==10) hz_Num=0; //最多設(shè)10個(gè)單詞</p><p><b> iword=0;</b></p><p><b> Nword=0;</b></p>
126、<p> en_disp(4,16,8,Asc," ",1); //在第5行,第17列開始顯示 </p><p><b> }</b></p><p> else if(KeyNum[iword]==3) //如果按下了“上一個(gè)”鍵 ,直接跳到上一個(gè)單詞</p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于單片機(jī)的單詞記憶測(cè)試器設(shè)計(jì)
- 單片機(jī)單詞記憶測(cè)試器課程設(shè)計(jì)
- 基于單片機(jī)的畢業(yè)論文-- 基于51單片機(jī)的搶答器設(shè)計(jì)
- 基于單片機(jī)的畢業(yè)論文-- 基于51單片機(jī)的搶答器設(shè)計(jì)
- 基于單片機(jī)的搶答器設(shè)計(jì)【畢業(yè)論文】
- 基于單片機(jī)的搶答器設(shè)計(jì)畢業(yè)論文
- 基于單片機(jī)的搶答器設(shè)計(jì)畢業(yè)論文
- 基于單片機(jī)的搶答器設(shè)計(jì)畢業(yè)論文
- 課程設(shè)計(jì)單詞記憶測(cè)試器程序設(shè)計(jì)
- 基于單片機(jī)的搶答器設(shè)計(jì)畢業(yè)論文
- 基于單片機(jī)的語音播報(bào)器設(shè)計(jì)【畢業(yè)論文】
- 畢業(yè)論文--基于單片機(jī)的搶答器的設(shè)計(jì)
- 基于單片機(jī)酒精濃度測(cè)試畢業(yè)論文
- 基于單片機(jī)的gps定位器設(shè)計(jì)-畢業(yè)論文
- 基于單片機(jī)技術(shù)的汽車限速器設(shè)計(jì)畢業(yè)論文
- 基于單片機(jī)的gps語音播報(bào)器設(shè)計(jì)【畢業(yè)論文】
- 畢業(yè)論文-基于單片機(jī)的電器遙控器設(shè)計(jì)
- 基于單片機(jī)的信號(hào)發(fā)生器設(shè)計(jì)-畢業(yè)論文
- 畢業(yè)論文基于單片機(jī)的時(shí)鐘設(shè)計(jì)
- 單片機(jī)基于at89s52單片機(jī)的遙控器設(shè)計(jì)畢業(yè)論文
評(píng)論
0/150
提交評(píng)論