嵌入式課程設(shè)計報告_第1頁
嵌入式課程設(shè)計報告_第2頁
嵌入式課程設(shè)計報告_第3頁
嵌入式課程設(shè)計報告_第4頁
嵌入式課程設(shè)計報告_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 嵌入式課程設(shè)計報告 設(shè)計題目:電子密碼鎖 、 摘要 隨著科技和人們的生活水平的提高,實現(xiàn)防盜的問題也變得尤為突出,傳統(tǒng)機械鎖構(gòu)造簡單,電子鎖的保密性高,使用靈活性好。根據(jù)需要設(shè)計運用w90p170開發(fā)板,制作一款電子密碼鎖,密碼鎖通過鍵盤輸入密碼,通過在lcd的文字和圖片顯示當前密碼鎖的狀態(tài)。實現(xiàn)設(shè)置密碼,密碼驗證,錯誤密碼自鎖、圖片顯示的功能。目錄一、選題意義及系統(tǒng)功能3二、硬件設(shè)計及描述4三、軟件設(shè)計及描述5四、程序代碼6五、課程設(shè)計體會11六、運行結(jié)果12七、心得體會12八、參考文獻13九、附錄131、 選題意義及功能描述1、選題意義電子密碼鎖是通過密碼輸入來控制電路或是芯片工作,從而

2、控制機械的開關(guān)閉合、開鎖的電子產(chǎn)品。隨著科技提高和人們生活水平的提高,對電子密碼鎖的需求增加。電子密碼做較傳統(tǒng)的機械鎖安全性能更高。特點如下:(1) 保密性好,編程量大,隨機開鎖的成功率幾乎為零。(2) 密碼可變,用戶可以隨時改變密碼,防止密碼被盜,同時也可以避免人員的更替而使鎖的密級下降。(3) 誤碼輸入保護,輸入密碼多次錯誤是,系統(tǒng)進行自鎖。(4) 無活動零件,不會磨損,壽命長。(5) 使用靈活性好,無需佩戴鑰匙,操作簡單。2、功能描述 基本功能: (1)從鍵盤輸入任意6位數(shù)字作為密碼,將這六位數(shù)字經(jīng)過usi總線存儲到flash芯片中,設(shè)置密碼完成。 (2)從鍵盤輸入密碼,比較鍵盤輸入的密

3、碼與flash中存儲的密碼是否相同。 (3)如果密碼正確,則led燈點亮;如果密碼不正確,則led燈閃爍,而且如果連續(xù)三次輸入密碼錯誤則系統(tǒng)鎖定,不允許再次輸入密碼。 擴展功能: (1)首先顯示“請輸入密碼:”,顯示密碼鎖背景圖片1。 (2)如果密碼正確則顯示“密碼正確”,顯示成功進入系統(tǒng)的背景圖片2。 (3)如果密碼不正確則顯示“密碼不正確,請重新輸入:” (4)如果連續(xù)三次輸入密碼錯誤則顯示“對不起,您已經(jīng)連續(xù)三次輸入密碼錯誤,系統(tǒng)鎖定”,顯示圖片1。3、個人開發(fā)流程 (1)了解開發(fā)板的硬件結(jié)構(gòu)編寫適應其硬件結(jié)構(gòu)的程序。 (2)掌握并編寫lcd顯示文本和圖片程序。 (3)通過ebi對外部l

4、ed燈進行控制。 (4)鍵盤鍵值讀取,及密碼鎖密碼比對,密碼鎖狀態(tài)轉(zhuǎn)換的程序編寫。 2、 硬件設(shè)計及描述1、led燈模塊cpu的數(shù)據(jù)總線低8位連接到鎖存器74hc273的信號輸入端,cpu外部總線接口(ebi)的necs0片選信號連接到鎖存器的鎖存控制信號,當cpu 訪問bank0的任一地址空間是,數(shù)據(jù)總線的低八位的數(shù)據(jù)被鎖存輸出,作為控制8個led等的發(fā)光狀態(tài)的控制信號,當寫入0xff是,8個led燈都滅,寫0x00,8個led燈都亮。硬件連接圖如下。 2、kpi工作模塊 行列式鍵盤以矩陣形式排列,每個鍵有一常開觸點,其兩端分別于輸出掃描線和輸入狀態(tài)線相連,鍵盤中有無鍵按下,是由列線掃描輸出

