51单片机延时程序时间计算

51单片机延时程序时间计算,第1张

计算延时时间应注意以下几点:1、晶振跑多少的,象这里的6M的话,那么它执行的机器周期就是2us,2、看指令执行要多少个机器周期,向DJNZ、RET都要两个机器周期,3、那么,这里总共时间是26(1A)255(0FF)255(0FF)2(机器周期)2us(1个机器周期的时间)=6762600us 若要精确计算的话要加上上面赋值的时间和子程序返回的时间。不过一般只要计算到上面就行了,因为赋值和返回指令的时间很短(相对于整个延时程序来说)希望对你有所帮助

这简单,定时部分交给定时器,把定时器的优先级设置为高优先级,就可以了

怕程序麻烦的话,显示部分可以用几个芯片实现静态显示 ,即使定时器不工作,它也能显示当前的时间,直到有更新信号将时间更新。

您好:

问题应该出在动态扫描显示的for循环里,你检查一下吧,我写了一下代码,不过没有看过你的硬件电路,所以不知道对不对,你参考一下吧。

#include <reg52h>

#include <INTRINSH>

unsigned char cont=0, sec=35,min=22,hour=14;

unsigned char code led_table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x40

};//段码表

void time() interrupt 3 //中断函数

{

TH1 = 0x4c;

TL1 = 0x00;

cont++;

if(cont==20)

{

cont=0;

sec++;

if(sec==60)

{

sec=0;

min++;

if(min==60)

{

min=0;

hour++;

if(hour==24)

hour=0;

}

}

}

}

void delay_ms(void) //延时函数

{

unsigned char i,j;

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

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

}

void dis_time(void)

{

unsigned char a,i,led_out[7];

led_out[0]=led_table[sec%10]; //给八位数码管赋值

led_out[1]=led_table[sec/10];

led_out[2]=led_table[10];

led_out[3]=led_table[min%10];

led_out[4]=led_table[min/10];

led_out[5]=led_table[10];

led_out[6]=led_table[hour%10];

led_out[7]=led_table[hour/10];

a=0xFE; //位选变量初始化

for(i=0;i<8;i++) //动态扫描显示

{

P2=a; //送位选信号

P0=led_out[i]; //送段选信号

a=_crol_(a,1); //将a循环左移一位

delay_ms(); //延时

P0=0; //清段选,除留影

}

}

void main(void) //主函数

{

TMOD=0x10;

TH1=0x1c;

TL1=0x10;

EA=1;

ET1=1;

TR1=1;

while(1)

{

dis_time();

}

}

这是一个倒计时案例,你可以参考一下:

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

    MOV TMOD,#01H

    MOV TH0,#HIGH(65536-10000)

    MOV TL0,#LOW(65536-10000)

    SETB ET0

    SETB EA

 MOV R0,#9

 MOV R1,#9

 MOV R2,#0

 MOV R3,#9

 CLR 00H

 CLR 01H

LOOP:

 JB P10,LP01

 JNB P10,$

 SETB TR0

 CLR 01H

 SJMP LOOP0

LP01:

 JB P11,LP02

 JNB P11,$

 SETB 01H

 SJMP LOOP0

LP02:

 JB P12,LOOP0

 JNB P11,$

 CLR TR0

 MOV P3,#0FDH

 MOV P2,#0

 MOV P3,#0FEH

 MOV P2,#0

 SJMP MAIN

LOOP0:

 JB 00H,LOOP1

 MOV A,R0

 SJMP LOOP2

LOOP1:

 MOV A,R1

LOOP2:

 MOV DPTR,#TABLE

 MOVC A,@A+DPTR

 MOV R3,A

 SJMP LOOP

T0ISR:

    CLR TR0

    MOV TH0,#HIGH(65536-10000)

    MOV TL0,#LOW(65536-10000)

    SETB TR0

 JB 01H,T0C

 INC R2

T0C:

 CPL 00H

 MOV A,R3

 JB 00H,T001

 MOV P3,#0FDH

 MOV P2,A

 SJMP T002

T001:

 MOV P3,#0FEH

 MOV P2,A

T002:

 MOV A,R2

 CJNE A,#100,T0E

 MOV R2,#0

 MOV A,R0

 JZ T003

 DEC R0

 SJMP T0E

T003:

 MOV A,R1

 JZ T004

 DEC R1

 MOV R0,#9

T0E:

 RETI

T004:

 CLR TR0

 RETI

TABLE:      ; 共阴极数码管显示代码表

    DB    3FH,06H,5BH,4FH,66H ;01234

    DB    6DH,7DH,07H,7FH,6FH ;56789

