鍵盤、數碼管及串口間的通信實驗報告.doc

(12頁)

'鍵盤、數碼管及串口間的通信實驗報告.doc'
?《本科實驗報告》填寫說明1.學員完成人才培養方案和課程標準要所要求的每個實驗后,均須提交實驗報告。2.實驗報告封面必須打印,報告內容可以手寫或打印。3.實驗報告內容編排及打印應符合以下要求:(1)采用A4(21cm×29.7cm)白色復印紙,單面黑字打印。上下左右各側的頁邊距均為3cm;缺省文檔網格:字號為小4號,中文為宋體,英文和阿拉伯數字為Times New Roman,每頁30行,每行36字;頁腳距邊界為2.5cm,頁碼置于頁腳、居中,采用小5號阿拉伯數字從1開始連續編排,封面不編頁碼。(2)報告正文最多可設四級標題,字體均為黑體,第一級標題字號為4號,其余各級標題為小4號;標題序號第一級用“一、”、“二、”……,第二級用“(一)”、“(二)” ……,第三級用“1.”、“2.” ……,第四級用“(1)”、“(2)” ……,分別按序連續編排。(3)正文插圖、表格中的文字字號均為5號。一、實驗目的和要求1、熟悉定時器、鍵盤、數碼管及串口的工作原理;2、熟悉查詢或者中斷的概念和工作原理;3、能夠用匯編語言/C語言編寫相關程序。二、實驗內容和原理(一)實驗內容為: 1.鍵盤輸入+串口發送實驗,串口發送內容為鍵盤輸入鍵值,鍵值自行定義; 2.串口接收+數碼管顯示實驗,把串口接收的內容通過數碼管顯示出來。 (二)依據的原理:1. 根據實驗箱的硬件環境,單片機選為NXP公司的P89V51RD2(與80C51兼容),時鐘頻率為6.144MHz,串口處于工作方式1,波特率為2400bps。2. 按照要求編寫相應程序,采用Keil C51進行編譯,首先在集成開發環境上進行仿真,確保程序正確,然后下載到實驗箱上進行檢查。3. 單片機和微機都帶有符合RC232C的串口,利用實驗箱上的鍵盤、數碼管和串口進行通信實驗,進一步熟悉單片機的硬件、程序設計以及單片機系統開發流程。三、實驗項目(一) 實驗項目:鍵盤、數碼管及串口間的通信(二) 實驗原理:1. 初始化:啟動定時器0(用于更新數碼管的顯示與鍵盤掃描)、定時器1(用于串口與實驗箱通信),串口初始化,置各種值為0,中斷置1,開中斷2. 鍵盤 數碼管:當鍵盤按下后,與鍵盤相連的P0口發生變化,當檢測到這種變化時,將行、列的變化值用x,y記錄下來,經過轉換,可以得到鍵盤上的數字值,再通過與數碼管相連的P1、P2口顯示到數碼管上,這里,用P2控制位選,P1控制字形3. 鍵盤 PC機:自初始化置TI為1后,出發串口中斷循環執行,當發生按鍵時,不僅會在數碼管上顯示出來,而且會將send_ptr(發送標志位)設為1,此時,會將鍵值變換成ASCII碼后送給串口的SBUF,然后即可在串口調試助手的窗口中顯示出來4. PC機 數碼管:在串口調試助手的輸入窗口中輸入一串十六進制數字,串口串行地將數字送給SBUF,SBUF通過P1和P2口顯示到數碼管上四、實驗器材(一) 清華科教TMC-2實驗箱、USB轉串口電纜;(二) 華碩 F80c PC機及Win 7操作系統、Keil C51集成開發環境、FlashMagic、串口調試助手。五、操作方法與實驗步驟寫出實驗操作的總體思路、操作規范和主要注意事項;按順序記錄實驗中每一個環節和實驗現象。畫出必要的實驗裝置結構示意圖,并配以相應文字說明;(一) 總體思路:已在“實驗項目”中說明;(二) 操作規范和主要注意事項:我認為有這么幾點,一是芯片一定要放對位置;二是要分清陰極和陽極;三是線要接對;四是要正確配置好各種參數;五是要走正確的步驟。(三) 實驗環節及現象:1.編寫鍵盤、數碼管及串口通信程序,代碼在文檔的后面章節中;2.采用Keil C51集成開發環境進行編譯、仿真,生成hex文件;3.準備實驗箱運行環境,將實驗箱連接到PC機上,調試參數;4.將hex文件下載到實驗箱上,復位后,可以開始在鍵盤或PC機上操作。六、實驗數據七、實驗結果與分析發送123456877后,數碼管上出現456877六個數字,這說明串口是串行地將數字發送過去,并且會一位位向左移動,最后只留下6位數字。八、問題與建議這次實驗感覺比較難,要理解各種操作的原理、細節,而且實驗箱不同,做出來的效果不同,然后我覺得要多向教員、小教員或者同學請教,通過交流,能更深地理解原理之類的。我認為老師應該多給些輔助性的文檔,讓我們個人能鉆研地更深。九、源程序#includeunsigned char rec_buff; //接收緩存unsigned char key_ptr; //按鍵狀態標識unsigned char x,y; //鍵盤掃描橫縱坐標值unsigned char key; //識別的鍵值unsigned char send_ptr; //發送標識 unsigned char code key_to_char[]="0123456789ABCDEF"; unsigned char code LedTable[] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F,0X6F,0xF7,0xFF,0xB9,0xB F,0xF9,0xF1}; //0-9,a-f 的字型碼unsigned char A; //鍵盤比較臨時變量unsigned char LED_buff[6]; //LED 緩存內容unsigned char LED_ptr; //LED 更新時指針位置int i;void Timer_Init(void); //定時器初始化void Uart_Init(void); //串口初始化 void init_main(void); //主函數初始化void push_LED(unsigned char a); //數碼管內容向左更新unsigned char convert(unsigned char a); //返回掃描線橫向縱向的位權unsigned char LED_loc_convert(unsigned char loc); //數碼管位選輸入轉換unsigned char char_to_LED(unsigned char b); //接收的ASCII字符轉換void key_scan(void); //定時器0中斷處理void Uart_ISR(void); //串口中斷處理void Timer_Init(void)////////定時器初始化{ /////////////定時器0 TL0=0x00; //定時10ms TH0=0xFC; ET0 = 1; //開T0中斷 TR0=1; //啟動T0定時 /////////////定時器1 */ TL1 = 0xF3; // 波特率為2400bps TH1 = 0xF3; ET1 = 0; // 關閉T1中斷 TR1 = 1; // 啟動T1定時 TMOD = 0x21; //T0處于方式1, T1處于方式2--8位自動重裝}void Uart_Init(void) /////串口初始化{ PCON = 0x80; // 波特率加倍 SCON = 0x50; // 方式1,波特率可編程T1,允許接收 ES = 1; // 使能串口中斷}void init_main(void) ////主函數初始化{ x=0; y=0; //鍵盤掃描的橫縱坐標值 key=0; //識別的鍵值 key_ptr=0; //按鍵狀態標識 send_ptr=0; //發送標識 LED_ptr=0x01; //LED更新時指針位置 EA=1; //全局中斷開; TI=1;}void push_LED(unsigned char a) //數碼管內容向左更新{ for(i=5;i>0;i--)LED_buff[i]=LED_buff[i-1]; LED_buff[0]=a;}unsigned char convert(unsigned char a) // 返回掃描線橫向縱向的位權{ switch(a) { case 0x0E:return 0x00; case 0x0D:return 0x04; case 0x0B:return 0x08; case 0x07:return 0x0C; case 0xE0:return 0x00; case 0xD0:return 0x01; case 0xB0:return 0x02; case 0x70:return 0x03; } return 0x00;}unsigned char LED_loc_convert(unsigned char loc) //數碼管位選輸入轉換{ switch(loc) { case 0x00:return 0x01; case 0x01:return 0x02; case 0x02:return 0x04; case 0x03:return 0x08; case 0x04:return 0x10; case 0x05:return 0x20; default:return 0x00; }}unsigned char char_to_LED(unsigned char b) //接收的ASCII字符轉換{ if(b>=0x30&&b=0x41&&b<=0x46)return b-0x37; return 0;}void key_scan(void) interrupt 1 //定時器0中斷處理{ TL0=0x00; //定時10ms TH0=0xFC; if(LED_ptr==0x05)LED_ptr=0x00; else LED_ptr++; P2=LED_loc_convert(LED_ptr); //由LED_ptr獲得位選 P1=LED_buff[LED_ptr]; //從數碼管BUFF得到顯示內容// printf("timer0\n"); switch(key_ptr) //鍵盤掃描狀態機 { case 0x03: { P0=0x0F; A=(P0&0x0F); if(A==0x0F) key_ptr=0x00; else key_ptr=0x02; break; } case 0x02: { P0=0x0F; A=(P0&0x0F); if(A==0x0F) key_ptr=0x03; break; } case 0x01 : { P0=0x0F; A=(P0&0x0F); if(A!=0x0F)//這就是有鍵盤按下,檢測到有某列發生變化 { x=A;//得到列的數值, P0=0xF0; A=(P0&0xF0); y=A; //得到行的數值 key=convert(x)+convert(y); //得到鍵值 send_ptr=0x01; //發送標識設為1 push_LED(LedTable[key]);//數碼管內容向左更新,然后最右邊那位設為a,放到緩存中 key_ptr=0x02; } else key_ptr=0x00; break; } case 0x00: { P0=0x0F; A=(P0&0x0F); if(A!=0x0F) key_ptr=0x01; break; } default :key_ptr=0x00; }}void Uart_ISR(void) interrupt 4 //串口中斷處理{ if(RI) // 接收中斷 { RI = 0; // 清除接收中斷標志 rec_buff=SBUF; //這里拿到的是ASCII碼 push_LED(LedTable[char_to_LED(rec_buff)]);// 先變成16進制的數字,放入LED緩存的是字形碼 } else if(TI&&(send_ptr!=0x00))//有發送中斷并且發送標識不為0 { TI = 0; // 清除發送中斷標志 SBUF=key_to_char[key]; send_ptr=0x00; //發送標識清零 }}void main(){ //初始化 Timer_Init(); Uart_Init(); init_main(); while(1) { // 死循環,等待中斷 }}12
關 鍵 詞:
實驗 通信 鍵盤 串口 報告 數碼
 天天文庫所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
關于本文
本文標題:鍵盤、數碼管及串口間的通信實驗報告.doc
鏈接地址: http://www.476824.live/p-49949125.html
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服點擊這里,給天天文庫發消息,QQ:1290478887 - 聯系我們

本站為“文檔C2C交易模式”,即用戶上傳的文檔直接賣給(下載)用戶,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有【成交的100%(原創)】。本站是網絡服務平臺方,若您的權利被侵害,侵權客服QQ:1290478887 歡迎舉報。

[email protected] 2017-2027 http://www.476824.live 網站版權所有

粵ICP備19057495號 

收起
展開
球探网即时蓝球比分 北京十一选五走势一 七位数今天预测号码 怎么查询群英会开奖号码 股票融资余额多好 陕西11选5预测交流 宁夏十一选五电视走势图 11选5新疆爱彩乐 福彩3d试机号后胆码计算 秒速赛车计划网页 11选5山东夺金走势图