用定时器就可以了,很简单的 这是我的60s倒计时程序
#include"reg51h"
char i,j,m,y;
unsigned char count=0;
unsigned char a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit p34=P3^4;
sbit p35=P3^5;
sbit warning=P3^7;
void delay()
{
TH0=0xd8;
TL0=0xf0;
TR0=1;
while(!TF0);
TF0=0;
}
main()
{ warning=0;
TMOD=0x01;
for(m=0;m<50;m++)
{
P0=a[6];
p35=1; p34=0;
delay();
P0=a[0];
p35=0; p34=1;
delay();}
while(1)
{
for(i=5;i>=0;i--)
for(j=9;j>=0;j--)
for(m=0;m<50;m++)
{ P0=a[i];
p35=1; p34=0;
if(i==1&j==0)
{warning=1;
if(m>25)
warning=0;}
if(i==0)
{warning=1;
if(m>25)
warning=0;}
delay();
P0=a[j];
p35=0;
p34=1;
delay();}
}
}
你要搞懂中断的含义,如果你想中断延时 有个方法可以使用下
当中断产生的时候,进入中断服务函数处理中断程序时,你可以延时你想要延时的时间。处理完毕再回到原程序,这样就达到了延时的目的,不过这是画蛇添足。
如果你是想一段时候后让MCU做什么事,那就是定时用法了,与延时没什么关系。
中断服务函数越简单越好
原理:只是执行一些所谓的“无实际意义的指令”,如缩放或执行一个int自加,简单地说,就像高中数学中的“乘法原理”一样,很容易迅速增加上面提到的“无意义指令”的数量
关于大小的值:如果是在C语言中,该值不仅与水晶振动、单片机本身的速度,但也与C的编译器,所以,虽然这个值可以精确计算,但大多数情况下,程序员是经验值。
当然,如果你在汇编中编程,情况就不同了,因为每条指令使用一定数量的机器周期,你当然可以根据所有指令使用的总时间来计算特定延迟的总时间。
扩展资料:
定义延迟XMS毫秒的延迟函数
Voiddelay(unsignedintXMS)//XMS表示需要延迟的毫秒数
{
无符号intx,y;
For(x=XMS;X0;X-)
For(y=110;Y”0;Y-);
}
使用:
VoidDelay10us(ucharMs)
{
Uchar数据我;
(;女士“0;------Ms)
对于(I = 26)我> 0;我-);
}
I=[(延迟值-1.75)*12/ms-15]/4
很简单的
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
sbit fengmingqi=P0^0; //声明IO口
void delay(uint x)//延时子函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=50;j>0;j--);
}
void main(void)
{
while(1) //循环
{
fengmingqi=1; //p00口高电平,蜂鸣器发声
delay(500); //延时
fengmingqi=0; //p00口低电平,蜂鸣器不发声
delay(500); //延时
}
}
几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响。
500ms延时子程序程序:(晶振12MHz,一个机器周期1us。)
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
扩展资料
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。
频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。
51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12(1/ 晶振频率)= x μs。常用单片机的晶振为110592MHz,12MHz,24MHz。
其中110592MHz的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
开始按下时,显示零秒,p10一直输出高。再按一下。显示1,p10灯亮一秒,
----
应该从没有按,就开始显示零秒。
;使用 110592MHz,程序如下。
LED BIT P10
KEY BIT P17
ORG 0000H
SJMP START
ORG 000BH
MOV TH0, #4CH
SETB F0
RETI
;--------------------------------------
START:
MOV TMOD, #01H
MOV TH0, #4CH
MOV TL0, #00H ;50ms@110592MHz
SETB TR0
MOV IE, #82H
;--------------------------------------
M_LOOP:
MOV R2, #0
LP0:MOV A, R2
ADD A, #(TAB - $ - 3)
MOVC A, @A + PC
MOV P2, A
MOV P0, A
MOV A, R2
MOV B, #20
MUL AB
LP1:MOV R3, A
LP2:CJNE R2, #0, LP3
SETB LED ;LED 在P10
JZ K_I
LP3:JNB F0, K_I
CLR F0
DJNZ R3, LP2
CPL LED ;LED 在P10
SJMP LP1
K_I:JB KEY, LP2 ;按键在P17
MOV R6, #10
DJNZ R7, $
DJNZ R6, $ - 2
JB KEY, LP2
JNB KEY, $
INC R2
CJNE R2, #6, LP0
SJMP M_LOOP
;--------------------------------------
TAB:
;共阳段码
DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H
DB 080H, 90H, 88H, 83H,0C6H,0A1H, 86H, 8EH
END
j=t100;这一句了,如果把这一句给删了,那么你的程序就是延时100ms的,delay(10)就是延时一秒。为什么会延时一秒,那就要看你单片机的晶振是多大,以及程序的执行速度有关了,可以用仿真试试看
以上就是关于80c51单片机120秒延时程序怎么编写全部的内容,包括:80c51单片机120秒延时程序怎么编写、51单片机调用定时器0做延时函数,求教,怎么才能做到用定时器的延时!、51单片机C语言程序中延时函数delay的原理是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)