5、、讀入行線狀態(tài)來判斷。每個鍵都有一個鍵值和鍵號,通常將行、列按二進制順序組合成醬汁,經(jīng)過查表獲得鍵號。硬件連接圖如下 3、lcd工作模塊 該模塊由40個引腳與外界電路相連,由于本身沒有寄存器,需要w90p710提供的lcd控制寄存器來控制選擇對應的液晶類型及顯示形式,fifo的使用,顏色的顯示模式和時序的設(shè)置,并通過配置相應的寄存器就可實現(xiàn)。4、 軟件設(shè)計及描述 1、kpi模塊設(shè)計 實驗中的gpio為鍵盤模式,使用的是gpio_cfg2,查找相應的寄存器進行設(shè)置,打開鍵盤中斷,設(shè)定中斷觸發(fā)方式和優(yōu)先級,掃描功能打開,時間約為100ms。 2、lcd顯示模塊 初始化呢控制寄存器,設(shè)定lcd控制器

6、和中斷服務程序,并寫到aic中斷向量表中。關(guān)閉fifo1和fifo0,關(guān)閉綠的控制器,重置控制器,再講顯示的數(shù)據(jù)發(fā)送到緩存區(qū)中,根據(jù)時序的配置,從緩沖區(qū)中將數(shù)據(jù)讀入液晶。 3、整體模塊設(shè)計及程序流程圖 在主程序中進行按鍵初始化,在中斷程序中實現(xiàn),按鍵值的讀取和存儲,通過設(shè)定狀態(tài)標志位,數(shù)組。對存儲的密碼和輸入的密碼進行比較,判斷對錯從而改變狀態(tài)標志位,在中短結(jié)束,回到主程序后通過識別狀態(tài)標志位,顯示相應的圖形和文字。 5、 程序代碼(主要程序,函數(shù)部分見附錄)1、main.c#include #include 710defs.h /*頭文件聲明*/#include hb_it.h#includ

7、e main.h#include lcd_pattern.hextern u8 a6;extern int p;extern u32 keyvalue;int main(void) u32 fll; int cnt,i; u8 wchar= 設(shè)置密碼; u8 wchar1= 請輸密碼; u8 wchar2= 密碼正確; u8 wchar3= 密碼錯誤; u8 wchar4= 對不起,您已經(jīng)連續(xù)三次輸入密碼錯誤,系統(tǒng)鎖定; lcd_image_t lcd_size; /*聲明結(jié)構(gòu)體,結(jié)構(gòu)體的具體定義在頭文 lcd_location_t lcd_location; 件中*/ lcdshowpara

8、meter lsp; lcd_size.width = 480; /*定義lcd的顯示的長寬像素值*/ lcd_size.height = 240; lcd_location.startx = 0; /*設(shè)定顯示的起始坐標*/ lcd_location.starty = 0; lcd_location.endx = 960; lcd_location.endy = 240; lcdinit(); /*初始化*/ lcdshow(lcd_size, lcd_location); lcdfifobufferset(blackboard); /*將要顯示的圖片存入緩存中,以便顯示*/ lcddisp

