51单片机——中断系统的使用

一、利用定时器/计数器0的工作方式1,实现一个发光二极管亮1秒、熄1秒,这样周期性的闪烁。

#include<reg51.h>

unsigned char num;
sbit D0 = P2^0;

void main()
{
	TMOD = 0X01; 	  //二进制为0000 0001,表示定时器/计数器为定时模式,工作方式为方式1;TMOD为定时器/计数器工作方式寄存器
	TH0 = (65536-45872)/256;    			/*TH0为计数器/定时器的高8位;1s=1000ms(毫秒)=1000000us(微秒);1000000远远大于65536,故把1000000拆成20份,一份50000us;
																		因为我的晶振是11.0592MHz,机器周期为1.09us;50000/1.09=45872;也就是我只要计45872下即可;即我应该给计数器中赋一个初始值(65536-45872=19664)
																		19664/256取模可得高8位,就是满256就在TH0中计1,不满的部分为TL0中的值*/
	TL0 = (65536-45872)%256;
	EA = 1; 													//EA为中断允许寄存器IE中的总开关中断控制位,EA=1,CPU开放中断
	ET0 = 1;													//ET0为定时器/计数器0的中断允许位,等于0时关闭,等于1时,开启
	TR0=1;                           //启动定时器T0
	while(1) 													//一直执行的
	{
		if(num==20)											//等待num到20,即满1S,然后灯进行变化
		{
			num = 0;D0=~D0;								//重置num归0,对灯进行取反变化   
		}
	}
}

void T0_time() interrupt 1          //T0_time是函数名,interrupt是一个关键字,表示51单片机中断,“1”是中断号
{
	TH0 = (65536-45872)/256;      		//重装初值
	TL0 = (65536-45872)%256;					//重装初值
	num++;														//每次中断发生后,中断服务程序要做的事就是num自加1,num等于几,就相当于用了多少个50ms
}

二、利用定时器/计数器0的工作方式1,实现八个发光二极管亮0.5秒然后熄灭,下一个再亮0.5秒熄灭,这样周期性的闪烁(流水灯)。

#include<reg51.h>

unsigned char num;

void main()
{
	TMOD = 0x01; 											//二进制为0000 0001,表示定时器/计数器为定时模式,工作方式为方式1;TMOD为定时器/计数器工作方式寄存器
	TH0 = (65536-45872)/256;    			/*TH0为计数器/定时器的高8位;1s=1000ms(毫秒)=1000000us(微秒);1000000远远大于65536,故把1000000拆成20份,一份50000us;
																		因为我的晶振是11.0592MHz,机器周期为1.09us;50000/1.09=45872;也就是我只要计45872下即可;即我应该给计数器中赋一个初始值(65536-45872=19664)
																		19664/256取模可得高8位,就是满256就在TH0中计1,不满的部分为TL0中的值*/
	TL0 = (65536-45872)%256;
	EA = 1; 													//EA为中断允许寄存器IE中的总开关中断控制位,EA=1,CPU开放中断
	ET0 = 1;													//ET0为定时器/计数器0的中断允许位,等于0时关闭,等于1时,开启
	TR0=1;                           //启动定时器T0
	while(1) 													//一直执行的
	{
		if(num==10)	P2 = 0xfe;
		else if(num==20) P2 = 0Xfd;
		else if(num==30) P2 = 0xfb;
		else if(num==40) P2 = 0xf7;
		else if(num==50) P2 = 0xef;
		else if(num==60) P2 = 0xdf;
		else if(num==70) P2 = 0xbf;
		else if(num==80){P2 = 0x7f;num = 0;}
	}
}

void T0_time() interrupt 1          //T0_time是函数名,interrupt是一个关键字,表示51单片机中断,“1”是中断号
{
	TH0 = (65536-45872)/256;      		//重装初值
	TL0 = (65536-45872)%256;					//重装初值
	num++;														//每次中断发生后,中断服务程序要做的事就是num自加1,num等于几,就相当于用了多少个50ms
}

三、使用外部中断0控制一个LED灯的亮灭

#include<reg51.h>

sbit D0 = P2^0;
sbit K3 = P3^2;

void main()
{
	EA = 1;			//CPU中断允许位
	EX0 = 1;    //外部中断0允许位
	IT0 = 1;    //下降沿触发方式(由高电平变低电平)
	while(1){
		K3 = 1;     //设置INT0脚为高电位,若按下键则会触发外部中断
	}
}
void it0() interrupt 0
{
	D0 = ~D0;
}

四、编程使LED灯点亮0.5秒然后熄灭,依次循环流动。用一按键当作暂停键,在次按下时流水灯从暂停位置继续流动。

#include<reg51.h>
#define uchar unsigned char

sbit K3 = P3^2;

uchar i=0,num;
void key()  //按键检测,若第一次按键i=1,进入循环,当再一次按键,i=0;跳出循环
{
	if(i==1)
	{
		while(1){
			if(i==0) break;
		}
	}
}

void lsd()  	 //流水灯函数
{
		if(num==10)	P2 = 0xfe;
		else if(num==20){P2 = 0Xfd;key();}
		else if(num==30){P2 = 0xfb;key();}
		else if(num==40){P2 = 0xf7;key();}
		else if(num==50){P2 = 0xef;key();}
		else if(num==60){P2 = 0xdf;key();}
		else if(num==70){P2 = 0xbf;key();}
		else if(num==80){P2 = 0x7f;key();num = 0;}
}

void main()
{
	EA=1;     //CUP中断开启
	EX0=1;		//外部中断
	IT0 = 1;    //外部中断下降沿方式
	ET0=1;		//定时器中断
	TMOD=0X01;	//定时器工作方式1
    TR0 = 1;    //启动定时器0;
	TH0 = (65536-45872)/256;
	TL0 = (65536-45872)%256;
	while(1){
	   K3 = 1;
	   lsd();
	}
}

void T0_time() interrupt 1
{
	TH0 = (65536-45872)/256;      		//重装初值
	TL0 = (65536-45872)%256;					//重装初值
	if(i==0) num++;				 						//若i=1时,暂停循环,则计数也暂停
}

void in0() interrupt 0
{
   i++;
	 if(i == 2) i = 0;               //当i累加到2时,重置0
}

CSDNicon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/136459998

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值