西安電子科技大學(xué)單片機報告_第1頁
西安電子科技大學(xué)單片機報告_第2頁
西安電子科技大學(xué)單片機報告_第3頁
西安電子科技大學(xué)單片機報告_第4頁
西安電子科技大學(xué)單片機報告_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、-單片機實驗報告 班級: *: : 實驗一:數(shù)碼管實驗一實驗?zāi)康?.了解數(shù)碼管的顯示原理;2.掌握J*ARM9-2440 中數(shù)碼管顯示編程方法。二實驗原理7段LED由7個發(fā)光二極管按“日字形排列,所有發(fā)光二極管的陽極連在一起稱共陽極接法,陰極連在一起稱為共陰極接法。LED顯示器的接口一般有靜態(tài)顯示與動態(tài)顯示接口兩種方式。本實驗中采用的是動態(tài)顯示接口,其中數(shù)碼管掃描控制地址為0*20007000,位0位5每位分別對應(yīng)一個數(shù)碼管,將其中*位清0 來選擇相應(yīng)的數(shù)碼管,地址0*20006000 為數(shù)碼管的數(shù)據(jù)存放器。數(shù)碼管采用共陽方式,向該地址寫一個數(shù)據(jù)就可以控制LED 的顯示,其原理圖如下列圖。三實

2、驗容及步驟1、六個數(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í)行以上動作,在每次顯示之間延時一段時間;4 編譯led,成功后,下載并運行,觀察結(jié)果。2、在六個數(shù)碼管上依次顯示“HELLO,可分辨出輪流顯示。步驟同上。3、在六個數(shù)碼管上依次顯示“HELLO,分辨不出輪流顯示。步驟同上。4、在每個數(shù)碼管上遞增顯示

3、0-9 。步驟同上。四實驗程序1、./*/*文件名稱: LEDSEG7.C */*實驗現(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*/ 0*c0, 0*f9, 0*a4, 0*b0, 0*99, 0*92, 0*82, 0*f8, /* 8 9 A B C D E F*/ 0*80, 0*90, 0*88, 0*83, 0*c6, 0*a1, 0*86, 0*8e,;void Delay(int time);/*/* 函數(shù)說明:

4、J*ARM9-2410 7段構(gòu)共陽數(shù)碼管測試 */* 功能描述: 依次在7段數(shù)碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數(shù)說明: 無 */*/void Test_Seg7(void) int i; *(U8*)0*20007000)=0*00;/*六個數(shù)碼管都亮*/ for( ; ;)for(i=0;i<0*10;i+) /*數(shù)碼管從0到F依次顯示出來*/ *(U8*)0*20006000)=seg7tablei; Delay(1000);for(0*f;i>=0*0;i-)/*數(shù)碼管從F到0依次顯示出來*/ *(U8*)0*20006000)=

5、seg7tablei; Delay(1000);/ TODO /*/* Function name : 循環(huán)延時子程序 */* Description : 循環(huán) 'time' 次 */* Return type :void */* Argument : 循環(huán)延時計數(shù)器 */*/void Delay(int time) int i;int delayLoopCount=1000; for(;time>0;time-);for(i=0;i<delayLoopCount;i+);實驗結(jié)果:6個數(shù)碼管上一次顯示0,1,2F,然后從F到0循環(huán)。2./*/*文件名稱: LEDS

6、EG7.C */*實驗現(xiàn)象:數(shù)碼管依次顯示出0、1,2、9、a、b、C、d、E、F */*/*define U8 unsigned charunsigned char seg7table4= /*O L E H*/ 0*C0,0*C7,0*86,0*89;void Delay(int time);/*/* 函數(shù)說明: J*ARM9-2410 7段構(gòu)共陽數(shù)碼管測試 */* 功能描述: 依次在7段數(shù)碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數(shù)說明: 無 */*/void Test_Seg7(void) for( ; ;) *(U8*)0*20007000)=0*

7、3E; /*111110 *(U8*)0*20006000)=seg7table0; /第一個數(shù)碼管顯示O Delay(1000); *(U8*)0*20007000)=0*3D; /*111101 *(U8*)0*20006000)=seg7table1; /第二個數(shù)碼管顯示L Delay(1000); *(U8*)0*20007000)=0*3B; /*111011 *(U8*)0*20006000)=seg7table1; /第三個數(shù)碼管顯示L Delay(1000); *(U8*)0*20007000)=0*37; /*110111 *(U8*)0*20006000)=seg7tabl

8、e2; /第四個數(shù)碼管顯示E Delay(1000); *(U8*)0*20007000)=0*2F; /*101111 *(U8*)0*20006000)=seg7table3; /第五個數(shù)碼管顯示H Delay(1000); / TODO /*/* Function name : 循環(huán)延時子程序 */* Description : 循環(huán) 'time' 次 */* Return type :void */* Argument : 循環(huán)延時計數(shù)器 */*/void Delay(int time) int i;int delayLoopCount=1000; for(;time&

9、gt;0;time-);for(i=0;i<delayLoopCount;i+);實驗結(jié)果:從左到右一次顯示HELLO,之間有明顯延遲。3./*/*文件名稱: LEDSEG7.C */*實驗現(xiàn)象:數(shù)碼管依次顯示出0、1,2、9、a、b、C、d、E、F */*/*define U8 unsigned charunsigned char seg7table4= /*O L E H*/ 0*C0,0*C7,0*86,0*89;void Delay(int time);/*/* 函數(shù)說明: J*ARM9-2410 7段構(gòu)共陽數(shù)碼管測試 */* 功能描述: 依次在7段數(shù)碼管上顯示012345678