9、layon(); /*顯示圖片*/ kpiinit(); /*按鍵初始化*/ printf(please press keys.n); /*并通過串口輸出此時的鍵值*/ usiinit(); /讀器件id /*初始化flash芯片*/ printf(讀器件id:); usiread_id(); /擦除扇區(qū)0 printf(寫使能:n); usiwriteenable(); while(usicheckbusy(); usisectorerease(0x0); ebiledinit(0x0); lsp.startx = 8; lsp.starty = 7; lsp.libplace = 0x40

10、0000; lsp.color = 0x07ff; lsp.letterchar = wchar1; lsp.lcdbuffer = blackboard; lcdoutputshow(lsp,4); ebiledset(0x00); while(1) if(p=6) lcdinit(); lcdshow(lcd_size, lcd_location); lcdfifobufferset(blackboard); lcddisplayon();lsp.startx = 8;lsp.starty = 7;lsp.libplace = 0x400000;lsp.color = 0x07ff;lsp

11、.letterchar = wchar1; /*正確密碼*/lsp.lcdbuffer = blackboard;lcdoutputshow(lsp,4);delay(10000000); if(p=1) lcdinit(); lcdshow(lcd_size, lcd_location); lcdfifobufferset(blackboard); lcddisplayon();lsp.startx = 5;lsp.starty = 5;lsp.libplace = 0x400000;lsp.color = 0x07ff;lsp.letterchar = wchar2; /*正確密碼*/ls

12、p.lcdbuffer = blackboard;lcdoutputshow(lsp,22);delay(10000000); if(p=2) lcdinit(); lcdshow(lcd_size, lcd_location); lcdfifobufferset(blackboard); lcddisplayon(); lsp.startx = 5; lsp.starty = 5; lsp.libplace = 0x400000; lsp.color = 0x07ff; lsp.letterchar = wchar3; /*密碼錯誤*/ lsp.lcdbuffer = blackboard;

13、lcdoutputshow(lsp,4);delay(10000000); if(p=3) lcdinit(); lcdshow(lcd_size, lcd_location); lcdfifobufferset(blackboard); lcddisplayon(); lsp.startx = 5;lsp.starty = 5;lsp.libplace = 0x400000;lsp.color = 0x07ff;lsp.letterchar = wchar4; /*請輸密碼*/lsp.lcdbuffer = blackboard;lcdoutputshow(lsp,22);delay(100

14、00000); return 0;2、 中斷服務程序 void kpi_handler(void)/ u32 keyvalue, tmp; int cnt,sum=0; /int shuru; /int i;tmp = reg_kpistatus; /取按鍵值tmp &= 0x0000000f; /因為硬件連接關(guān)系,需要對按鍵進行處理if(tmp 0x7) & (tmp 0x3) & (tmp 0x8)keyvalue = tmp + 4;elsekeyvalue = tmp;printf(kpi interrupts. %xn, keyvalue);if(c6 & c13) bc-7=key

15、value; /*輸入密碼*/ else if(c=13) usiread(0x0,a); /*將輸入密碼放入在flash芯片中存儲呢*/ for(cnt=0;cnt13 & c20) bc-14=keyvalue;/*繼續(xù)讀取密碼*/ else if(c=20)/*繼續(xù)比對密碼*/ usiread(0x0,a); for(cnt=0;cnt20 & c27) bc-21=keyvalue; else if(c=27)/*第三次比對*/ usiread(0x0,a); for(cnt=0;cnt6;cnt+) if(acnt=bcnt) sum+; if(sum=6) printf(測試成功.

16、%dn,sum); p=1; else printf(測試失敗.%dn,sum); p=4; else/*這之后程序不再允許進行輸入*/ printf(invalid operationsn); c+; 六、實驗結(jié)果截圖 (1)密碼鎖初始狀態(tài),顯示設(shè)置密碼,顯示圖片1。 (2)設(shè)置密碼后顯示,輸入密碼。 (3)當連續(xù)輸入錯誤的密碼,系統(tǒng)顯示密碼錯誤,并且鎖定系統(tǒng)。 (4)當輸入密碼正確時,顯示圖片2。七、課程設(shè)計體會 經(jīng)過這次課程設(shè)計,我對arm芯片有了更深入的理解,同時在操作w90p710這款芯片開發(fā)板的過程中提高了動手能力。掌握了ads集成開發(fā)環(huán)境及jtag仿真器的使用。通過實踐,不斷更改

17、調(diào)試程序的過程中,我對理論學習長得中斷源程序的編寫、gpio控制寄存器、中斷寄存器的控制、對庫函數(shù)的調(diào)用有了更好的理解和掌握。 同時也意識到自己的不足,學好匯編和c語言基礎(chǔ)是未來面向硬件編程的重要基礎(chǔ),在c語言部分,指針的知識與應用還需加強。本次課程設(shè)計的過程中體現(xiàn)出了arm系列芯片較傳統(tǒng)mcu的優(yōu)勢,接口豐富,內(nèi)部存儲資源更充裕。但是本次課設(shè)主要是運用了芯片偏向mcu的功能,并沒有在芯片中加載操作系統(tǒng)。arm系列的學習才剛剛開始,僅在入門階段,未來需要深入繼續(xù)學習嵌入式知識,使自己的技能更上一層樓。 八、參考文獻1張毅坤,陳善久,裘雪紅. 單片微型計算機原理及應用.西安電子科技大學出版社.2

18、008年5月2 華成英,童詩白. 模擬電子技術(shù)基礎(chǔ).高等教育出版社,2007年8月3 唐俊翟等 單片機原理與應用 冶金工業(yè)出版社, 2003.94 劉瑞新等 單片機原理及應用教程 機械工業(yè)出版社, 2003.75 吳國經(jīng)等 單片機應用技術(shù) 中國電力出版社, 2004.16 李全利,遲榮強編著 單片機原理及接口技術(shù) 高等教育出版社,2004.1九、附錄/* function name : lcdinit* description : lcd初始化* input : none* output : none* return : none*/void lcdinit(void) reg_gpio_cf

19、g6 = 0x555555; reg_lcd_lcdcon = 0x30c05; reg_lcd_fifo1prm = 0xa; reg_lcd_f1dreqcnt = 0x1e000f0; reg_lcd_fifo1relacolcnt = 0x1e0; /lcd clk reg_lcd_lcdtcon1 = 0x3b166; reg_lcd_lcdtcon2 = 0x3bf00f1; reg_lcd_lcdtcon3 = 0x105401; reg_lcd_lcdtcon4 = 0x20101; reg_lcd_lcdtcon5 = 0xe;/* function name : lcdsh

20、ow* description : 設(shè)置lcd顯示位置* input : none* output : none* return : none*/void lcdshow(lcd_image_t size, lcd_location_t location) reg_lcd_f1dreqcnt = (size.width 1); reg_lcd_dispwins = (location.starty 16) + location.startx; reg_lcd_dispwine = (location.endy 16) + location.endx;/* function name : lcd

21、fifobufferset* description : 指向lcd緩沖區(qū)存取圖像內(nèi)容* input : 數(shù)組名稱* output : none* return : none*/void lcdfifobufferset(puint8 buffer) reg_lcd_f1saddr = (u32) buffer;/* function name : lcddisplayon* description : 打開lcd* input : none* output : none* return : none*/void lcddisplayon(void) lcdioctl(1, 1, 0);/*

22、function name : lcddisplayoff* description : 關(guān)閉lcd* input : none* output : none* return : none*/void lcddisplayoff(void) lcdioctl(1, 2, 0);/* function name : delay* description : 用于不精確延時* input : 延時時間* output : none* return : none*/void delay(u32 t) do t-; while(t);/* function name : stringshow* des

23、cription : 顯示單個字符* input : lcd顯示字符相關(guān)信息* output : none* return : none*/void stringshow(lcdshowparameter lcdshowpara) /用于取漢字點陣圖 u32 offset = 0, length = 0; u8 pbuffer32 = 0; /用于將漢字點陣圖轉(zhuǎn)化為lcd顯示圖 u32 bitcounter = 8; /8 u32 bytecounter = 0; /32 u32 temp; u8 colorhigh, colorlow; /用于在lcd上顯示漢字 u32 x = 0, y =

24、 0, line = 0, row = 0; u8 lbuffer512 = 0; offset = (lcdshowpara.letterchar0-0xa1) * 0x5e + (lcdshowpara.letterchar1 - 0xa1) 5; for(length = 0; length 8); for(bytecounter = 0; bytecounter 32; bytecounter+) bitcounter = 8; temp = pbufferbytecounter; for(bitcounter = 0; bitcounter 8; bitcounter+) if(te

25、mp & 0x80) = 0x80) lbuffer(bytecounter 4) + (bitcounter 1) = colorhigh; lbuffer(bytecounter 4) + (bitcounter 1) + 1 = colorlow; else lbuffer(bytecounter 4) + (bitcounter 1) = 0x00; lbuffer(bytecounter 4) + (bitcounter 1) + 1 = 0x00; temp = 1; for(row = 0; row 16; row+) for(line = 0; line 32; line+)

