项目二 51项目数码管倒计时
【实验内容】
- 熟悉软件流程(Proteus 8 Professional,Keil uVision5),熟悉烧录流程,熟悉51芯片的引脚。
- 了解51单片机数码管的控制方法;
- 掌握使用定时器进行倒计时的方法;
- 实现数码管倒计时功能并在倒计时结束时停止。
【实验原理】
该实验利用51单片机控制数码管进行倒计时显示。通过控制两个数码管的开启和关闭,将倒计时的十位数和个位数分别显示在两个数码管上。使用定时器进行时间的控制,每经过一定的时间间隔,倒计时数减少1,直到倒计时结束(00)为止。
【实验记录与结果分析】
实验的结果是数码管会从99开始逐渐倒计时至00,并且倒计时会不断循环重复。具体分析如下:
1.实验开始时,延时1秒后,count被初始化为99,V17被初始化为0。 |
2.进入while循环后,V17自增1,当V17等于17时,V17被重置为0,此时count减1。这样设计的目的是为了控制倒计时速度,每经过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:本实验使用了单片机STC89C52,P3口连接了两个LED,分别命名为LED_0和LED_1。 |
2:数码管采用共阳极的显示方式,因此在进行数码管显示时,需要将相应的端口置低电平来点亮数码管的对应LED段。 |
3:使用了一个延时函数delay(),通过软件延时来控制LED的显示,从而实现数字递减的效果。 |
代码原理总结: |
1:在主函数main()中,首先调用delay()函数进行一秒的延时。 |
2:初始化count为99,V17为0。 |
3:进入while循环,V17每次加1,如果V17等于17,则将V17清零,同时将count减1,实现倒计时的效果。 |
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" 字段来设置代码的起始地址。 |
|
|
10)单击Proteus 8 Professional的仿真按钮(通常是绿色播放按钮)来开始仿真。 |