高分求助,关于定时器(在线等待)(急)
几年前曾学过51系列,也编过程,但现在已几乎全忘,现在想做一个定时器,比如可以定2分钟叫一次,5分钟叫一次,等等,请问程序如何编
推荐阅读
问题太大
编程不难,
要先设计硬件:需要输入设置,到底是“定时叫醒”还是“间隔叫醒”?输出用蜂鸣器即可。如果要求在指定时间叫,需要用rtc。
软件思路:用系统定时器,累加到指定时间值后动作。
如此而已。
51的定时器直接定时最长只能到ms级,编程时要外扩计数值。
当外接晶体振荡器的频率是12mhz时,则每过一微秒定时器自动加一,直至溢出,也就可以实现“叫”一次,但是51定时器最多是16位计数,所以要把计数脉冲再分频,也就是“外扩技术值”
可以通过寄存器设置。具体的寄存器查看datasheet.
用几个变量对定时器计数到设定的时间间隔就可以了
我感觉用中断方式
先将定时器设为一个整数值,如60ms,然后在中断程序中,设定一个数值,如2000,进一次
中断减一,到0输出控制信号,就是2分钟。5分钟一样,只是设定数不同。
;定时器计数器0设置
ldi rx,$02
out timsk,rx ;定时器计数器t0溢出中断使能
ldi rx,$04
out tccr0,rx ;定时器计数器t0选择3.6864hz/256
ldi rx,$70
out tcnt0,rx ;设置t0中断时间为10ms,初值为70
;t0溢出中断子程序(10ms)
t0ovf: push rx ;保存中断前rx状态
push ry ;保存中断前ry状态
push acc ;保存中断前acc状态
in ssreg,sreg ;保存中断前sreg状态
wdr ;看门狗处理
dec count1
;
iexit: ldi rx,$70
out tcnt0,rx ;重新设置定时器0初值
out sreg,ssreg ;恢复中断前sreg状态
pop acc ;恢复中断前acc状态
pop ry ;恢复中断前ry状态
pop rx ;恢复中断前rx状态
reti
;==================================
dl002s: ldi count1,$02 ;延时20ms
d1: cpi count1,$00
brne d1
ret
自己做一个长延时的软件定时器。一个全局变量、 一个timer就可以搞定了。更方便的是用ds12887、 pcf8583、ds1302等rtc
再把51系列的书看一边,既然你以前用过,应该很快就可以重新捡起来!
51的t2是16位自装载的,可以精确读出th2和tl2。去atmel下载个52的datasheet吧。至于你说的功能,用t0 t1都可以做到。建议用自装载的方式。这样比较高精度。用c也很容易实现。
#include <reg52.h>
uchar timer_0;
uchar timer_1;
uchar sec;
uchar min;
uchar hour;
void timer(void)
{
timer_0+=1;
if(timer_0==200)timer_0=0;//中断1次的时间timer_0改变一次。例 100us一次则
}
void main(void)
{
bit c;
if(timer_0/100!=c)
{
c=timer_0/100;//中断100次改变一次
timer_1+=1;
if(timer_1==100)timer_1=0;
}
if(timer_1==99)
{
sec+=1;
if(sec==60)sec=0;
if(sec==59)min+=1;
if(min==60)min=0;
if(min==59)hour+=1;
if(hour==24)hour=0;
;//中断10,000次执行一次。此处为1s
}
}


讨论区