鍵盤掃描及顯示設計實驗
一、實驗目的
1.了解8255的工作方式及應用; 2.了解鍵盤掃描及數碼顯示的基本原理,熟悉8255的編程。
二、實驗設備
PC機一臺,TD-NMC+教學實驗系統、或“TD-PIT++教學實驗系統+TD-51 系統平臺”、或“TD-PITE 教學實驗系統+TD-51 系統平臺”
三、實驗內容
將 8255 單元與鍵盤及數碼管顯示單元連接,編寫實驗程序,掃描鍵盤輸入,并將掃描結果送數碼管顯示。鍵盤采用 4×4 鍵盤,每個數碼管顯示值可為 0~F 共 16 個數。實驗具體內容如下:將鍵盤進行編號,記作 0~F,當按下其中一個按鍵時,將該按鍵對應的編號在一個數碼管上顯示出來,當再按下一個按鍵時,便將這個按鍵的編號在下一個數碼管上顯示出來,數碼管上可以顯示最近 4 次按下的按鍵編號。 四、實驗電路連接圖    單片機源程序如下:- #include "Absacc.h"
- #define C8255_A XBYTE[0x7F00] // 8255端口地址定義
- #define C8255_B XBYTE[0x7f01]
- #define C8255_C XBYTE[0x7f02]
- #define C8255_CON XBYTE[0x7f03]
- unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
- unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //顯示緩沖
-
- unsigned char key_down;
- unsigned char key_value;
- unsigned char key_count;
-
- void delay(unsigned int time)
- {
- unsigned int i;
- for(i=0; i<time; i++);
- }
- void keyscan() //按鍵掃描函數
- {
- unsigned char cc;
- C8255_A = 0x00; //X1~X4置0
- cc=C8255_C; //得到Y1~Y2的值
- key_down =(~cc)&0x0f;
- }
- void display() //顯示函數
- {
- unsigned char i,j = 0xDF;
- for(i=0; i<6; i++)
- {
- C8255_A = 0xFF;
- C8255_B = a[b[i]]; //查表輸出顯示
- C8255_A = j;
- delay(0x100);
- j = (j>>1)|(j<<7);
- }
- }
- void clear() //清屏
- {
- C8255_B = 0x00;
- }
- void writebuffer()
- {
- b[key_count] = key_value;
- key_count--;
- if(key_count == -1)
- key_count = 5;
- display();
- clear();
- keyscan();
- while(key_down) //鍵盤消抖
- {
- display();
- clear();
- keyscan();
- }
- }
- void getkey() //得到按鍵值
- {
- unsigned char value;
- unsigned char i,j = 0xFE;
- for(i=0; i<4; i++)
- {
- C8255_A = j;
- value = C8255_C;
- if(!(value & 0x01)) //行1
- {
- key_value = i + 0;
- writebuffer();
- return;
- }
- if(!(value & 0x02)) //行2
- {
- key_value = i + 4;
- writebuffer();
- return;
- }
- if(!(value & 0x04)) //行3
-
- {
- key_value = i + 8;
- writebuffer();
- return;
- }
- if(!(value & 0x08)) //行4
-
- {
- key_value = i + 12;
- writebuffer();
- return;
- }
- j<<=1;
- }
- }
- void main()
- {
- C8255_CON = 0x81; //8255初始化
- key_count = 5;
- while(1)
- {
- display(); //顯示
- clear(); //清屏
- keyscan(); //按鍵掃描
- if(key_down) //判斷是否有按鍵按下
- {
- display();
- delay(0x80);
- clear();
- keyscan();
- if(key_down)
- {
- getkey(); //得到按鍵值
- } } }}
復制代碼
實驗結果
通過本次實驗,使自己對8255單元的功能與應用有了一定的了解,通過自己接線也更直觀的了解到了矩陣鍵盤的工作原理,通過編寫程序也使得自己對單片機和c語言的邏輯關系有了進一步的認識。 實驗二、字符型LCD顯示設計實驗
一、實驗目的
了解字符型液晶的控制方法及程序設計方法。
二、實驗設備
PC機一臺,TD-NMC+實驗裝置一套。
三、實驗內容 編寫實驗程序,在液晶第一行上顯示字符串。在液晶第二行上顯示字符串。并循環動態顯示。
四、LCD液晶顯示單元和實驗接線圖  - #include<reg51.h>
- #include<intrins.h> //引腳定義
- sbit RSPIN = P1^5;
- sbit RWPIN = P1^6;
- sbit EPIN = P1^7;
- unsigned char XPOS,YPOS;
- unsigned char DisTab1[] = "Love you";
- unsigned char DisTab2[] = "My girl hrm";
- void delay(unsigned int t)
- { unsigned int i,j;
- for(i=0;i<t;i++)
- for(j=0;j<10;j++);
- }
- void lcdwaitidle(void) //忙狀態判別
- { P0=0xff; RSPIN=0; RWPIN=1; EPIN=1;
- while((P0&0x80)==0x80); //讀取忙標志BF, 判為1否, 為1等待
- EPIN=0;
- }
- void lcdwcn(unsigned char c) //寫指令c
- {
- RSPIN=0; RWPIN=0; P0=c; EPIN=1;
- _nop_(); EPIN=0;
-
- void lcdwc(unsigned char c) //查詢忙標志, 然后寫指令c
- {
- lcdwaitidle();
- lcdwcn(c);
- }
- void lcdwd(unsigned char d) //查詢忙標志, 然后寫數據d
- { lcdwaitidle();
- RSPIN=1; RWPIN=0; P0=d; EPIN=1;
- _nop_(); EPIN=0;
- }
- void lcdpos(void)
- {
- XPOS&=0x3f; YPOS&=0x03;
- if(YPOS==0x00)
- lcdwc(XPOS|0x80); //DDRAM 地址設置(第 1 行)
- else if(YPOS==0x01)
- lcdwc((XPOS+0x40)|0x80); //DDRAM 地址設置(第 2 行)
- }
- void lcdinit(void) //LCD 初始化
- { delay(150); lcdwcn(0x38); //總線8位,兩行顯示,5*7點陣字符體
- delay(50); lcdwcn(0x38);
- delay(50); lcdwcn(0x38);
- lcdwc(0x38);
- lcdwc(0x08); //關閉顯示, 光標消失, 閃爍禁止
- lcdwc(0x01); //清屏
- lcdwc(0x06); //AC加1計數,禁止滾動
- lcdwc(0x0e); //開顯示
- }
- void Display(void) // 顯示子程序
- {
- for(XPOS=0; XPOS<16; XPOS++)
- {
- YPOS=0; lcdpos(); lcdwd(DisTab1[XPOS]);
- YPOS=1; lcdpos(); lcdwd(DisTab2[XPOS]);
- delay(2000);
- }
- for(XPOS=16; XPOS<30; XPOS++)
- {
- lcdwc(0x18); // 滾屏
- YPOS=0; lcdpos(); lcdwd(DisTab1[XPOS]);
- YPOS=1; lcdpos(); lcdwd(DisTab2[XPOS]);
- delay(2000);
- }
- }
復制代碼
七、實驗心得 本次實驗讓我了解到LCD液晶顯示的工作原理,以及LCD液晶顯示串口的各向功能,加深了對單片機與c語言的實踐能力。但也從中意識到自己的理論水平還是比較有限,對于編寫程序的能力有待提高,我看到了自己許多不足之處。首先,對于儀器的認識具體模塊的構成依然非常生疏。再次,對于理論知識的掌握也不夠系統,LCD液晶顯示實驗,對這方面的理論知識沒有一層清楚的概念。所以,本次實驗對于我來說還是要花足功夫的。一開始,我就從網上和圖書館搜集了很多資料,針對液晶顯示方面的知識有個系統性的認識,然后又找了本次實訓相關的代碼進行嘗試,由于對實驗設備的操作不夠了解,所以在這方面詢問老師比較多,在老師和同學的幫助下,也逐漸對操作有了進一步的熟悉。
步進電機實驗 - 實驗目的
了解單片機控制步進電機的方法。
二、實驗設備
PC機一臺,TD-NMC+教學實驗系統、或“TD-PIT++教學實驗系統+TD-51 系統平臺”、或“TD-PITE 教學實驗系統+TD-51 系統平臺”
三、實驗原理
使用開環控制方式能對步進電機的轉到方向、速度和角度進行調節。所謂步進,就是指每給步進電機一個遞進脈沖,步進電機各繞組的通電順序就改變一次,即電機轉動一次。根據步進電機控制繞組的多少可以將電機分為三相、四相和五相。實驗中所使用的步進電機為四相八拍電機,電壓為DC5V。
- 實驗內容
編寫實驗程序,通過單片機的 PO 口控制步進電機運轉。參考接線圖如圖 5-1-2 所示。
#include<reg51.h>
unsigned char L_value[8]={0x0E,0x0C,0x0D,0x09,0x0B,0x03,0x07,0x06};
void delay()
{
unsigned int i;
for(i=0;i<30000;i++);
}
void main()
{
unsigned char m;
P0=0x0;
while(1)
{
for(m=0;m<7;m++)
{
P0=L_value[m];
delay();
}
}
} 七、心得 通過這次實驗,掌握了單片機步進電機的工作原理和他的幾種不同的工作方式,并且對他的不同工作方式的差異有了自己的想法。即:通過改變for(i=0;i<30000;i++)里的30000可以改變步進電機的運轉速度。當for(m=0;m<7;m++)時,電機順時針轉動;當for(m=7;m>0;m--)時電機逆時針轉動。
實驗四、直流電機PWM調速實驗
一、實驗目的
了解單片機控制直流電機的方法,并掌握脈寬調制直流調速的方法。
二、實驗設備
PC機一臺,TD-NMC+教學實驗系統、或“TD-PIT++教學實驗系統+TD-51 系統平臺”、或“TD-PITE 教學實驗系統+TD-51 系統平臺”
三、實驗原理
直流電機單元由DC12V、1.1W 的直流電機,小磁鋼,霍爾元件及輸出電路構成。PWM的示意圖如圖 5-2-1 所示。通過調節 T1 的脈沖寬度,可以改變 T1 的占空比,從而改變輸出,達到改變直流電機轉速的目的。 - 實驗內容
實驗接線圖如圖 5-2-2 所示,通過單片機的P1.7口來模擬PWM輸出,經過驅動電路來驅動直流電機,實現脈寬調速。在TD-NMC+實驗平臺中將P1.7直接與驅動電路的A端連接,驅動單元的輸出 A'連接直流電機單元的 2 端。 - 圖5-2-2直流電機實驗接線
#include <reg51.h> #define T_value(unsigned char)0x80 //T周期值
#defineT1_value(unsigned char)0x20 //T周期中高電平周期T1值
#defineTH0_value(unsigned char)0xFE //定時器T0計數值(高)
#defineTL0_value(unsigned char)0x00 //定時器T0計數值(低)
sbit DRV=P1^7;
unsigned char T_Count; //延時次數
void init_tim0() //定時器0初始化,定時基數
{
TMOD=0x01;
TH0=TH0_value;
TL0=TL0_value;
TR0=1;
ET0=1;
EA=1;
}
void int_tim0() interrupt 1
{
TH0=TH0_value;
TL0=TL0_value;
T_Count--;
}
void main()
{
unsigned char Tx ;
DRV=0;
init_tim0();
T_Count=T1_value;
Tx=T1_value;
while(1)
{
if(T_Count==0)
{
DRV=~DRV;
Tx=T_value-Tx;
T_Count=Tx;
}}} 八、實驗心得 通過軟件得設計及運行,實驗達到了預期得結果,實現了電機得正轉、反轉,加速與減速設計。設計過程中遇到了很多得問題,但就是我們沒有半途而廢,加深了對知識得理解,一點一點得分析.總而言之,這次設計讓我受益匪淺。在摸索該如何設計電路使之實現所需功能得過程中,培養了我得設計思維,增加了實際操作能力,也讓深深地體會到了自己學習知識得不足之處,對于知識得理解程度不夠深,自己以為明白得實際上不明白.在以后得學習過程中,我會重視這些問題,逐漸改變自己得學習習慣,不斷得進步!
以上內容的Word格式文檔51黑下載地址:
文檔.doc
(8.41 MB, 下載次數: 6)
2021-7-1 05:07 上傳
點擊文件名下載附件
|