10、9ABCDEF */* 返回代碼: 無 */* 參數(shù)說明: 無 */*/void Test_Seg7(void) for( ; ;) *(U8*)0*20007000)=0*3E; /*111110 *(U8*)0*20006000)=seg7table0; /第一個數(shù)碼管顯示O Delay(5); *(U8*)0*20007000)=0*3D; /*111101 *(U8*)0*20006000)=seg7table1; /第二個數(shù)碼管顯示L Delay(5); *(U8*)0*20007000)=0*3B; /*111011 *(U8*)0*20006000)=seg7table1; /第

11、三個數(shù)碼管顯示LDelay(5); *(U8*)0*20007000)=0*37; /*110111 *(U8*)0*20006000)=seg7table2; /第四個數(shù)碼管顯示E Delay(5); *(U8*)0*20007000)=0*2F; /*101111 *(U8*)0*20006000)=seg7table3; /第五個數(shù)碼管顯示H Delay(5); / TODO /*/* Function name : 循環(huán)延時子程序 */* Description : 循環(huán) 'time' 次 */* Return type :void */* Argument : 循環(huán)延

12、時計數(shù)器 */*/void Delay(int time) int i;int delayLoopCount=5; for(;time>0;time-);for(i=0;i<delayLoopCount;i+);實驗結(jié)果:數(shù)碼管上顯示HELLO,幾乎無延遲,同時顯示。4./*/*文件名稱: LEDSEG7.C */*實驗現(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*/ 0*c0, 0*f9, 0*a4, 0*b0,

13、 0*99, 0*92, 0*82, 0*f8,0*80, 0*90;void Delay(int time);/*/* 函數(shù)說明: J*ARM9-2410 7段構(gòu)共陽數(shù)碼管測試 */* 功能描述: 依次在7段數(shù)碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數(shù)說明: 無 */*/void Test_Seg7(void) int i; for( ; ;) *(U8*)0*20007000)=0*3E; for(i=0;i<0*0A;i+) *(U8*)0*20006000)=seg7tablei; Delay(5000); *(U8*)0*20007000)

14、=0*3D; for(i=0;i<0*0A;i+) *(U8*)0*20006000)=seg7tablei; Delay(5000); *(U8*)0*20007000)=0*3B; for(i=0;i<0*0A;i+) *(U8*)0*20006000)=seg7tablei; Delay(5000); *(U8*)0*20007000)=0*37; for(i=0;i<0*0A;i+) *(U8*)0*20006000)=seg7tablei; Delay(5000); *(U8*)0*20007000)=0*2F; for(i=0;i<0*0A;i+) *(U8

15、*)0*20006000)=seg7tablei; Delay(5000); / TODO /*/* Function name : 循環(huán)延時子程序 */* Description : 循環(huán) 'time' 次 */* Return type :void */* Argument : 循環(huán)延時計數(shù)器 */*/void Delay(int time) int i;int delayLoopCount=10000; for(;time>0;time-);for(i=0;i<delayLoopCount;i+);五結(jié)果及分析1六個數(shù)碼管同時顯示,從0F,接著從F0反向顯示。

16、分析:通過地址20007000選擇哪個數(shù)碼管亮,通過地址20006000決定數(shù)碼管輸出的容。再通過循環(huán)可完成輪流顯示。2可分辨出:從數(shù)碼管的右邊至左邊依次顯示hello分辨不出:數(shù)碼管上顯示hello。分析:由于改變了Delay的數(shù)值,導(dǎo)致頻率變化,所以可以產(chǎn)生兩種效果。3每個數(shù)碼管遞增顯示09。分析:原理同一,靠循環(huán)實現(xiàn)。六實驗總結(jié)1.由于數(shù)碼管為共陽極,小數(shù)點為最高位,A為最低位,所以顯示容一定要計算正確。2.循環(huán)條件要選擇正確。 實驗二:鍵盤輸入實驗一實驗?zāi)康?、學(xué)習(xí)鍵盤驅(qū)動原理;2、掌握通過CPU的I/O擴展鍵盤的方法。二實驗原理鍵盤實現(xiàn)方案采用專門的芯片實現(xiàn)鍵盤掃描采用軟件實現(xiàn)鍵盤掃

