单片机进中断后执行中断里的程序,比如你进定时中断,执行完后退出中断后做其他事,但定时还在计数,这样计数和做其他事情两不误。
你的程序中本来就没做其他事情,你的LED移动就是等待中断计数到10才操作的,LED动作的先决条件就是中断计数结束更多
亲,首先谢谢您无私的奉献,小弟还有一点不理解,就上面的这个程序,在第一次进入中断定时器数数的时候,主程序在干什么? 好像什么也没有做,在等呢?是不是这样?
下面的程序就不一样了,没进中断时执行主循环,有中断就进中断,中断执行完再回到中断前主程序执行的位置
进中断后,主程序就等啊,等中断退出才回到主程序
谢谢您 ,如果是进中断后,主程序在等,那和软件延时,感觉差不多啊!!软件延时好比是在等的时间内在数数 是这样吗? 小弟刚开始学单片机,所以脑袋有些不开翘,嘿嘿
在你这个程序是差不多的,但是软件延时,就一直在那计数,要不然中断计数,中断计数器满了才进中断累加的,比如说,要定时1分钟,用延时的话,这一分钟都在delay,不能做其他事情,中断的话中断累加10次到达1分中的话,不到0.1分钟内的时间不进中断,那这0.1分钟可以做其他事情,等到0.1后进中断,累加一次,就退出中断,再过0.1才进中断,这之间大部分时间可以做其他了
真的谢谢您无私的奉献,感谢
编写一个延时10秒的程序单片机
//假设晶振12MHZ
#include "reg51.h"
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) //500uS*20000=10000000us=10s
{
P1 = P1 ^ 0X01; //P1.0十秒钟翻转一次
YSJS = 0
}
}
关于51单片机用定时器1秒延时,这有个程序不知对了?求解。
你这个程序肯定不行,别说1秒,0.1秒都达不到,我帮你改一下:
void delay1()
{
uchar t = 19;
TMOD=0x10;
for(t=19;t>0;t--)
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(!TF1);//等待定时器1溢出标志置位
TF1 = 0;//清0标志位
}
}
你没有说明晶体振荡器频率,所以定时器初值和循环次数t按原程序
谢谢你,大侠,我写的错在哪了啊?晶体是12MHz的。
你没有等待定时器溢出,怎能达到延时效果。
单片机的延时程序
执行空语句执行124次,大概就能延时到1秒.不是很准的。
如要算的话:
比如51,mdelay函数想延时1ms,而执行for(i=0;i<124;i++),假设4个机器周期,每个机器周期时长为[12*(1/晶振频率)秒],若晶振为6MHz时,每个机器周期为2us,这样124*4*2是992us,加上for(;Delay>0;Delay--)需要的8us,正好延时1ms
单片机延时0.5秒的程序
晶振11.0592M下的标准延时函数:
void one_msDelay(uint16 mtime) //1ms延时函数
{
for(; mtime > 0; mtime--)
{
uint16 j = 650;
while(--j);
}
}
循环个500次就是0.5s,你可以用示波器测一下。
单片机延时一秒的c程序
单片机延时一秒
程序是不固定的
要根据你的晶振 计算出一次循环执行需要的时间
然后 写循环次数
一般是
voiddelay_one_second(void){
inti;
for(i=0;i<TIMES;i++);
}
这样就可以了。 TIMES是要计算的。或者 根据示波器 自己尝试。
利用定时器T0的工作方式1实现1秒钟延时程序(单片机)
#include <reg51.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar time;
void initT0( )
{
TMOD = 0x01; //定时器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中断一次
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
initT0();
while(1)
if(time==20) //中断20次,1s
{
time=0;
LED=!LED; //P1.0上的LED,1s亮或灭一次
}
}
void T0int( ) interrupt 1
{
TH0 = (65536-65536)/256;
TL0 = (65536-65536)%256;
time++;
}
转载请注明出处51数据库 » 单片机延时工具软件 51单片机软件延时和定时器的区别