51单片机的中断与定时计数器尝试

这是我的第一篇有关51单片机的博客,主要记录我的学习历程与中间遇到的问题,如有错漏请指出。

在我理解里面中断与定时计数器是这样的:

中断是通过检查P3.2(INT0)与P3.3(INT1)两个引脚来触发的

计数器是通过检查P3.4(T0)与P3.5(T1)两个引脚的状态,要达到一定的次数(一般是记脉冲数)才触发

定时器不需要检测引脚,直接计数


先说中断的代码

#include<reg51.h>
#include<intrins.h>

#define SDT P0//静态数码管定义

unsigned char temp;

unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模

void delay10ms(unsigned int c)
{
	unsigned int i,j;
	for(;c>0;c--)
		for(i=38;i>0;i--)
			for(j=130;j>0;j--);
}

void interCongf()
{
	//设置中断0
	IT0=1;//IT=0表示低电平触发   IT=1表示负跳变沿触发
	EX0=1;//EX为外部中断的允许位
	PX0=0;//PX=0表示低优先级   PX=1表示高优先级
	//设置中断1
	IT1=1;
	EX1=1;
	PX1=1;//中断1的优先级比中断0高

	EA=1;//总中断允许位
}

void main()
{	
	unsigned char ininum=0;
	interCongf();
	SDT=0x00;
	while(1){}		
}

void inter0() interrupt 0	//外部中断0
{
	EX0=0;
	for(temp=0;temp<10;temp++) //中断内部无法定义函数
	{
		SDT=SDT_map[temp];
		delay10ms(10);
	}
	EX0=1;	  //在开始和结尾关开中断,防止中断运行过程中误触
}

//void timer0() interrupt 1  {}  //定时器中断0   

void inter1() interrupt 2	//外部中断1
{
	EX1=0;
	SDT=0xff;
	delay10ms(30);
	EX1=1;
}
		   
//void timer1() interrupt 3  {}  //定时器中断1

//void serialport() interrupt 4  {} //串行口中断


其中,SDT为共阳极静态数码管,P3.2(INT0)与P3.3(INT1)两个引脚分别接两个共阴的开关K1与K2

这个程序的功能就是无按键时,数码管全亮(0x00),

当按下K1时,数码管从一走到九

当按下K2时,数码管熄灭600ms,如果在INT0的执行过程中按K2,INT0会被中断(其实是挂起),立刻执行INT1,完成INT1后再返回INT0


然后说说计数器

#include<reg51.h>
#include<intrins.h>

#define SDT P0//静态数码管定义
sbit pulse=P1^0;

unsigned char temp=0;

unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模

void delay10ms(unsigned int c)
{
	unsigned int i,j;
	for(;c>0;c--)
		for(i=38;i>0;i--)
			for(j=130;j>0;j--);
}

void timeConfg()
{
	TMOD=0x05; //选用计数模式和 选用模式1
	TH0=0xD8;
	TL0=0xF6; //计数10000次
	EA=1;
	ET0=1;
	TR0=1;
}

void main()
{
	SDT=0xff;
	timeConfg();	
	while(1)
	{
		pulse=0;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		pulse=1;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}		
}

//void inter0() interrupt 0   {}	//外部中断0

void timer0() interrupt 1    //定时器中断0
{
	TH0=0xD8;//如果不更新TH0与TL0的值,第二次计数将从0~65535+1
	TL0=0xF6;
	SDT=SDT_map[(temp++)%10];	
}

//void inter1() interrupt 2   {}	//外部中断1
		   
//void timer1() interrupt 3  {}  //定时器中断1

//void serialport() interrupt 4  {} //串行口中断


定时器

#include<reg51.h>
#include<intrins.h>

#define SDT P0//静态数码管定义

unsigned char temp=0, status=0;

unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模

void timeConfg()
{
	TMOD=0x01; //选用定时器模式和 选用模式1
	TH0=0xd8;
	TL0=0xf0; //定时  计数10000次
	EA=1;
	ET0=1;
	TR0=1;
}

void main()
{
	SDT=SDT_map[temp];
	timeConfg();	
	while(1)
	{
		if(status==100)
		{
			temp++;
			status=0;
			SDT=SDT_map[temp%10];
		}
	}		
}

//void inter0() interrupt 0   {}	//外部中断0

void timer0() interrupt 1    //定时器中断0
{
	TH0=0xd8;//如果不更新TH0与TL0的值,第二次计数将从0~65535+1
	TL0=0xf0;
	status++;	
}

//void inter1() interrupt 2   {}	//外部中断1
		   
//void timer1() interrupt 3   {}  //定时器中断1

//void serialport() interrupt 4  {} //串行口中断


其实定时器和计数器很相似,只用在TMOD里修改就行


总结:

其实中断,计数器,定时器很相似

共用的寄存器:定时计数器控制寄存器TCON, 中断优先寄存器IP 和 中断允许寄存器IE

定时计数器特有的寄存器:工作方式寄存器TMOD


附一些有关这些寄存器的资料(转自 普中科技,侵删)




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值