再次重新启动。
用C语言实现的,先要定义好定时器的初值,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期,机器周期=12/n(n指晶振频率),假设你要定时的时间为M,那么定时的初值为:M/机器周期=初值;
TH0=(65536-初值)%256;
TL0=(65536-初值)/256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值,例如用12M晶振做1ms定时计算如下:
机器周期=12/1210^6=1us(微秒)
定时初值=(110^-3)/(110^-6)=1000;
所以:TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
将65536-1000=64536化为16进制为:0xFC18,TH0=0xFC,TL0=0X18;
定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:timer0() interrupt 1 // 1ms延时(120MHz)
试试看:
ORG 0000H
JMP MAIN
ORG 0013H
AJMP INT
JMP MAIN
TAB:
DB 0X01, 0X02, 0X04, 0X08
DB 0X10, 0X20, 0X40, 0X80
MAIN:
SETB EA
SETB EX1
MOV DPTR, #TAB
LOOP:
MOV R1, #8
MOV B, #0
AGAIN:
MOV A, B
MOVC A, @A+DPTR
MOV P1, A
INC B ;下一个状态
CALL DELAY
DJNZ R1, AGAIN
JMP LOOP
DELAY:
MOV R6, #2
LOOP3: MOV R5, #255 ;延迟0。5秒
LOOP2: MOV R4, #255
LOOP1: NOP
NOP
DJNZ R4, LOOP1
DJNZ R5, LOOP2
DJNZ R6, LOOP3
RET
INT:
MOV P2, #0XAA
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
MOV P2, #0XFF
MOV A, B ;显示下一个状态
MOVC A, @A+DPTR
MOV P1, A
INC B
RETI
END
按键一头接在外部中断口,一头接地。按一次触发一次。
void main()
{
EA=1; //开总中断开关
EX0=1; //打开外部中断0开关
IT0=1; //触发方式设置
while(1)
{
省略
}
}
void int0 () interrupt 0//外部中断函数
{
led0=0;
delay_ms(1000);//延时1s
led0=1;
}
解释2个if
num2++;//定时器中断一次加一
if(num2==20)//如果num2加了20次了那么
{num2=0;num++;//把num2加的数清0,num进这个if一次加一次
if(num==60)num=0; 如果num2加了20次了那么,把num加的数清0
shi=num/10;//求模
ge=num%10;//求余
}
主程序和中断没关系的,主程序是个死循环,一直执行。中断是打断主程序进入中断子程序,中断完成后继续执行主程序。中断标志要在进入中断后清除,如果不清除,下次不会再触发。主程序继续执行无影响。
TR0是启动定时器,启动以后不要再改写就好每到定时时间进入中断。进入中断后要清除中断使能标志,不是叫你关闭定时器。这两种不是一个概念。定时器控制寄存器里面有一个中断标志A,为1的时候代表进入中断,进入中断后A要清零,之后才会继续查看A是否再次为1,为1即进中断,在中断写零,如此循环进行。
关闭或者重新开启TR0,标志A都是硬件自动重新装载(初始化)0,以使中断执行。所以也能达到效果,但是每次执行都重新设置定时器会比较耗费资源,其实只需要清零标志位就ok了。
以上就是关于51单片机定时器中断程序全部的内容,包括:51单片机定时器中断程序、关于51单片机一个简单的外部中断程序,求教~、51单片机中断系统外部中断设计程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)