00-59秒计时器(利用软件延时)

1.  实验任务

  如下图所示,在AT89S51单片机的P0P2端口分别接有两个共阴数码管,P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个位。

2.  电路原理图

4.11.1

3.  系统板上硬件连线

(1.       把“单片机系统”区域中的P0.0/AD0P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个ah端口上;要求:P0.0/AD0对应着aP0.1/AD1对应着b……P0.7/AD7对应着h

(2.       把“单片机系统”区域中的P2.0/A8P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个ah端口上;要求:P2.0/A8对应着aP2.1/A9对应着b……P2.7/A15对应着h

4.  程序设计内容

(1.       在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,从新秒计数。

(2.       对于秒计数单元中的数据要把它十位数和个数分开,方法仍采用对10整除和对10求余。

(3.       在数码上显示,仍通过查表的方式完成。

(4.       一秒时间的产生在这里我们采用软件精确延时的方法来完成,经过精确计算得到1秒时间为1.002秒。

DELY1S:        MOV R5,#100

D2:                MOV R6,#20

D1:                MOV R7,#248

                     DJNZ R7,$

                     DJNZ R6,D1

                     DJNZ R5,D2

                     RET

5.  程序框图

 

 

 

 

 

 

 

 

 

 

 

 

4.11.2

6.  汇编源程序

Second                 EQU 30H

                            ORG 0

START:               MOV Second,#00H

NEXT:                MOV A,Second

                           MOV B,#10

                            DIV AB

                            MOV DPTR,#TABLE

                           MOVC A,@A+DPTR

                            MOV P0,A

                            MOV A,B

                           MOVC A,@A+DPTR

                            MOV P2,A

                            LCALL DELY1S

                           INC Second

                            MOV A,Second

                            CJNE A,#60,NEXT

                           LJMP START

DELY1S:             MOV R5,#100

D2:                      MOV R6,#20

D1:                     MOV R7,#248

                            DJNZ R7,$

                            DJNZ R6,D1

                           DJNZ R5,D2

                            RET

TABLE:              DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

                            END

7.  C语言源程序

#include <AT89X51.H>

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,

                            0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char Second;

void delay1s(void)

{

  unsigned char i,j,k;

  for(k=100;k>0;k--)

  for(i=20;i>0;i--)

  for(j=248;j>0;j--);

}

void main(void)

{

  Second=0;

  P0=table[Second/10];

  P2=table[Second%10];

  while(1)

    {

      delay1s();

      Second++;

      if(Second==60)

        {

          Second=0;

        }

      P0=table[Second/10];

      P2=table[Second%10];

    }

}
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以为你提供一些建议:使用Keil 5可以利用51单片机595数码管来实现计时器功能。首先,你可以在Keil 5中编写51单片机595数码管的程序,然后将其烧写到51单片机中,最后,将51单片机595数码管和实物硬件连接起来,就可以实现计时器功能了。 ### 回答2: 要使用Keil5编写一个51单片机595数码管计时器,我们需要以下步骤: 1. 准备硬件:首先,需要准备一个8051系列的单片机开发板,如STC89C52RC。还需要一个共阳极595数码管模块,如TM1637,以及相应的连接线。 2. 连接硬件:将单片机和595数码管模块通过连接线连接在一起。确保连接正确,例如将引脚VCC连接到3.3V电源,GND连接到GND,CLK连接到P0.0引脚,DIO连接到P0.1引脚。 3. 创建新工程:在Keil5中创建一个新的工程,选择合适的51单片机型号,将工程保存在指定的位置。 4. 编写代码:在主程序中开始编写代码。首先,需要定义一些必要的引脚和变量。例如: ```c sbit CLK = P0^0; // 定义CLK引脚为P0.0 sbit DIO = P0^1; // 定义DIO引脚为P0.1 unsigned char code number[] = { // 数码管显示数字的编码 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; ``` 然后,可以编写一些函数来实现数码管的控制,例如: ```c void CLK_Pulse(void) { CLK = 0; CLK = 1; } void DIO_Write(unsigned char data) { unsigned char i; for (i = 0; i < 8; i++) { DIO = data & 0x01; CLK_Pulse(); data >>= 1; } } void Display(unsigned char digit, unsigned char number) { DIO_Write(0x44); // 设置写入控制命令,选择指定的数码管 DIO_Write(digit); // 写入要显示的数字 DIO_Write(number); // 写入编码的数字 } ``` 5. 编写主函数:在主函数中可以实现计时器的逻辑。例如,可以使用定器T0来进行计,并在数码管上显示计结果。 ```c void main() { unsigned int count = 0; TMOD = 0x01; // 设置T0为16位定器 TH0 = 0xFC; // 1ms TL0 = 0x18; ET0 = 1; // 允许T0中断 TR0 = 1; // 启动T0 EA = 1; // 允许总中断 while(1) { if(count < 1000) { Display(0, count % 10); // 在第一个数码管显示个位数 } else { Display(0, number[count / 1000]); // 在第一个数码管显示千位数 } count++; if(count == 10000) { // 计到达10000复位计数器 count = 0; } } } ``` 6. 编译和下载:使用Keil5编译程序,生成HEX文件。然后,通过单片机开发板的烧录工具,将HEX文件烧录到单片机中。 7. 调试和调整:如果计时器无法正常工作,可以通过调试工具来检查和修复问题。例如,可以检查引脚连接是否正确,是否有编程错误等。 通过以上步骤,我们就可以利用Keil5成功编写一个51单片机595数码管计时器。 ### 回答3: 利用Keil5软件编写51单片机595数码管计时器可以分为以下几个步骤: 1. 硬件连接:将51单片机与595数码管进行硬件连接。其中,P0口连接到595的数据输入(DS),P2口连接到595的钟输入(SHCP),P3口连接到595的锁存信号输入(STCP)。 2. 编写程序:在Keil5中新建一个工程,选择适合的单片机型号。在 main 函数中,定义相应的引脚和变量,指定引脚的输入输出方向。使用循环语句,在一个无限循环中实现计时器功能。 3. 实现计功能:可以使用定器/计数器模块对计时器进行计。设置定器计数值,并开启定器中断。在定器中断服务函数中,对计时器进行累加,并将累加结果转化为要显示的格式。 4. 显示到数码管:通过595数码管芯片的串行输入接口,将计时器的显示结果一个一个写入芯片中。通过控制钟信号,依次将数据写入到595芯片。然后通过锁存信号,将数据复制到595芯片的并行输出中,最终显示在数码管上。 5. 设置按键功能:可以通过外部按键来设置计时器的启动、暂停和复位功能。通过对按键的检测,并设置相应的状态位,来控制计时器的运行状态。 综上所述,利用Keil5写一个51单片机595数码管计时器,需要进行硬件连接、编写程序、实现计功能、显示到数码管和设置按键功能等步骤。编写好程序后,可以进行编译、下载到单片机并进行调试,最终实现一个功能完善的595数码管计时器

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值