西電自動(dòng)化單片機(jī)實(shí)驗(yàn)報(bào)告.doc_第1頁
西電自動(dòng)化單片機(jī)實(shí)驗(yàn)報(bào)告.doc_第2頁
西電自動(dòng)化單片機(jī)實(shí)驗(yàn)報(bào)告.doc_第3頁
西電自動(dòng)化單片機(jī)實(shí)驗(yàn)報(bào)告.doc_第4頁
西電自動(dòng)化單片機(jī)實(shí)驗(yàn)報(bào)告.doc_第5頁
已閱讀5頁,還剩62頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

單片機(jī)實(shí)驗(yàn)報(bào)告 班級(jí):1304031 學(xué)號(hào): 姓名: 實(shí)驗(yàn)一:數(shù)碼管實(shí)驗(yàn)一實(shí)驗(yàn)?zāi)康?.了解數(shù)碼管的顯示原理;2.掌握J(rèn)XARM9-2440 中數(shù)碼管顯示編程方法。二實(shí)驗(yàn)原理7段LED由7個(gè)發(fā)光二極管按“日”字形排列,所有發(fā)光二極管的陽極連在一起稱共陽極接法,陰極連在一起稱為共陰極接法。LED顯示器的接口一般有靜態(tài)顯示與動(dòng)態(tài)顯示接口兩種方式。本實(shí)驗(yàn)中采用的是動(dòng)態(tài)顯示接口,其中數(shù)碼管掃描控制地址為0x20007000,位0位5每位分別對(duì)應(yīng)一個(gè)數(shù)碼管,將其中某位清0 來選擇相應(yīng)的數(shù)碼管,地址0x20006000 為數(shù)碼管的數(shù)據(jù)寄存器。數(shù)碼管采用共陽方式,向該地址寫一個(gè)數(shù)據(jù)就可以控制LED 的顯示,其原理圖如圖所示。三實(shí)驗(yàn)內(nèi)容及步驟1、六個(gè)數(shù)碼管同時(shí)正向顯示0-F ,然后反向顯示F-0。1) 參照模板工程leddemo(modulesleddemoleddemo.apj),添加相應(yīng)的文件,并修改led 的工程設(shè)置;2) 創(chuàng)建led.c 并加入到工程led 中;3) 編寫LED 顯示函數(shù)void led_display(void),正向顯示0-F 然后反向顯示F-0,并循環(huán)執(zhí)行以上動(dòng)作,在每次顯示之間延時(shí)一段時(shí)間;4) 編譯led,成功后,下載并運(yùn)行,觀察結(jié)果。2、在六個(gè)數(shù)碼管上依次顯示“HELLO”,可分辨出輪流顯示。步驟同上。3、在六個(gè)數(shù)碼管上依次顯示“HELLO”,分辨不出輪流顯示。步驟同上。4、在每個(gè)數(shù)碼管上遞增顯示0-9 。步驟同上。四實(shí)驗(yàn)程序1、./*/*文件名稱: LEDSEG7.C */*實(shí)驗(yàn)現(xiàn)象: 數(shù)碼管依次顯示出0、1,2、9、a、b、C、d、E、F */*/#define U8 unsigned charunsigned char seg7table16 = /* 0 1 2 3 4 5 6 7*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, /* 8 9 A B C D E F*/ 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,;void Delay(int time);/*/* 函數(shù)說明: JXARM9-2410 7段構(gòu)共陽數(shù)碼管測(cè)試 */* 功能描述: 依次在7段數(shù)碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數(shù)說明: 無 */*/void Test_Seg7(void) int i; *(U8*)0x20007000)=0x00; /*六個(gè)數(shù)碼管都亮*/ for( ; ;)for(i=0;i=0x0;i-) /*數(shù)碼管從F到0依次顯示出來*/ *(U8*)0x20006000)=seg7tablei; Delay(1000);/ TODO /*/* Function name : 循環(huán)延時(shí)子程序 */* Description : 循環(huán) time 次 */* Return type :void */* Argument : 循環(huán)延時(shí)計(jì)數(shù)器 */*/void Delay(int time) int i;int delayLoopCount=1000; for(;time0;time-);for(i=0;i0;time-);for(i=0;i0;time-);for(i=0;idelayLoopCount;i+);實(shí)驗(yàn)結(jié)果:數(shù)碼管上顯示HELLO,幾乎無延遲,同時(shí)顯示。4./*/*文件名稱: LEDSEG7.C */*實(shí)驗(yàn)現(xiàn)象: 數(shù)碼管依次顯示出0、1,2、9、a、b、C、d、E、F */*/#define U8 unsigned charunsigned char seg7table10= /*0,1,2,3,4,5,6,7,8,9*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,0x80, 0x90;void Delay(int time);/*/* 函數(shù)說明: JXARM9-2410 7段構(gòu)共陽數(shù)碼管測(cè)試 */* 功能描述: 依次在7段數(shù)碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數(shù)說明: 無 */*/void Test_Seg7(void) int i; for( ; ;) *(U8*)0x20007000)=0x3E; for(i=0;i0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x3D; for(i=0;i0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x3B; for(i=0;i0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x37; for(i=0;i0x0A;i+) *(U8*)0x20006000)=seg7tablei; Delay(5000); *(U8*)0x20007000)=0x2F; for(i=0;i0;time-);for(i=0;idelayLoopCount;i+);五結(jié)果及分析1六個(gè)數(shù)碼管同時(shí)顯示,從0F,接著從F0反向顯示。分析:通過地址20007000選擇哪個(gè)數(shù)碼管亮,通過地址20006000決定數(shù)碼管輸出的內(nèi)容。再通過循環(huán)可完成輪流顯示。2可分辨出:從數(shù)碼管的右邊至左邊依次顯示hello分辨不出:數(shù)碼管上顯示hello。分析:由于改變了Delay的數(shù)值,導(dǎo)致頻率變化,所以可以產(chǎn)生兩種效果。3每個(gè)數(shù)碼管遞增顯示09。分析:原理同一,靠循環(huán)實(shí)現(xiàn)。六實(shí)驗(yàn)總結(jié)1.由于數(shù)碼管為共陽極,小數(shù)點(diǎn)為最高位,A為最低位,所以顯示內(nèi)容一定要計(jì)算正確。2.循環(huán)條件要選擇正確。 實(shí)驗(yàn)二:鍵盤輸入實(shí)驗(yàn)一實(shí)驗(yàn)?zāi)康?、學(xué)習(xí)鍵盤驅(qū)動(dòng)原理;2、掌握通過CPU的I/O擴(kuò)展鍵盤的方法。二實(shí)驗(yàn)原理鍵盤實(shí)現(xiàn)方案采用專門的芯片實(shí)現(xiàn)鍵盤掃描采用軟件實(shí)現(xiàn)鍵盤掃描軟鍵盤實(shí)現(xiàn)方案當(dāng)開關(guān)打開時(shí),通過處理器的I/O 口的一個(gè)上拉電阻提供邏輯1;當(dāng)開關(guān)閉合時(shí),處理器的I/O 口的輸入將被拉低到邏輯0。矩陣鍵盤電路一個(gè)瞬時(shí)接觸開關(guān)(按鈕)放置在每一行與每一列的交叉點(diǎn)。每一行由一個(gè)輸出端口的一位驅(qū)動(dòng),每一列由一個(gè)電阻器上拉且供給輸入端口一位。鍵盤掃描過程就是讓微處理器按有規(guī)律的時(shí)間間隔查看鍵盤矩陣,以確定是否有鍵被按下一旦處理器判定有一個(gè)鍵按下,鍵盤掃描軟件將過濾掉抖動(dòng)并且判定哪個(gè)鍵被按下每個(gè)鍵被分配一個(gè)稱為掃描碼的唯一標(biāo)識(shí)符。應(yīng)用程序利用該掃描碼,根據(jù)按下的鍵來判定應(yīng)該采取什么行動(dòng),換句話說,掃描碼將告訴應(yīng)用程序按下哪個(gè)鍵鍵盤掃描算法初始化:所有的行(輸出端口)被強(qiáng)行設(shè)置為低電平在沒有任何鍵按下時(shí),所有的列(輸入端口)將讀到高電平。任何鍵的閉合將造成其中的一列變?yōu)榈碗娖健R坏z測(cè)到有鍵被按下,就需要找出是哪一個(gè)鍵。過程很簡(jiǎn)單,微處理器只需在其中一行上輸出一個(gè)低電平。如果它在輸入端口上發(fā)現(xiàn)一個(gè)0值,微處理器就知道在所選擇行上產(chǎn)生了鍵的閉合三、實(shí)驗(yàn)內(nèi)容及步驟(一)學(xué)習(xí)與分析例程中的各個(gè)程序以及主要函數(shù),以進(jìn)一步理解鍵盤的工作原理。(二)獲取按鍵值,在串口顯示。(三)使按鍵按照如圖的順序顯示出來。(四)將鍵盤按鍵值在數(shù)碼管上顯示?;蜃孕虚_發(fā)。四實(shí)驗(yàn)程序:1./* 包含文件 */#include def.h#include 2410lib.h#include option.h#include 2410addr.h#include interrupt.h/*/ Function name: Main/ Description : JXARM9-2410 鍵盤實(shí)驗(yàn)主程序/ 實(shí)現(xiàn)功能:/ Return type: void/ Argument : void*/void Main(void)/* 配置系統(tǒng)時(shí)鐘 */ ChangeClockDivider(2,1); U32 mpll_val = 0 ; mpll_val = (9212)|(112)&0xff, (mpll_val4)&0x3f, mpll_val&3); /* 初始化端口 */ Port_Init(); /* 初始化串口 */ Uart_Init(0,115200); Uart_Select(0); /* 打印提示信息 */PRINTF(n-鍵盤測(cè)試程序-n);PRINTF(n請(qǐng)將UART0與PC串口進(jìn)行連接,然后啟動(dòng)超級(jí)終端程序(115200, 8, N, 1)n); /* 開始回環(huán)測(cè)試 */while(1)unsigned char ch;ch=Key_GetKeyPoll();/ TODO / 獲取鍵值if(ch != 0) PRINTF(r%c鍵按下, ch);實(shí)驗(yàn)結(jié)果:在小鍵盤上按鍵,串口上顯示按鍵對(duì)應(yīng)字符,如按0,串口上顯示0。2.在庫函數(shù)中改變?nèi)缦碌膋ey按鍵值,使對(duì)應(yīng)于鍵盤上的位置#include #include 2410addr.h#include 2410lib.h#include timer.h#include interrupt.h#define RECV_CMD_MAX_BUF 2048char recv_bufRECV_CMD_MAX_BUF;int recv_read = 0;int recv_write = 0;char key_recv_bufRECV_CMD_MAX_BUF;int key_recv_read = 0;int key_recv_write = 0;/ 鍵盤掃描int timer1_count = 0;enum KEYBOARD_SCAN_STATUSKEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_SECOND,KEYBOARD_SCAN_THIRD,KEYBOARD_SCAN_FOURTH;int row = 0;extern unsigned char output_0x10000000;unsigned char ascii_key, input_key4, input_key14, key_mask = 0x0F;unsigned char*keyboard_port_scan = (unsigned char*)0x2000C000;unsigned char*keyboard_port_value = (unsigned char*)0x2000C000;int keyboard_scan_status4 = KEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_FIRST ;char key_get_char(int row, int col)char key = 0;switch( row )case 0:if(col & 0x01) = 0) key = D; else if(col & 0x02) = 0) key = E; else if(col & 0x04) = 0) key = F; else if(col & 0x08) = 0) key = 0; break;case 1:if(col & 0x01) = 0) key = C; else if(col & 0x02) = 0) key = 7; else if(col & 0x04) = 0) key = 4;else if(col & 0x08) = 0) key = 1;break;case 2:if(col & 0x01) = 0) key = B; else if(col & 0x02) = 0) key = 8; else if(col & 0x04) = 0) key = 5; else if(col & 0x08) = 0) key = 2; break;case 3:if(col & 0x01) = 0) key = A; else if(col & 0x02) = 0) key = 9; else if(col & 0x04) = 0) key = 6; else if(col & 0x08) = 0) key = 3; break;default:break;return key;/*/ Function name: recv_key/ Description : 將獲取的鍵值加入按鍵緩沖區(qū)/ Return type: void/ Argument : int key*/void recv_key(int key)key_recv_bufkey_recv_write = key;key_recv_write +;if(key_recv_write = RECV_CMD_MAX_BUF)key_recv_write = 0;if(key_recv_write = key_recv_read)/ 緩沖區(qū)以滿key_recv_read +;if(key_recv_read = RECV_CMD_MAX_BUF)key_recv_read = 0;/*/ Function name: Kbd_Scan/ Description : 定時(shí)器1中斷服務(wù)程序,用于掃描鍵盤,每隔10ms一次中斷/ Return type: void/ Argument : void*/void Kbd_Scan(void)int loopcnt = row, bexit = 0;int temp;/ 鍵盤掃描for( loopcnt = row; loopcnt = 4)temp = loopcnt - 4;elsetemp = loopcnt;switch(keyboard_scan_statustemp)case KEYBOARD_SCAN_FIRST:*keyboard_port_scan = output_0x10000000 & (0x00000001temp); /*將row列置低電平*/keyboard_scan_statustemp = KEYBOARD_SCAN_SECOND;bexit = 1;break;case KEYBOARD_SCAN_SECOND:input_keytemp = (*keyboard_port_value) & key_mask;/*并獲取第一次掃描值*/if(input_keytemp = key_mask)keyboard_scan_statustemp = KEYBOARD_SCAN_FIRST;/* 沒有按鍵,回到開始狀態(tài)*/elsekeyboard_scan_statustemp = KEYBOARD_SCAN_THIRD;/* 有按鍵*/bexit = 1;break;case KEYBOARD_SCAN_THIRD:if (*keyboard_port_value) & key_mask) != input_keytemp) keyboard_scan_statustemp = KEYBOARD_SCAN_FIRST;elseascii_key = key_get_char(temp, input_keytemp);keyboard_scan_statustemp = KEYBOARD_SCAN_FOURTH;*keyboard_port_scan = output_0x10000000 & (0x00000001temp); /*將row列置低電平*/bexit = 1;break;case KEYBOARD_SCAN_FOURTH:input_key1temp = (*keyboard_port_value) & key_mask;/*并獲取第一次掃描值*/if(input_key1temp = key_mask)/ get a keyrecv_key(ascii_key);keyboard_scan_statustemp = KEYBOARD_SCAN_FIRST;else*keyboard_port_scan = output_0x10000000 & (0x00000001= RECV_CMD_MAX_BUF)key_recv_read = 0;return ch;/*/ Function name: Key_GetKeyPoll(查詢方式)/ Description : 如果有鍵按下返回鍵,否則返回0/ Return type: char/ Argument : */char Key_GetKeyPoll()int row;unsigned char ascii_key, input_key, input_key1, key_mask = 0x0F;for( row = 0; row 4; row+)*keyboard_port_scan = output_0x10000000 & (0x00000001row); /*將row列置低電平*/Delay(3);/*延時(shí)*/input_key = (*keyboard_port_value) & key_mask;/*并獲取第一次掃描值*/if(input_key = key_mask)continue;/* 沒有按鍵*/* 延時(shí),再次獲取掃描值,如果兩次的值不等,則認(rèn)為是一個(gè)干擾*/Delay(3);if (*keyboard_port_value) & key_mask) != input_key) continue;/ 等待按鍵松開while(1)*keyboard_port_scan = output_0x10000000 & (0x00000001row); /*將row列置低電平*/Delay(3);input_key1 = (*keyboard_port_value) & key_mask;/*并獲取第一次掃描值*/if(input_key1 = key_mask)break;/* 沒有按鍵*/ascii_key = key_get_char(row, input_key);/* 查表*/return ascii_key;/* 顯示結(jié)果*/return 0;實(shí)驗(yàn)結(jié)果:按下鍵盤的按鍵串口會(huì)按題圖中所示對(duì)應(yīng)顯示3./* 包含文件 */#include def.h#include 2410lib.h#include option.h#include 2410addr.h#include interrupt.h#include #include #define IIRNUMBER 2#define U8 unsigned charunsigned char table16 = /* 0 1 2 3 4 5 6 7*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, /* 8 9 A B C D E F*/ 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,;/*/ Function name: Main/ Description : JXARM9-2440 鍵盤實(shí)驗(yàn)主程序/ 實(shí)現(xiàn)功能:/ Return type: void/ Argument : void*/void Main(void)/* 配置系統(tǒng)時(shí)鐘 */ ChangeClockDivider(2,1); U32 mpll_val = 0 ; mpll_val = (9212)|(112)&0xff, (mpll_val4)&0x3f, mpll_val&3); /* 初始化端口 */ Port_Init(); /* 初始化串口 */ Uart_Init(0,115200); Uart_Select(0); /* 打印提示信息 */PRINTF(n-鍵盤測(cè)試程序-n);PRINTF(n請(qǐng)將UART0與PC串口進(jìn)行連接,然后啟動(dòng)超級(jí)終端程序(115200, 8, N, 1)n);/*(unsigned long int *)0x48000000) = 0x22111120;*(unsigned long int

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論