26、x = (lcdshowpara.startx 5) + line; y = (lcdshowpara.starty 4)+ row; lcdshowpara.lcdbufferx + 960 * y = lbufferline + (row 5); /* function name : lcdoutputshow* description : 顯示多字符并自動換行* input : lcd顯示字符相關(guān)信息及字數(shù)* output : none* return : none*/void lcdoutputshow(lcdshowparameter lcdshowpara, u32 num) u3

27、2 temp; stringshow(lcdshowpara); for(temp=1; temp 29) lcdshowpara.starty = lcdshowpara.starty + 1; lcdshowpara.startx = 0; lcdshowpara.letterchar = &lcdshowpara.letterchar2; stringshow(lcdshowpara); /* function name : usiinit* description : 初始化usi,設(shè)置gpio口為usi模式,配置sclk串行時鐘* input : none* output : non

28、e* return : none*/void usiinit(void) reg_gpio_cfg5 = 0x000aa000; reg_usi_divider = 0x1; reg_usi_cntrl = 0x00000044; reg_usi_ssr=0x0;/* function name : usicheckbusy* description : 檢測flash狀態(tài)寄存器“忙”位* input : none* output : none* return : none*/u8 usicheckbusy(void) reg_usi_tx0 = 0x05; /讀狀態(tài)寄存器命令 reg_usi