17、描軟鍵盤實現(xiàn)方案當開關(guān)翻開時,通過處理器的I/O 口的一個上拉電阻提供邏輯1;當開關(guān)閉合時,處理器的I/O 口的輸入將被拉低到邏輯0。矩陣鍵盤電路一個瞬時接觸開關(guān)按鈕放置在每一行與每一列的穿插點。每一行由一個輸出端口的一位驅(qū)動,每一列由一個電阻器上拉且供給輸入端口一位。鍵盤掃描過程就是讓微處理器按有規(guī)律的時間間隔查看鍵盤矩陣,以確定是否有鍵被按下一旦處理器判定有一個鍵按下,鍵盤掃描軟件將過濾掉抖動并且判定哪個鍵被按下每個鍵被分配一個稱為掃描碼的唯一標識符。應(yīng)用程序利用該掃描碼,根據(jù)按下的鍵來判定應(yīng)該采取什么行動,換句話說,掃描碼將告訴應(yīng)用程序按下哪個鍵鍵盤掃描算法初始化:所有的行輸出端口被強行

18、設(shè)置為低電平在沒有任何鍵按下時,所有的列輸入端口將讀到高電平。任何鍵的閉合將造成其中的一列變?yōu)榈碗娖?。一旦檢測到有鍵被按下,就需要找出是哪一個鍵。過程很簡單,微處理器只需在其中一行上輸出一個低電平。如果它在輸入端口上發(fā)現(xiàn)一個0值,微處理器就知道在所選擇行上產(chǎn)生了鍵的閉合三、實驗容及步驟一學(xué)習(xí)與分析例程中的各個程序以及主要函數(shù),以進一步理解鍵盤的工作原理。二獲取按鍵值,在串口顯示。三使按鍵按照如圖的順序顯示出來。四將鍵盤按鍵值在數(shù)碼管上顯示?;蜃孕虚_發(fā)。四實驗程序:1./* 包含文件 */*include "def.h"*include "2410lib.h&quo

19、t;*include "option.h"*include "2410addr.h"*include "interrupt.h"/*/ Function name: Main/ Description : J*ARM9-2410 鍵盤實驗主程序/ 實現(xiàn)功能:/ Return type: void/ Argument : void*/void Main(void)/* 配置系統(tǒng)時鐘 */ ChangeClockDivider(2,1); U32 mpll_val = 0 ; mpll_val = (92<<12)|(1<

20、;<4)|(1); ChangeMPllValue(mpll_val>>12)&0*ff, (mpll_val>>4)&0*3f, mpll_val&3); /* 初始化端口 */ Port_Init(); /* 初始化串口 */ Uart_Init(0,115200); Uart_Select(0); /* 打印提示信息 */PRINTF("n-鍵盤測試程序-n");PRINTF("n請將UART0與PC串口進展連接,然后啟動超級終端程序(115200, 8, N, 1)n"); /* 開場回環(huán)測試

21、 */while(1)unsigned char ch;ch=Key_GetKeyPoll();/ TODO / 獲取鍵值if(ch != 0) PRINTF("r'%c'鍵按下", ch);實驗結(jié)果:在小鍵盤上按鍵,串口上顯示按鍵對應(yīng)字符,如按0,串口上顯示0。2.在庫函數(shù)中改變?nèi)缦碌膋ey按鍵值,使對應(yīng)于鍵盤上的位置char key_get_char(int row, int col)char key = 0;switch( row )case 0:if(col & 0*01) = 0) key = 'D' else if(col

22、 & 0*02) = 0) key = 'E' else if(col & 0*04) = 0) key = 'F' else if(col & 0*08) = 0) key = '0' break;case 1:if(col & 0*01) = 0) key = 'C' else if(col & 0*02) = 0) key = '7' else if(col & 0*04) = 0) key = '4'else if(col & 0*08

23、) = 0) key = '1'break;case 2:if(col & 0*01) = 0) key = 'B' else if(col & 0*02) = 0) key = '8' else if(col & 0*04) = 0) key = '5' else if(col & 0*08) = 0) key = '2' break;case 3:if(col & 0*01) = 0) key = 'A' else if(col & 0*02) =

