找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3877|回復(fù): 0
收起左側(cè)

幾個單片機(jī)常用實(shí)驗(yàn)分享給大家學(xué)習(xí) 8255 LCD 鍵盤掃描及數(shù)碼管顯示 步進(jìn)電機(jī)等

[復(fù)制鏈接]
ID:945685 發(fā)表于 2021-6-27 21:33 | 顯示全部樓層 |閱讀模式
鍵盤掃描及顯示設(shè)計實(shí)驗(yàn)
一、實(shí)驗(yàn)?zāi)康?/strong>
1.了解8255的工作方式及應(yīng)用;
2.了解鍵盤掃描及數(shù)碼顯示的基本原理,熟悉8255的編程。
二、實(shí)驗(yàn)設(shè)備
PC機(jī)一臺,TD-NMC+教學(xué)實(shí)驗(yàn)系統(tǒng)、或“TD-PIT++教學(xué)實(shí)驗(yàn)系統(tǒng)+TD-51 系統(tǒng)平臺”、或“TD-PITE 教學(xué)實(shí)驗(yàn)系統(tǒng)+TD-51 系統(tǒng)平臺”
三、實(shí)驗(yàn)內(nèi)容
將 8255 單元與鍵盤及數(shù)碼管顯示單元連接,編寫實(shí)驗(yàn)程序,掃描鍵盤輸入,并將掃描結(jié)果送數(shù)碼管顯示。鍵盤采用 4×4 鍵盤,每個數(shù)碼管顯示值可為 0~F 共 16 個數(shù)。實(shí)驗(yàn)具體內(nèi)容如下:將鍵盤進(jìn)行編號,記作 0~F,當(dāng)按下其中一個按鍵時,將該按鍵對應(yīng)的編號在一個數(shù)碼管上顯示出來,當(dāng)再按下一個按鍵時,便將這個按鍵的編號在下一個數(shù)碼管上顯示出來,數(shù)碼管上可以顯示最近 4 次按下的按鍵編號。
四、實(shí)驗(yàn)電路連接圖
單片機(jī)源程序如下:
  1. #include "Absacc.h"
  2. #define C8255_A    XBYTE[0x7F00]   //              8255端口地址定義
  3. #define C8255_B    XBYTE[0x7f01]
  4. #define C8255_C    XBYTE[0x7f02]
  5. #define C8255_CON  XBYTE[0x7f03]
  6. unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
  7. unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};     //顯示緩沖

  8. unsigned char key_down;
  9. unsigned char key_value;
  10. unsigned char key_count;

  11. void delay(unsigned int time)
  12. {  
  13.     unsigned int i;
  14.     for(i=0; i<time; i++);
  15. }
  16. void keyscan()                               //按鍵掃描函數(shù)
  17. {
  18.     unsigned char cc;
  19.     C8255_A = 0x00;                        //X1~X4置0
  20.     cc=C8255_C;                           //得到Y(jié)1~Y2的值
  21.     key_down =(~cc)&0x0f;
  22. }
  23. void display()                                //顯示函數(shù)
  24. {
  25.    unsigned char i,j = 0xDF;
  26.    for(i=0; i<6; i++)
  27.    {
  28.       C8255_A = 0xFF;
  29.       C8255_B = a[b[i]];                      //查表輸出顯示
  30.       C8255_A = j;
  31.       delay(0x100);
  32.       j = (j>>1)|(j<<7);
  33.     }
  34. }
  35. void clear()                               //清屏
  36. {
  37.     C8255_B = 0x00;
  38. }
  39. void writebuffer()
  40. {
  41.    b[key_count] = key_value;
  42.    key_count--;
  43.    if(key_count == -1)
  44.          key_count = 5;
  45.    display();
  46.    clear();
  47.    keyscan();
  48.    while(key_down)                      //鍵盤消抖
  49.    {
  50.        display();
  51.        clear();
  52.        keyscan();
  53.     }
  54. }
  55. void getkey()                            //得到按鍵值
  56. {
  57.    unsigned char value;
  58.    unsigned char i,j = 0xFE;
  59.    for(i=0; i<4; i++)
  60. {  
  61.    C8255_A = j;
  62.    value = C8255_C;
  63.    if(!(value & 0x01))                          //行1
  64.    {
  65.        key_value = i + 0;
  66.        writebuffer();
  67.        return;
  68.    }
  69. if(!(value & 0x02))                              //行2
  70. {
  71.        key_value = i + 4;
  72.        writebuffer();
  73.        return;
  74.    }
  75. if(!(value & 0x04))                               //行3

  76.    {
  77.        key_value = i + 8;
  78.        writebuffer();
  79.        return;
  80.    }
  81. if(!(value & 0x08))                                //行4

  82.    {
  83.        key_value = i + 12;
  84.        writebuffer();
  85.        return;
  86.    }
  87.   j<<=1;
  88. }
  89. }
  90. void main()
  91. {
  92.      C8255_CON = 0x81;                    //8255初始化
  93.      key_count = 5;
  94.      while(1)
  95.      {
  96.         display();                           //顯示
  97.         clear();                            //清屏
  98.         keyscan();                         //按鍵掃描
  99.         if(key_down)                     //判斷是否有按鍵按下
  100.        {
  101.            display();
  102.            delay(0x80);
  103.            clear();
  104.            keyscan();
  105.            if(key_down)
  106.            {
  107.             getkey();                      //得到按鍵值
  108.      } } }}