29、_cntrl = 0x00000044; /發(fā)送8位reg_usi_ssr = 0x1;/cs=0reg_usi_cntrl = reg_usi_cntrl | 0x01;/啟動發(fā)送while(reg_usi_cntrl & 0x1);/判斷是否發(fā)送完成while(1)reg_usi_tx0 = 0xff;/發(fā)送ff提供接收時鐘,把狀態(tài)寄存器的數(shù)據(jù)讀回接收寄存器reg_usi_cntrl = 0x00000044;/發(fā)送8位reg_usi_ssr=0x1;/cs=0reg_usi_cntrl =reg_usi_cntrl|0x01;/啟動發(fā)送if(reg_usi_rx0 & 0xff) & 0

30、x01) != 0x01)/等待檢測狀態(tài)寄存器的忙狀態(tài)break;printf(busy=0x%xn,reg_usi_rx0); reg_usi_ssr=0x0; /cs=1 return 0;/* function name : usiwriteenable* description : 寫使能,在寫數(shù)據(jù)到flash存儲器或者擦除操作時前要加上寫使能* input : none* output : none* return : none*/void usiwriteenable(void)reg_usi_tx0 = 0x06;/寫使能命令reg_usi_cntrl = 0x00000044;

31、reg_usi_ssr = 0x1;/cs=0 reg_usi_cntrl = reg_usi_cntrl | 0x01;/啟動發(fā)送 while(reg_usi_cntrl & 0x1);/等待發(fā)送結(jié)束 reg_usi_ssr = 0x0;/cs=1/* function name : usiread* description : 從flash讀一個字節(jié)* input : none* output : none* return : none*/void usiread(u32 r_addr,u8 *read_buff)u32 read_cnt;u8 rx_temp;/傳送8位命令reg_usi

32、_tx0 = 0x03;/讀數(shù)據(jù)命令reg_usi_cntrl = 0x00000044;reg_usi_ssr = 0x1;reg_usi_cntrl = reg_usi_cntrl | 0x01;while(reg_usi_cntrl&0x1);/傳送24位地址reg_usi_tx0 = r_addr;reg_usi_cntrl = 0x000000c4;reg_usi_cntrl = reg_usi_cntrl | 0x01;while(reg_usi_cntrl & 0x1); /讀出flash某一頁的數(shù)據(jù)for(read_cnt = 0; read_cnt 6; read_cnt+)

33、reg_usi_tx0 = 0xff;reg_usi_cntrl = 0x00000044;reg_usi_cntrl = reg_usi_cntrl | 0x01;while(reg_usi_cntrl & 0x1);rx_temp=reg_usi_rx0;*(read_buff+) =rx_temp;printf(addresstt0x%x: tt%dn,read_cnt,rx_temp);reg_usi_ssr=0x0;printf(接收完成.n);/* function name : usiwrite * description : 向flash寫一個字節(jié)* input : none*

34、 output : none* return : none*/void usiwrite(u32 w_addr, u8 *w_buff) u16 write_cnt;/傳送8位命令reg_usi_tx0 = 0x02;/寫命令reg_usi_cntrl = 0x00000044;reg_usi_ssr = 0x1;reg_usi_cntrl = reg_usi_cntrl | 0x01;while(reg_usi_cntrl & 0x1);/傳送24位地址reg_usi_tx0 = w_addr;reg_usi_cntrl = 0x000000c4;reg_usi_cntrl = reg_us

35、i_cntrl | 0x01;while(reg_usi_cntrl & 0x1);/傳送8位數(shù)據(jù)for(write_cnt=0;write_cnt6;write_cnt+) reg_usi_tx0 = *(w_buff+);reg_usi_cntrl = 0x00000044;reg_usi_cntrl = reg_usi_cntrl | 0x01;while(reg_usi_cntrl & 0x1); reg_usi_ssr = 0x0;while(usicheckbusy(); /檢測是否寫完printf(寫數(shù)據(jù)完成.n);/* function name : usiread_id * description : 正確的id=0xef10* input : none* output

溫馨提示

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

評論

0/150

提交評論