找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3221|回复: 0
打印 上一主题 下一主题
收起左侧

几个单片机常用实验分享给大家学习 8255 LCD 键盘扫描及数码管显示 步进电机等

[复制链接]
跳转到指定楼层
楼主
ID:945685 发表于 2021-6-27 21:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
键盘扫描及显示设计实验
一、实验目的
1.了解8255的工作方式及应用;
2.了解键盘扫描及数码显示的基本原理,熟悉8255的编程。
二、实验设备
PC机一台,TD-NMC+教学实验系统、或“TD-PIT++教学实验系统+TD-51 系统平台”、或“TD-PITE 教学实验系统+TD-51 系统平台”
三、实验内容
将 8255 单元与键盘及数码管显示单元连接,编写实验程序,扫描键盘输入,并将扫描结果送数码管显示。键盘采用 4×4 键盘,每个数码管显示值可为 0~F 共 16 个数。实验具体内容如下:将键盘进行编号,记作 0~F,当按下其中一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近 4 次按下的按键编号。
四、实验电路连接图
单片机源程序如下:
  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()                               //按键扫描函数
  17. {
  18.     unsigned char cc;
  19.     C8255_A = 0x00;                        //X1~X4置0
  20.     cc=C8255_C;                           //得到Y1~Y2的值
  21.     key_down =(~cc)&0x0f;
  22. }
  23. void display()                                //显示函数
  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.      } } }}
复制代码

实验结果


  • 实验心得
通过本次实验,使自己对8255单元的功能与应用有了一定的了解,通过自己接线也更直观的了解到了矩阵键盘的工作原理,通过编写程序也使得自己对单片机和c语言的逻辑关系有了进一步的认识。
实验二、字符型LCD显示设计实验
一、实验目的
    了解字符型液晶的控制方法及程序设计方法。
二、实验设备
     PC机一台,TD-NMC+实验装置一套。
三、实验内容
编写实验程序,在液晶第一行上显示字符串。在液晶第二行上显示字符串。并循环动态显示。
四、LCD液晶显示单元和实验接线图
  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)                 //忙状态判别
  15. { P0=0xff; RSPIN=0; RWPIN=1; EPIN=1;
  16. while((P0&0x80)==0x80);       //读取忙标志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)       //查询忙标志, 然后写指令c
  24. {
  25. lcdwaitidle();
  26. lcdwcn(c);
  27. }
  28. void lcdwd(unsigned char d)        //查询忙标志, 然后写数据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 地址设置(第 1 行)
  38. else if(YPOS==0x01)
  39. lcdwc((XPOS+0x40)|0x80);        //DDRAM 地址设置(第 2 行)
  40. }
  41. void lcdinit(void)               //LCD 初始化
  42. { delay(150); lcdwcn(0x38);     //总线8位,两行显示,5*7点阵字符体
  43. delay(50); lcdwcn(0x38);
  44. delay(50); lcdwcn(0x38);
  45. lcdwc(0x38);
  46. lcdwc(0x08);                //关闭显示, 光标消失, 闪烁禁止
  47. lcdwc(0x01);                //清屏
  48. lcdwc(0x06);               //AC加1计数,禁止滚动
  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. }
复制代码

  • 实验结
七、实验心得
本次实验让我了解到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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表