项目二 51项目数码管倒计时

项目  51项目数码管倒计时

【实验内容】

  1. 熟悉软件流程(Proteus 8 Professional,Keil uVision5),熟悉烧录流程,熟悉51芯片的引脚。
  2. 了解51单片机数码管的控制方法;
  3. 掌握使用定时器进行倒计时的方法;
  4. 实现数码管倒计时功能并在倒计时结束时停止。

【实验原理】

该实验利用51单片机控制数码管进行倒计时显示。通过控制两个数码管的开启和关闭,将倒计时的十位数和个位数分别显示在两个数码管上。使用定时器进行时间的控制,每经过一定的时间间隔,倒计时数减少1,直到倒计时结束(00)为止。

【实验记录与结果分析】

实验的结果是数码管会从99开始逐渐倒计时至00,并且倒计时会不断循环重复。具体分析如下:

1.实验开始时,延时1秒后,count被初始化为99V17被初始化为0

2.进入while循环后,V17自增1,当V17等于17时,V17被重置为0,此时count1。这样设计的目的是为了控制倒计时速度,每经过17次循环,count减少1,相当于倒计时速度变为原来的1/17

3.设置LED_0为低电平,LED_1为高电平,P2端口输出对应count的十位数码管的值,延时30ms

4.设置LED_0为高电平,LED_1为低电平,P2端口输出对应count的个位数码管的值,延时30ms

5.循环重复步骤2-4,实现倒计时的显示效果。

实验结果分析:通过以上逻辑,数码管将会从99开始逐渐倒计时至00,并且在每次倒计时过程中,数码管会显示相应的数字。当倒计时完成后,又会重新开始倒计时。

【电路原理图】

该电路包含一个8051系列单片机、两个数码管、两个NPN型晶体管、两个电阻和一个电容。其中,P2口连接了两个数码管的a~g、dp引脚,P3口连接了两个晶体管的基极。

当单片机工作时,输出控制信号使得LED_0和LED_1分别处于低电平和高电平状态。同时,将P2口输出对应count数码管对应的值,实现数码管的显示效果。在延时的过程中,通过调用delay()函数,使程序暂停一段时间,从而实现倒计时的效果。最后,通过两个晶体管的控制,实现对数码管的开关控制。

【程序代码】

#include <reg51.h>

#include <intrins.h>

sbit LED_0 = P3^0;    //定义LED_0引脚为P3口的第0

sbit LED_1 = P3^1;    //定义LED_1引脚为P3口的第1

unsigned char code LED_Tab[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

unsigned char count;     //倒计时的数值

unsigned char V17;    //辅助变量

void delay(unsigned int time)

{

       unsigned int j = 0;

       for (; time > 0; time--)

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

}

void main(void)

{

       delay(1000);    //初始延时1

       count = 99;    //初始倒计时数值为99

       V17 = 0;      //初始化辅助变量为0

      

       while(1)

       {

              V17++;    //辅助变量递增

              if (V17 == 17)    //辅助变量达到17时,进行一次倒计时

              {

                     V17=0;    //辅助变量清零

                     count--;    //倒计时数值减1

              }

              P2 = 0x00;    //清空P2

              LED_0 = 0;    //点亮LED_0

              LED_1 = 1;    //关闭LED_1

              P2 = LED_Tab[count / 10];    //在数码管上显示十位数的值

              delay(30);    //延时30ms

             

              P2 = 0x00;

              LED_0 = 1;

              LED_1 = 0;

              P2 = LED_Tab[count % 10];

              delay(30);

              _nop_();     //空操作,用于增加延时

       }

}

在主函数中,首先调用delay()函数延迟1秒钟,然后初始化count为99,V17为0。

接着进入while循环,在每次循环中,先将V17加一,判断是否达到了17。如果达到了17,则将V17清零,同时将count减1,实现倒计时的效果。

接下来,将P2口输出控制信号,使得LED_0和LED_1分别处于低电平和高电平状态。然后通过索引LED_Tab数组,将count的十位数或个位数对应的数码管值输出到P2口,实现数码管的显示效果。

在延时的过程中,通过调用delay()函数,使程序暂停一段时间,从而实现倒计时的效果。

最后,通过_nop_()指令,在程序执行过程中增加一个空操作,以保证程序能够正常运行。

【实验小结】

电路原理总结:

1:本实验使用了单片机STC89C52P3口连接了两个LED,分别命名为LED_0LED_1

2:数码管采用共阳极的显示方式,因此在进行数码管显示时,需要将相应的端口置低电平来点亮数码管的对应LED段。

3:使用了一个延时函数delay(),通过软件延时来控制LED的显示,从而实现数字递减的效果。

代码原理总结:

1:在主函数main()中,首先调用delay()函数进行一秒的延时。

2:初始化count为99,V17为0

3:进入while循环,V17每次加1,如果V17等于17,则将V17清零,同时将count1,实现倒计时的效果。

4:在循环中,通过设置P2口和LED_0、LED_1的状态,实现数码管的显示。具体来说,先点亮LED_0,然后通过P2口输出十位数对应的数码管值;接着点亮LED_1,通过P2口输出个位数对应的数码管值。

5:每次数码管显示后,通过延时函数delay()进行延时,从而实现数码管显示效果。

综上所述,该实验通过单片机控制LED和数码管的显示,实现了一个简单的倒计时功能。同时,通过延时函数控制LED和数码管的显示,使得整个倒计时过程呈现出视觉效果。

要将Keil uVision5中的代码烧录到Proteus 8 Professional中,可以按照以下步骤进行操作:

1)在Keil uVision5 中编写、调试并生成可执行文件(通常是.hex格式)。

2)打开Proteus 8 Professional,创建一个新的电路设计或打开现有的设计。

3)在 Proteus 8 Professional 的工具栏中选择 "PICK DEVICE" 工具来选择目标芯片。在弹出的窗口中输入芯片型号,并选择正确的芯片。

4)在 Proteus 8 Professional 的库管理器中,找到 "Virtual Instruments" 分类下的 "Hex File" 组件,并将其拖放到电路设计中。

5)右键单击"Hex File"组件,选择"Edit Properties"

6)在"Edit Hex File Properties" 窗口中,点击"..."按钮来浏览并选择生成的可执行文件(.hex文件)。

7)确认所选文件的地址范围与目标芯片的存储器空间匹配。如果需要,可以修改"Start Address" 字段来设置代码的起始地址。

  1. 单击"OK"按钮,关闭"Edit Hex File Properties"窗口。
  1. 连接所需的外部元件和引脚,确保与代码中的引脚连接一致。

10)单击Proteus 8 Professional的仿真按钮(通常是绿色播放按钮)来开始仿真。

  • 21
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值