24、 0) key = '9' else if(col & 0*04) = 0) key = '6' else if(col & 0*08) = 0) key = '3' break; 實驗結(jié)果:按下鍵盤的按鍵串口會按題圖中所示對應(yīng)顯示3./* 包含文件 */*include "def.h"*include "2410lib.h"*include "option.h"*include "2410addr.h"*include "interrupt

25、.h"*include <stdio.h> *include <math.h>*define IIRNUMBER 2*define U8 unsigned charunsigned char table16 = /* 0 1 2 3 4 5 6 7*/ 0*c0, 0*f9, 0*a4, 0*b0, 0*99, 0*92, 0*82, 0*f8, /* 8 9 A B C D E F*/ 0*80, 0*90, 0*88, 0*83, 0*c6, 0*a1, 0*86, 0*8e,;/*/ Function name: Main/ Description :

26、J*ARM9-2440 鍵盤實驗主程序/ 實現(xiàn)功能:/ Return type: void/ Argument : void*/void Main(void)/* 配置系統(tǒng)時鐘 */ ChangeClockDivider(2,1); U32 mpll_val = 0 ; mpll_val = (92<<12)|(1<<4)|(1); ChangeMPllValue(mpll_val>>12)&0*ff, (mpll_val>>4)&0*3f, mpll_val&3); /* 初始化端口 */ Port_Init(); /*

27、 初始化串口 */ Uart_Init(0,115200); Uart_Select(0); /* 打印提示信息 */PRINTF("n-鍵盤測試程序-n");PRINTF("n請將UART0與PC串口進展連接,然后啟動超級終端程序(115200, 8, N, 1)n");/*(unsigned long int *)0*48000000) = 0*22111120;*(unsigned long int *)0*4800000c) = 0*7ffc;while(1)*(unsigned short int *)0*10000000) = 0*0;for

28、(i=0;i<1000;i+);*(unsigned short int *)0*10000000) = 0*ffff;for(i=0;i<1000;i+);*/ /* 開場回環(huán)測試 */ int j=0,k=0; unsigned char table16 = 0*1F,0*2F,0*37,0*3B,0*3D,0*3E;while(1)unsigned char ch;ch = Key_GetKeyPoll();if(ch != 0) PRINTF("r'%c'鍵按下", ch);if(k<6) *(U8*) 0*20007000)=ta

29、ble1k;if(k=6) k=0;switch(ch)case '0':j=0; *(U8*) 0*20006000) = tablej; /Delay (20); k+; break;case '1':j=1; *(U8*) 0*20006000) = tablej; /Delay (20); k+; break;case '2':j=2; *(U8*) 0*20006000) = tablej; /Delay (20); k+; break;case '3':j=3; *(U8*) 0*20006000) = tablej;

30、 /Delay (20); k+; break;case '4':j=4;*(U8*) 0*20006000) = tablej;/Delay (20); k+; break; case '5':j=5;*(U8*) 0*20006000) = tablej;/Delay (20); k+; break;case '6':j=6;*(U8*) 0*20006000) = tablej; /Delay (20); k+; break;case '7':j=7; *(U8*) 0*20006000) = tablej; /Delay

