您的位置:首页 > 其它

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

2016-08-18 00:04 621 查看
这是我的第一篇有关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

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











内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单片机 80c51