数码管动态显示实验报告

实验四数码管动态显示实验一

一、实验要求

1.  在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路

2.  在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码管数据引脚相连 ,P2.0~P2.3引脚输出选控制信号

3.  在Keil软件中编写程序,采用动态显示法,实现数码管分别显示数字1,2,3,4

二、实验目的

1.  巩固Proteus软件和Keil软件的使用方法

2.  学习端口输入输出的高级应用

3.  掌握7段数码管的连接方式和动态显示法

4.  掌握查表程序和延时等子程序的设计

三.实验说明

本实验是将单片机的P1口做为输出口,将四个数码管的七段引脚分别接到P1.0至P1.7。由于电路中采用共阳极的数码管,所以当P1端口相应的引脚为0时,对应的数码管段点亮。程序中预设了数字0-9的段码。由于是让四个数码管显示不同的数值,所以要用扫描的方式来实现。因此定义了scan函数,接到单片机的p2.0至p2.3

在实验中,预设的数字段码表存放在数组TAB中,由于段码表是固定的,因此存储类型可设为code。

在Proteus软件中按照要求画出电路,再利用Keil软件按需要实现的功能编写c程序,生成Hex文件,把Hex文件导到Proteus软件中进行仿真。为了能够更好的验证实验要求,在编写程序时需要延时0.5s,能让人眼更好的分辨;89C51的一个机器周期包含12个时钟脉冲,而我们采用的是12MHz晶振,每一个时钟脉冲的时间是1/12us,所以一个机器周期为1us。在keil程序中,子函数的实现是用void delay_ms(int x),其中x为1时是代表1ms。

四、硬件原理图及程序设计

(一)硬件原理图设计

电路中P1.0到P1.7为数码管七段端口的控制口,排阻RP1阻值为220Ω,p2.0到p2.3为数码管的扫描信号。AT89c51单片机的9脚(RST)为复位引脚,当RST为高电平的时间达到2个机器周期时系统就会被复位;31引脚(EA)为存取外部存储器使能引脚,当EA为高电平是使用单片机内部存储器,当EA为低电平时单片机则使用外部存储器。18、19引脚是接晶振脚。而接地和电源端在软件中已经接好,所以不用在引线。

如下图所示:

(二)流程图与程序设计

(三)程序设源代码

#include    <reg51.h>                                       //定义8051寄存器头文件

#define     SEG7P    P1                                     //定义扫描信号的位置

#define     SCANP   P2                                                       //定义数码管的位置

char code TAB[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99,               //数字0~4的码值

                     0x92, 0x83, 0xf8, 0x80, 0x98 };             //数字5~9的码值

char disp[4]={1,2,3,4};                                                       //定义要显示的数值

void delay_ms(int x);                                                          //声明延时函数

char scan[4]={0xfe,0xfd,0xfb,0xf7};                                    //定义扫描

char i,j;                                                                              //定义变量i,j

main()                                                                               //主函数的开始

{                                                                                                 

  while(1)                                                                        //无限循环

  {   for(i=0;i<4;i++)                                                       //从

         {j=disp[3-i];                                                           //取出显示的数值

     SCANP =scan[i];                                                         //扫描的顺序

    SEG7P =TAB[j];                                                       //将TAB的数值赋给数码管

      delay_ms(4);                                                              //延时4ms

    }                                                                                 

   }                                                                                 

}                                                                                             

void delay_ms(int x)                                                          

{       int i,j;                                                                             

  for (i=0;i<x;i++)                                                              

    for (j=0;j<120;j++);                                                    

}      

五.实验总结

问题一:运行电路时,数码管乱码

解决的方法:检查电路,发现程序中扫描信号端口错误,将扫描信号的端口顺序调换,重新运行。

问题二:重新运行后,数码管只显示其中的一部分。

解决的方法:检查程序,发现是延时时间的问题,在改动延时时间后,重新编译后在次运行电路,电路正常显示,符合要求。

通过本次的实验,在前两个实验的基础上让我复习了知识点,也让我在次掌握了新的知识。在完成这次实验后,让我想到可以用多个按键控制多个数码管实现加减和暂停和开始。我觉得这次的课程实验让我知道,一次次的失败,并不会让我放弃去追求,相反它会引领着我去发现问题,从而解决问题,完成更深入的探索。也让我明白理论知识的重要性,并且与实际相结合,多动手,在实践中成长。所以我会很重视每一次的实验。我坚信:每次实验都会给我自身很大帮助。慢慢的积累点滴的知识,到最后就会多的。                                                                                          

 

第二篇:动态数码管实验报告

                         动态数码管实验报告

       电气0922学号0930117208张政            

一、               设计图纸如下

二、原理叙述

  

相关推荐