復(fù)制代碼

實(shí)驗(yàn)結(jié)果


  • 實(shí)驗(yàn)心得
通過本次實(shí)驗(yàn),使自己對8255單元的功能與應(yīng)用有了一定的了解,通過自己接線也更直觀的了解到了矩陣鍵盤的工作原理,通過編寫程序也使得自己對單片機(jī)和c語言的邏輯關(guān)系有了進(jìn)一步的認(rèn)識。
實(shí)驗(yàn)二、字符型LCD顯示設(shè)計實(shí)驗(yàn)
一、實(shí)驗(yàn)?zāi)康?/strong>
    了解字符型液晶的控制方法及程序設(shè)計方法。
二、實(shí)驗(yàn)設(shè)備
     PC機(jī)一臺,TD-NMC+實(shí)驗(yàn)裝置一套。
三、實(shí)驗(yàn)內(nèi)容
編寫實(shí)驗(yàn)程序,在液晶第一行上顯示字符串。在液晶第二行上顯示字符串。并循環(huán)動態(tài)顯示。
四、LCD液晶顯示單元和實(shí)驗(yàn)接線圖
  1. #include<reg51.h>
  2. #include<intrins.h>                    //引腳定義
  3. sbit RSPIN = P1^5;
  4. sbit RWPIN = P1^6;
  5. sbit EPIN = P1^7;
  6. unsigned char XPOS,YPOS;
  7. unsigned char DisTab1[] = "Love you";
  8. unsigned char DisTab2[] = "My girl hrm";
  9. void delay(unsigned int t)
  10. { unsigned int i,j;
  11. for(i=0;i<t;i++)
  12. for(j=0;j<10;j++);
  13. }
  14. void lcdwaitidle(void)                 //忙狀態(tài)判別
  15. { P0=0xff; RSPIN=0; RWPIN=1; EPIN=1;
  16. while((P0&0x80)==0x80);       //讀取忙標(biāo)志BF, 判為1否, 為1等待
  17. EPIN=0;
  18. }
  19. void lcdwcn(unsigned char c)                  //寫指令c
  20. {
  21. RSPIN=0; RWPIN=0; P0=c; EPIN=1;
  22. _nop_(); EPIN=0;

  23. void lcdwc(unsigned char c)       //查詢忙標(biāo)志, 然后寫指令c
  24. {
  25. lcdwaitidle();
  26. lcdwcn(c);
  27. }
  28. void lcdwd(unsigned char d)        //查詢忙標(biāo)志, 然后寫數(shù)據(jù)d
  29. { lcdwaitidle();
  30. RSPIN=1; RWPIN=0; P0=d; EPIN=1;
  31. _nop_(); EPIN=0;
  32. }
  33. void lcdpos(void)
  34. {
  35. XPOS&=0x3f; YPOS&=0x03;
  36. if(YPOS==0x00)
  37. lcdwc(XPOS|0x80);               //DDRAM 地址設(shè)置(第 1 行)
  38. else if(YPOS==0x01)
  39. lcdwc((XPOS+0x40)|0x80);        //DDRAM 地址設(shè)置(第 2 行)
  40. }
  41. void lcdinit(void)               //LCD 初始化
  42. { delay(150); lcdwcn(0x38);     //總線8位,兩行顯示,5*7點(diǎn)陣字符體
  43. delay(50); lcdwcn(0x38);
  44. delay(50); lcdwcn(0x38);
  45. lcdwc(0x38);
  46. lcdwc(0x08);                //關(guān)閉顯示, 光標(biāo)消失, 閃爍禁止
  47. lcdwc(0x01);                //清屏
  48. lcdwc(0x06);               //AC加1計數(shù),禁止?jié)L動
  49. lcdwc(0x0e);               //開顯示
  50. }
  51. void Display(void)          // 顯示子程序
  52. {
  53. for(XPOS=0; XPOS<16; XPOS++)
  54. {
  55. YPOS=0; lcdpos(); lcdwd(DisTab1[XPOS]);
  56. YPOS=1; lcdpos(); lcdwd(DisTab2[XPOS]);
  57. delay(2000);
  58. }
  59. for(XPOS=16; XPOS<30; XPOS++)
  60. {
  61. lcdwc(0x18);                 // 滾屏
  62. YPOS=0; lcdpos(); lcdwd(DisTab1[XPOS]);
  63. YPOS=1; lcdpos(); lcdwd(DisTab2[XPOS]);
  64. delay(2000);
  65. }
  66. }
復(fù)制代碼

  • 實(shí)驗(yàn)結(jié)
七、實(shí)驗(yàn)心得
本次實(shí)驗(yàn)讓我了解到LCD液晶顯示的工作原理,以及LCD液晶顯示串口的各向功能,加深了對單片機(jī)與c語言的實(shí)踐能力。但也從中意識到自己的理論水平還是比較有限,對于編寫程序的能力有待提高,我看到了自己許多不足之處。首先,對于儀器的認(rèn)識具體模塊的構(gòu)成依然非常生疏。再次,對于理論知識的掌握也不夠系統(tǒng),LCD液晶顯示實(shí)驗(yàn),對這方面的理論知識沒有一層清楚的概念。所以,本次實(shí)驗(yàn)對于我來說還是要花足功夫的。一開始,我就從網(wǎng)上和圖書館搜集了很多資料,針對液晶顯示方面的知識有個系統(tǒng)性的認(rèn)識,然后又找了本次實(shí)訓(xùn)相關(guān)的代碼進(jìn)行嘗試,由于對實(shí)驗(yàn)設(shè)備的操作不夠了解,所以在這方面詢問老師比較多,在老師和同學(xué)的幫助下,也逐漸對操作有了進(jìn)一步的熟悉。

步進(jìn)電機(jī)實(shí)驗(yàn)
  • 實(shí)驗(yàn)?zāi)康?/font>
    了解單片機(jī)控制步進(jìn)電機(jī)的方法。
    二、實(shí)驗(yàn)設(shè)備
        PC機(jī)一臺,TD-NMC+教學(xué)實(shí)驗(yàn)系統(tǒng)、或“TD-PIT++教學(xué)實(shí)驗(yàn)系統(tǒng)+TD-51 系統(tǒng)平臺”、或“TD-PITE 教學(xué)實(shí)驗(yàn)系統(tǒng)+TD-51 系統(tǒng)平臺”
    三、實(shí)驗(yàn)原理
       使用開環(huán)控制方式能對步進(jìn)電機(jī)的轉(zhuǎn)到方向、速度和角度進(jìn)行調(diào)節(jié)。所謂步進(jìn),就是指每給步進(jìn)電機(jī)一個遞進(jìn)脈沖,步進(jìn)電機(jī)各繞組的通電順序就改變一次,即電機(jī)轉(zhuǎn)動一次。根據(jù)步進(jìn)電機(jī)控制繞組的多少可以將電機(jī)分為三相、四相和五相。實(shí)驗(yàn)中所使用的步進(jìn)電機(jī)為四相八拍電機(jī),電壓為DC5V。
  • 實(shí)驗(yàn)內(nèi)容
       編寫實(shí)驗(yàn)程序,通過單片機(jī)的 PO 口控制步進(jìn)電機(jī)運(yùn)轉(zhuǎn)。參考接線圖如圖 5-1-2 所示。
  • 實(shí)驗(yàn)程序
