单片机进中断后执行中断里的程序,比如你进定时中断,执行完后退出中断后做其他事,但定时还在计数,这样计数和做其他事情两不误。
你的程序中本来就没做其他事情,你的LED移动就是等待中断计数到10才操作的,LED动作的先决条件就是中断计数结束更多
亲,首先谢谢您无私的奉献,小弟还有一点不理解,就上面的这个程序,在第一次进入中断定时器数数的时候,主程序在干什么? 好像什么也没有做,在等呢?是不是这样?
下面的程序就不一样了,没进中断时执行主循环,有中断就进中断,中断执行完再回到中断前主程序执行的位置
进中断后,主程序就等啊,等中断退出才回到主程序
谢谢您 ,如果是进中断后,主程序在等,那和软件延时,感觉差不多啊!!软件延时好比是在等的时间内在数数 是这样吗? 小弟刚开始学单片机,所以脑袋有些不开翘,嘿嘿
在你这个程序是差不多的,但是软件延时,就一直在那计数,要不然中断计数,中断计数器满了才进中断累加的,比如说,要定时1分钟,用延时的话,这一分钟都在delay,不能做其他事情,中断的话中断累加10次到达1分中的话,不到0.1分钟内的时间不进中断,那这0.1分钟可以做其他事情,等到0.1后进中断,累加一次,就退出中断,再过0.1才进中断,这之间大部分时间可以做其他了
真的谢谢您无私的奉献,感谢
51单片机两个定时器同时使用程序,望大神解答一二!拜谢~~!!
定时时间是一样的,但是由于先启动的是T1定时器(TR1=1),所以T1先溢出,首先相应的是T1定时器中断。
怎么用51单片机定时1个小时 好像是循环,具体汇编程序是怎样的??
简单啊。
大致说来就是
你先开启个定时器,根据你选用的晶振,计算出你要用定时器定时的基准时间,
就假设是10毫秒吧。
然后给定时器的THx,TLx写入初值,开启中断,进行定时。
然后就等待中断。
在你响应中断的程序中,再次给单片机送入初值,
由于是10毫秒中断一次,因此我们设置几个“软件计数器”
比如每此中断,软甲计数器+1,
例如“软件计数器1”在中断程序中计数100次,则是10ms*100=1s
而“软件计数器2”在1的基础上继续计数100次,则是1S*100=100S
而“软件计数器3”在2的基础上继续计数36次,则是100S*36=3600S=1小时。
关于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的。
你没有等待定时器溢出,怎能达到延时效果。
51单片机定时程序 定时六个小时
采用软计时器,即用寄存器的值乘以定时器溢出时间,以加长定时时间
51单片机定时器精确定时方法
他可以通过定时器T0 T1啊,这两个就是精确定时的,误差在零点几微秒,
一般51单片机的 1个机器周期=12个振荡周期,即记术频率为晶振频率的1/12.
定时时间=(2的X次方-初值)*机器周期。x又定时器工作方式决定。分别为13. 16 。 8.
机器周期=12/系统的晶振。
比如 系统晶振频率为12MHZ,则机器周期为1微妙秒。
51单片机程序定时器怎么这么不准确啊,求高手指点!
这是编译器造成的,你最好用Debug模式看看生成的汇编代码是什么摸样,比较一下你那三种方 式给TH0和TL0赋的是什么样的值。
这是我试验的结果:
4: TH0=-780/256;
C:0x0003 758CFD MOV TH0(0x8C),#0xFD
5: TL0=-780%256;
C:0x0006 758AF4 MOV TL0(0x8A),#0xF4
6: TH0=-516/256;
C:0x0009 758CFE MOV TH0(0x8C),#0xFE
7: TL0=-516%256;
C:0x000C 758AFC MOV TL0(0x8A),#0xFC
8: TH0=(65536-516)/256;
C:0x000F 758CFD MOV TH0(0x8C),#0xFD
9: TL0=(65536-516)%256;
C:0x0012 758AFC MOV TL0(0x8A),#0xFC
看出差别了吧?使用-780时给T0赋值0xFDF4,使用第三种方式赋值为0xFDFC,这两个数字相近,所以结果基本正确。但是使用-516时赋值的0xFEFC,这差别就大了,结果就是不正确。
一般建议用TH0=(65536-516)/256 ;TL0=(65536-516)%256;这种方式,保证不出问题。
51单片机定时器精确定时方法
精确定时一般用汇编来写,如果你选用晶体 F=12MHZ,则定时器每加一就是 1uS,这样就可以设定定时器的初始值了,
如果你需要50mS的定时,定时器初始值为:65536-50000=15536 即 3CH,B0H TH0=3CH TL0=B0H (设定时器0用来定时,工作在16位 MOV TMOD,#11H)如果你需要更长时间定时则需要软件计时了,比如一秒,需要 (50ms *20=1000ms) 20次了,这需要在定时器0的中断程序中计算了!
转载请注明出处51数据库 » 51软件定时程序 51单片机软件延时和定时器的区别