END

ORG 0000H ;主程序入口

LJMP MAIN ;跳转到标号MAIN执行

ORG 000BH ;定时器T0中断入口

AJMP PTF0 ;跳转到标号PTF0执行

HOUR EQU 4AH ;赋值伪指令

MIN EQU 4BH

SEC EQU 4CH

BUFF EQU 4DH

;

;主程序

MAIN: MOV HOUR,#00H ;时,分,秒,标记清零

MOV MIN,#00H

MOV SEC,#00H

MOV BUFF,#00H

MOV SP,#60H ;设堆栈指针

MOV TH0,#3CH ;定时器赋初值

MOV TL0,#0B0H

MOV 40H,#14H ;设循环次数20次

MOV TMOD,#1 ;写TMOD

MOV IP,#2 ;写IP

MOV IE,#82H ;开中断

SETB TR0 ;启动定时器

LOOP: ACALL DISPLAY ;调用显示程序

JNB P30,FEN ;校时键按否?否,跳转到FEN

ZX: ACALL DISPLAY

JB P30,ZX

MOV A,HOUR ;时加1

ADD A,#1

DA A

CJNE A,#24H,BI ;时加到24时否是,清零

CLR A

BI: MOV HOUR,A

MOV SEC,#00H ;秒清零

FEN: JNB P31,YY ;校分键按下否?否,跳转到YY

ZC: ACALL DISPLAY

JB P31,ZC

MOV A,MIN ;分加1

ADD A,#1

DA A

CJNE A,#60H,CI ;分加到60否?是,清零

CLR A

CI: MOV MIN,A

MOV SEC,#00H ;秒清零

YY: AJMP LOOP

;

;中断服务程序

PTF0: MOV TH0,#3CH ;初值重装

MOV TL0,#0B0H

CLR TR0 ;关定时器

CLR A ;清A

DJNZ 40H,XX ;1秒到否?否,跳转到XX

MOV 40H,#14H ;重写循环次数

MOV A,SEC ;秒单元加1

ADD A,#1

DA A

MOV SEC,A

CJNE A,#60H,PTF0R ;60秒到否?否,跳转到PTF0R

JMIN: MOV SEC,#00H ;秒清零

MOV A,MIN ;分单元加1

ADD A,#1

DA A

MOV MIN,A

CJNE A,#60H, PTF0R ;60分到否?否,跳转到PTF0R

MOV MIN,#00H ;分清零

JHOUR: MOV SEC,#00H ;秒清零

MOV A,HOUR ;时单元加1

ADD A,#1

DA A

MOV HOUR,A

CJNE A,#24H, PTF0R ;24时到否?否,跳转到PTF0R

MOV HOUR,#00H ;时清零

AJMP PTF0R ;跳转到PTF0R

XX: MOV R7,40H ;给小数点做标记,1和0

CJNE R7,#0AH,NEQ

EQ: NOP

AJMP PTF0R

NEQ: JC YEQ

MOV BUFF,#00H

AJMP PTF0R

YEQ: MOV BUFF,#0FFH

AJMP PTF0R

PTF0R: SETB TR0

RETI

;

;显示子程序

DISPLAY: MOV R5,BUFF ;根据标记输出带点和不带点的数字

CJNE R5,#00H,CVB ;根据标记查不同的表

MOV DPTR,#TAB1

LJMP TYU

CVB: MOV DPTR,#TAB

TYU: MOV A,MIN ;显示分钟的个位

ANL A,#0FH

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#0F0h

CLR P24

ACALL DELAY

MOV A,MIN ;显示分钟的十位

SWAP A

ANL A,#0FH

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#0F0H

CLR P25

ACALL DELAY

MOV A,HOUR ;显示时钟的个位

ANL A,#0FH

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#0F0H

CLR P26

ACALL DELAY

MOV A,HOUR ;显示时钟的十位

SWAP A

ANL A,#0FH

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#0F0H

CLR P27

ACALL DELAY

RET

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;不带小数点的字型码

TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH ;带小数点的字型码

;

;延时子程序

DELAY: MOV R4,#20

YAN: MOV R5,#10

SHI: DJNZ R5,SHI

DJNZ R4,YAN

RET

END

以前我的单片机课程设计,提供给你参考参考,不过只有调分和调时的。。。

以上就是关于51单片机延时程序时间计算全部的内容,包括:51单片机延时程序时间计算、请问如何实现51单片机的长时间计时并且程序其他部分照常运行、看看我编的这个51单片机时间程序怎么不会动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10071935.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存