• 领导讲话
  • 自我介绍
  • 党会党课
  • 文秘知识
  • 转正申请
  • 问题清单
  • 动员大会
  • 年终总结
  • 工作总结
  • 思想汇报
  • 实践报告
  • 工作汇报
  • 心得体会
  • 研讨交流
  • 述职报告
  • 工作方案
  • 政府报告
  • 调研报告
  • 自查报告
  • 实验报告
  • 计划规划
  • 申报材料
  • 当前位置: 勤学考试网 > 公文文档 > 实验报告 > 正文

    单片机原理数码管动态显示实验-单片机原理-实验报告材料x

    时间:2020-09-16 16:15:38 来源:勤学考试网 本文已影响 勤学考试网手机站

    实用文案

    实用文案

    标准

    标准

    宁德师范学院计算机系

    实验报告

    (2014 — 2015学年 第2学期)

    课程名称 单片机原理

    实验名称 数码管动态显示实验

    专 业计算机科学与技术(非师范)

    年 级 2012级

    学号 B2012102147 姓名 王 秋

    指导教师 杨烈君

    实验日期 2015417

    实验目的:

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

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

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

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

    实验要求:

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

    在电路中增加八位 7段数码管(共阳/共阴自选),将P2 口作数据输出口与 7段数码管数据 引脚相连,P3引脚输出位选控制信号

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

    实现指定数值的显示 (可使用 缓存数值)

    实现类似时钟的效果,如“ 13-23-25 ” 13时23分25秒

    实现时钟的自动计时

    扩展要求: 结合LED显示,实现带数码显示的交通灯

    实验设备(环境):

    .计算机

    . Proteus ISIS 7 Professional 应用程序

    . Keil应用程序

    实验内容:

    数码管动态显示技术要求实现:

    ?动态显示法,实现数码管分别显示数字 1-8 ;

    .实现指定数值的显示 (可使用缓存数值) );

    .实现类似时钟的效果,如“ 13-23-25 ” 13时23分25秒;

    .实现时钟的自动计时;

    扩展要求: 结合LED显示,实现带数码显示的交通灯;

    实验步骤、实验结果及分析:

    1实验步骤:

    1、 使用Proteus ISIS 7 Professional 应用程序,建立一个 .DSN文件

    2、 在“库”下拉菜单中,选中“拾取元件” (快捷键P),分别选择以下元件: AT89C51、CAP、

    CAP-ELEC、CRYSTAL > RESPACK-8。

    3、 构建仿真电路:

    火曲x>

    00

    ld

    ru

    ?仪旺u

    ru

    WWW

    实用文案

    实用文案

    标准

    标准

    红绿灯效果图1

    红绿灯效果图2

    4、创建一个Keil应用程序:新建一个工程项目文件;为工程选择目标器件( AT89C52 );为工程

    项目创建源程序文件并输入程序代码;保存创建的源程序项目文件;把源程序文件添加到项目中。

    5、把用户程序经过编译后生成的HEX文件添加到仿真电路中的处理器中(编辑元件t

    5、把用户程序经过编译后生成的

    2实验程序 < 流程图>

    定义数组Ledcode[]P3=1<<iP2=~Ledcode[i]i++调用延时

    函数P3=1?i定义数组Ledcode[] 3r定义 Dispbug[]存放指定数11定义子函数PutTimeO{…}P2=~Ledco de[DispBu f[i]]

    定义数组

    Ledcode[]

    P3=1<<i

    P2=~Ledco

    de[i]

    i++

    调用延时

    函数

    P3=1?i

    定义数组

    Ledcode[]

    3

    r

    定义 Dispbug[]

    存放指定数

    1

    1

    定义子函数

    PutTimeO

    {…}

    P2=~Ledco de[DispBu f[i]]

    T

    i++

    调用延时

    函数

    While

    (1)

    For (i=0;i<

    8)

    PutTimeO

    N

    调用延 时函数

    P2=~Ledcode[D ispBuf[i]]

    A

    ?

    Y

    P3=1<<i

    uchar code Ledcode[]={

    0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 定义一个数组里面放入

    1-8

    void delay( uint x)

    {

    while(x--);

    }

    void mai n()

    {

    uchar i;

    while(1)

    {

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

    {

    P3=1<<i; 〃P3 口表示从第一个位开始显示数值

    P2=~Ledcode[i]; 〃P2 口用来显示所需要显示的数值

    delay(500);

    }

    }

    }

    实现指定数值的显示 (可使用缓存数值) );

    #in clude<reg51.h>

    un sig ned char code LedCode[]={

    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40

    };

    unsigned char DispBuf[8]={3,3,3,5,5,2,2,3}; // 指定要显示的数的位置

    void delay (un sig ned int x){

    while(x--);

    }

    void mai n()

    {

    un sig ned int i;

    for(i=0;i<8;i++){

    P3=1<<i;

    P2=~LedCode[DispBuf[i]]; // 显示指定数的位置

    delay(500);

    }

    }

    实现类似时钟的效果,如“ 13-23-25 ” 13时23分25秒;

    #in clude<reg51.h>

    un sig ned char code LedCode[]={

    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

    un sig ned char Hour=13,Mi n=23,Sec=25;

    un sig ned char DispBuf[8]; void delay (un sig ned int x) {

    while(x--);

    }

    void PutTime()

    {

    DispBuf[7]=Sec%10;

    //取对应秒数的个位放在最右边显示

    DispBuf[6]=Sec/10;

    //取对应秒数的十位放在右起第一位显示

    DispBuf[5]=10;

    //此处表示秒跟分之间用横杆隔开

    DispBuf[4]=Mi n%10;

    DispBuf[3]=Mi n/10;

    DispBuf[2]=10;

    DispBuf[1]=Hour%10;

    DispBuf[0]=Hour/10;

    }

    void mai n()

    {

    long n=0;

    while(1)

    {

    un sig ned char i;

    PutTime();

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

    {

    P3=1<<i;

    P2=~LedCode[DispBuf[i]];

    delay(500);

    }

    }

    }

    实现时钟的自动计时;

    #in clude<reg51.h>

    un sig ned char code LedCode[]={

    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

    un sig ned char Hour=13,M in=23,Sec=25;

    un sig ned char DispBuf[8];

    void delay (un sig ned int x)

    {

    while(x--);

    }

    void PutTime()

    {

    DispBuf[7]=Sec%10;

    DispBuf[6]=Sec/10;

    DispBuf[5]=10;

    DispBuf[4]=Mi n%10;

    DispBuf[3]=Mi n/10;

    DispBuf[2]=10;

    DispBuf[1]=Hour%10;

    DispBuf[0]=Hour/10;

    }

    void mai n()

    {

    long n=0;

    while(1)

    {

    unsigned char i,ms; //定义一个 ms用于控制秒数加一的延时

    PutTime();

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

    {

    P3=1<<i;

    P2=~LedCode[DispBuf[i]];

    delay(500);

    }

    ms++; //控制加一的时延

    if(ms>=20)

    {

    Sec++;ms=O;

    }

    if(Sec>=60) //表示进位,当秒满六十则向分钟进一,同时秒数清零

    {

    Mi n++;Sec=O;

    }

    if(Mi n>=60)

    {

    Hour++;Mi n=0;

    }

    if(Hour>=24) //当小时数满24小时时,则小时数清零,完成计时

    {

    Hour=0;

    }

    }

    }

    扩展要求: 结合LED显示,实现带数码显示的交通灯;

    #i nclude "reg52.h"

    #defi ne uint un sig ned int

    #defi ne uchar un sig ned char

    #defi ne Disp_Null 10

    uchar code LedCode[]={

    0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x40};

    uchar DispBuf[8];

    sbit r1=P2A0;sbit y1=P2A1;sbit g1=P2A2;

    sbit r2=P2A3;sbit y2=P2A4;sbit g2=P2A5; uchar sec1;sec2;comsec;

    void delay( uint x)

    {

    while(x--);

    }

    void Pn tTime()

    {

    DispBuf[3]=sec2 % 10;

    DispBuf[2]=sec2 / 10;

    DispBuf[1]=sec1 % 10;

    DispBuf[0]=sec1 / 10;

    }

    void display。

    {

    uchar i;

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

    {

    P3=0;

    P1= ~LedCode[ DispBuf[i]];

    P3=1<<i;

    delay(100);

    }

    }

    void mai n ()

    {

    while(1)

    {

    uchar ms;

    Pn tTime();

    display。;

    ms++;

    if( ms >=60){

    ms=0;

    comsec=(comsec+1) % 60; // 定义一个计数变量,使其一直保持在60

    }

    if( comsec <20){ //comsec 在 20 以内时 g2、r1 亮

    sec1=20-comsec; sec2=30-comsec;

    r1=1;y1=0;g1=0;

    r2=0;y2=0;g2=1;

    }

    if(comsec>=20 && comsec<30){ //comsec 在 20 与 30 之间时 y2、

    r1亮

    sec1=30-comsec; sec2=30-comsec;

    r1=1;y1=0;g1=0;

    r2=0;y2=1;g2=0;

    }

    if(comsec>=30 && comsec<50){ 〃g1、r2 在 comsec 增加 20

    内亮

    sec1=60-comsec; sec2=50-comsec;

    r1=0;y1=0;g1=1;

    r2=1;y2=0;g2=0;

    }

    if(comsec>=50){

    sec1=60-comsec; sec2=60-comsec;

    r1=0;y1=1;g 1=0;

    r2=1;y2=0;g2=0;

    }

    }

    过程总结:

    本实验是将单片机的 P2 口做为输出口,将四个数码管的七段引脚分别接到 P2.0至P2.7.由于

    电路中采用共阳极的数码管,所以当 P2端口相应的引脚为 0时,对应的数码管段点亮。程序中预

    设了数字0-9的段码。由于是让八个数码管显示不同的数值, 所以要用扫描的方式来实现。 因此可

    定义扫描函数,接到单片机的 P3 口。

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

    可设为code.在Proteus软件中按照要求画出电路, 再利用Keil软件按需要实现的功能编写 c程序,

    生成Hex文件,把Hex文件导到Proteus软件中进行仿真。

    心得体会:

    实验数码管显示程序的编程方法

    1) 先准备好要显示的数据,放入相应的显示存储单元中。

    2) 根据要使用的数码管的具体位置来确定扫描初值和扫描方向。

    3) 根据使用数码管的个数来确定扫描的位数。

    4) 查表将要显示的数据转换为能使数码管正确显示相对应的段码。

    5) 分时送段码和位码,数码管开始循环显示。

    指导教师评语:

    1、 完成所有规定的实验内容,实验步骤正确,结果正确;

    2、 完成绝大部分规定的实验内容,实验步骤正确,结果正确;

    3、 完成大部分规定的实验内容,实验步骤正确,结果正确;

    评定等级:A (优秀) B (良好) C (中等) D (及格) E (不及格)

    成绩评定

    教师签字

    年 月 日

    备注:

    注:1、报告内的项目或设置,可根据实际情况加以补充和调整

    2、教师批改学生实验报告应在学生提交实验报告 10日内

    • 考试时间
    • 范文大全
    • 作文大全
    • 课程
    • 试题
    • 招聘
    • 文档大全

    推荐访问