单片机定时器中断程序,C语言程序设计

单片机定时器中断程序,C语言程序设计,第1张

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

uchar keyval;

uchar led1=0xfe,led2=0x55,led3=0x0f;

sbit key=P1^0;

void t0isr() interrupt 1

{

TH0=(65536-60000)/256;

TL0=(65536-60000)%256;

switch(keyval)

{

case 1:

P0=led1;

led1=_crol_(led1,1)

break;

case 2:

P0=led2;

led2=~led2;

break;

case 3:

P0=led3;

led3=~led3;

break;

default:break;

}

}

main()

{

TMOD=0x01;

TH0=(65536-60000)/256;

TL0=(65536-60000)%256;

TR0=1;

ET0=1;

EA=1;

while(1)

{

if(key==0)

{

while(key==0);

keyval++;

keyval%=4;

}

}

}

按键一头接在外部中断口,一头接地。按一次触发一次。

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;//求余

}

跟你理清一下思路,你的问题就解决了。首先,你的程序很简单,就是让发光二极管1秒亮1秒灭。因此,你前提是要定时1秒,但51单片机无法定时1秒,因此,你的程序就要定时50毫秒,每到了50毫秒,你就让num自加1,当num加到20时,换句话说,已经定时50毫秒20次了,那就是1秒咯,所以此有led1=~led1;

//让发光管状态取反,达到程序目的。另外,定时50毫秒你要给th0和tl0赋给初值,因此

th0=(65536-45872)/256;

//重新装载初值tl0=(65536-45872)%256;才会有这两句,但定时50毫秒后,你的初值也会随之消失,因此才会在void

t0_time()这个函数中重新赋初值。的确像你所说的初值是装满了开始执行中断,其实从你tmod=0x01;

//设置定时器0位工作模式1(m1,m0位0,1)这句已经开始定时了,而赋初值是为了准确的定时50毫秒罢了。明白了没有?

(其实你可以这样理解,定时计数器就好比一个空的瓶子,当你给tmod=0x01时,水就开始一滴一滴的往瓶子你滴,当瓶子满了的时候,中断就发生了。假如从一个空的瓶子滴到满的瓶子定时是80毫秒的话,可你只需要定时50毫秒就够了,所以就要一开始往瓶子里倒水,使滴水的起点不是空瓶子,这就是赋初值的作用。当瓶子满了后,瓶子就会自动清空,重新从零开始。而第二次你再想定时50毫秒,你就必须从新再往瓶子里倒水,这就是第二次赋初值的作用)

以上就是关于单片机定时器中断程序,C语言程序设计全部的内容,包括:单片机定时器中断程序,C语言程序设计、51单片机中断系统外部中断设计程序、单片机定时中断实验等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9334509.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存