#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();
}
}
}
  • 實(shí)驗(yàn)結(jié)果
七、心得
    通過這次實(shí)驗(yàn),掌握了單片機(jī)步進(jìn)電機(jī)的工作原理和他的幾種不同的工作方式,并且對他的不同工作方式的差異有了自己的想法。即:通過改變for(i=0;i<30000;i++)里的30000可以改變步進(jìn)電機(jī)的運(yùn)轉(zhuǎn)速度。當(dāng)for(m=0;m<7;m++)時,電機(jī)順時針轉(zhuǎn)動;當(dāng)for(m=7;m>0;m--)時電機(jī)逆時針轉(zhuǎn)動。

實(shí)驗(yàn)四、直流電機(jī)PWM調(diào)速實(shí)驗(yàn)
一、實(shí)驗(yàn)?zāi)康?br /> 了解單片機(jī)控制直流電機(jī)的方法,并掌握脈寬調(diào)制直流調(diào)速的方法。
二、實(shí)驗(yàn)設(shè)備
PC機(jī)一臺,TD-NMC+教學(xué)實(shí)驗(yàn)系統(tǒng)、或“TD-PIT++教學(xué)實(shí)驗(yàn)系統(tǒng)+TD-51 系統(tǒng)平臺”、或“TD-PITE 教學(xué)實(shí)驗(yàn)系統(tǒng)+TD-51 系統(tǒng)平臺”
三、實(shí)驗(yàn)原理
直流電機(jī)單元由DC12V、1.1W 的直流電機(jī),小磁鋼,霍爾元件及輸出電路構(gòu)成。PWM的示意圖如圖 5-2-1 所示。通過調(diào)節(jié) T1 的脈沖寬度,可以改變 T1 的占空比,從而改變輸出,達(dá)到改變直流電機(jī)轉(zhuǎn)速的目的。
  • 實(shí)驗(yàn)內(nèi)容
    實(shí)驗(yàn)接線圖如圖 5-2-2 所示,通過單片機(jī)的P1.7口來模擬PWM輸出,經(jīng)過驅(qū)動電路來驅(qū)動直流電機(jī),實(shí)現(xiàn)脈寬調(diào)速。在TD-NMC+實(shí)驗(yàn)平臺中將P1.7直接與驅(qū)動電路的A端連接,驅(qū)動單元的輸出 A'連接直流電機(jī)單元的 2 端。
  • 圖5-2-2直流電機(jī)實(shí)驗(yàn)接線
  • 實(shí)驗(yàn)程序
