计算延时时间应注意以下几点: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单片机时间程序怎么不会动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)