
单片机中做延时,如果是时间比较短的情况,和单片机的机器周期时间,或单片机运行单个命令的时间是同一个单位时间的话,那么用循环运行一些没有动作的命令来延时,算每个命令的时间是多少,循环了多少次,那延时时间就可以算出来的了。
另外一种延时,时间相对机器周期的单位时间来说比较大,好像要MS,S 以上,那么可以用单片机的定时器来做,那就比较准确的时间的了,
用定时器就可以了,很简单的 这是我的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();}
}
}
1、十秒对于单片机来说是很长很长的时间了,单片机十秒的时间什么事都不能做,只在跑这延时程序,那是什么概念,用中断的话,单片机正常运行其他程序,只是时间到了才过来处理延时以后的程序,效率不知道高了多少 。
2、例程:
//假设晶振12MHZ
#include "reg51h"unsigned int YSJS=0;
void main(void)
{
TMOD |= 0X10; //定时器1工作于方式1,16位定时器
TH1 = 0XFF; //定时器1定时时间=500uS
TL1 = 0X06;
ET1 = 1; //使能定时器1中断
EA =1; //开总中断
while(1)
{
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFF; //定时器1定时时间=500us
TL1 = 0X06;
YSJS++;
if(YSJS==20000) //500uS20000=10000000us=10s
{
P1 = P1 ^ 0X01; //P10十秒钟翻转一次
YSJS = 0
}
}
1 sleep()是以毫秒计算的,延时5秒是sleep(51000);,延时5分是sleep(5100060);
2包含的头文件看你用的什么编辑软件。
3我用的VC++是用包含在#include<windowsh>头文件中。
#include<stdioh>#include<windowsh>//Sleep()的头文件 main() { int i;
int n=10;for(i=1;i<=n;i++) {printf("%d",i);Sleep(5100060);} //
这里修改延时时间,
有些人说是用#include<dosh>做头文件你自己试下吧。
还用Sleep的S是大写的,不是小写的。
以上就是关于单片机延时程序怎么写是根据什么原理写的有什么方法吗全部的内容,包括:单片机延时程序怎么写是根据什么原理写的有什么方法吗、80c51单片机120秒延时程序怎么编写、用C语言怎么在单片机AT89C51上编写一个延时10秒的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)