#include <reg51.h>
#define T_value(unsigned  char)0x80         //T周期值
#defineT1_value(unsigned  char)0x20        //T周期中高電平周期T1值
#defineTH0_value(unsigned char)0xFE        //定時器T0計數(shù)值(高)
#defineTL0_value(unsigned char)0x00        //定時器T0計數(shù)值(低)
sbit DRV=P1^7;
unsigned  char T_Count;                   //延時次數(shù)
void init_tim0()                         //定時器0初始化,定時基數(shù)
{
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;
}}}
  • 實(shí)驗(yàn)結(jié)果
八、實(shí)驗(yàn)心得
通過軟件得設(shè)計及運(yùn)行,實(shí)驗(yàn)達(dá)到了預(yù)期得結(jié)果,實(shí)現(xiàn)了電機(jī)得正轉(zhuǎn)、反轉(zhuǎn),加速與減速設(shè)計。設(shè)計過程中遇到了很多得問題,但就是我們沒有半途而廢,加深了對知識得理解,一點(diǎn)一點(diǎn)得分析.總而言之,這次設(shè)計讓我受益匪淺。在摸索該如何設(shè)計電路使之實(shí)現(xiàn)所需功能得過程中,培養(yǎng)了我得設(shè)計思維,增加了實(shí)際操作能力,也讓深深地體會到了自己學(xué)習(xí)知識得不足之處,對于知識得理解程度不夠深,自己以為明白得實(shí)際上不明白.在以后得學(xué)習(xí)過程中,我會重視這些問題,逐漸改變自己得學(xué)習(xí)習(xí)慣,不斷得進(jìn)步!

以上內(nèi)容的Word格式文檔51黑下載地址:
文檔.doc (8.41 MB, 下載次數(shù): 6)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表