31、(20); k+; break;case '8':j=8; *(U8*) 0*20006000) = tablej; /Delay (20); k+; break;case '9':j=9; *(U8*) 0*20006000) = tablej; /Delay (20); k+; break; case 'A':j=10; *(U8*) 0*20006000) = tablej; /Delay (20); k+; break;case 'B':j=11; *(U8*) 0*20006000) = tablej; /Delay (

32、20); k+; break;case 'C':j=12; *(U8*) 0*20006000) = tablej; /Delay (20); k+; break;case 'D':j=13; *(U8*) 0*20006000) = tablej; /Delay (20); k+; break;case 'E':j=14; *(U8*) 0*20006000) = tablej; /Delay (20); k+; break;case 'F':j=15; *(U8*) 0*20006000) = tablej; /Delay (

33、20); k+; break; default :break; /*/* Function name : 循環(huán)延時子程序 */* Description : 循環(huán) 'time' 次 */* Return type :void */* Argument : 循環(huán)延時計數(shù)器 */*/void Delay(int time) int i;int delayLoopCount=1000; for(;time>0;time-);for(i=0;i<delayLoopCount;i+);實驗結(jié)果:在鍵盤上按下按鍵,會顯示在數(shù)碼管上。 實驗三:中斷實驗一、實驗?zāi)康?1、了解中斷的

34、作用; 2、掌握嵌入式系統(tǒng)中斷的處理流程; 3、掌握ARM中斷編程。2、 實驗原理當CPU進展主程序操作時,外設(shè)的數(shù)據(jù)已存入輸入端口的數(shù)據(jù)存放器;或端口的數(shù)據(jù)輸出存放器已空,由外設(shè)通過接口電路向CPU發(fā)出中斷請求信號,CPU在滿足一定的條件下,暫停執(zhí)行當前正在執(zhí)行的主程序,轉(zhuǎn)入執(zhí)行相應(yīng)能夠進展輸入/輸出操作的子程序,待輸入/輸出操作執(zhí)行完畢之后CPU再返回并繼續(xù)執(zhí)行原來被中斷的主程序。這樣CPU就防止了把大量時間消耗在等待、查詢狀態(tài)信號的操作上,使其工作效率得以大提高。三、實驗容及步驟一學(xué)習(xí)例程,對其關(guān)鍵程序與設(shè)置進展分析。二編寫中斷處理程序,處理外部中斷2,3,控制LED燈閃爍或數(shù)碼管顯示。

35、1、當外部中斷2發(fā)生時,使8個LED在亮滅間切換;2、當外部中斷3發(fā)生時,使8個LED等依次亮一下。*3、當中斷發(fā)生時,控制數(shù)碼管顯示。4 試驗程序*include "def.h"*include "2410lib.h"*include "option.h"*include "2410addr.h"*include "interrupt.h"/* functions */void eint2_isr(void) _attribute_ (interrupt("IRQ");vo

36、id eint3_isr(void) _attribute_ (interrupt("IRQ");void delay();/* variables */int dither_count2 = 0;int dither_count3 = 0;static int nLed = 0;/*/ Function name: Main/ Description : J*ARM9-2410 中斷實驗主程序/ 完成功能:/ 外部中斷按鍵引發(fā)中斷/ Return type: void/ Argument : void*/void Main(void)/* 配置系統(tǒng)時鐘 */ChangeC

37、lockDivider(2,1); U32 mpll_val = 0 ; mpll_val = (92<<12)|(1<<4)|(1); ChangeMPllValue(mpll_val>>12)&0*ff, (mpll_val>>4)&0*3f, mpll_val&3); /* 中斷初始化 */ Isr_Init(); /* 初始化端口 */ Port_Init(); /* 初始化串口 */ Uart_Init(0,115200); Uart_Select(0); /* 打印提示信息 */PRINTF("n-外

38、部中斷測試程序-n");PRINTF("n請將UART0與PC串口進展連接,然后啟動超級終端程序(115200, 8, N, 1)n");PRINTF("n外部中斷測試開場n");/* 請求中斷 */Irq_Request(IRQ_EINT2, eint2_isr);/中斷選擇 /Irq_Request(IRQ_EINT3, eint3_isr); /* 使能中斷 */ Irq_Enable(IRQ_EINT2); /Irq_Enable(IRQ_EINT3); dither_count2 = 0; dither_count3 = 0; whi

39、le(1) delay(); dither_count2+; dither_count3+; /*/ Function name: eint2_isr/ Description : EINT2中斷處理程序/ Return type: int/ Argument : void*/void eint2_isr(void)Irq_Clear(IRQ_EINT2); if(dither_count2 > 10) dither_count2 = 0;(*(U8*)0*20007000)=0*0;/中斷發(fā)生時,數(shù)碼管顯示(*(U8*)0*20006000)=0*80;(*(U8*)0*20005000)=nLed;/LED亮滅切換nLed=nLed;/*/ Function name: eint3_isr/ Description : EINT3中斷處理程序/ Return type: int/ Argument : void*/void eint3_isr(void)Irq_Clear(IRQ_EINT3); if(dither_count3 > 10) dither_count3 = 0;(*(U8*)0*20007000)=0*0;/中斷發(fā)生時,數(shù)碼管顯示(*(U8*)0*20006000)=0*90;(*(U8*)0*20005000)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論