这是我的第一篇有关51单片机的博客,主要记录我的学习历程与中间遇到的问题,如有错漏请指出。
在我理解里面中断与定时计数器是这样的:
中断是通过检查P3.2(INT0)与P3.3(INT1)两个引脚来触发的
计数器是通过检查P3.4(T0)与P3.5(T1)两个引脚的状态,要达到一定的次数(一般是记脉冲数)才触发
定时器不需要检测引脚,直接计数
先说中断的代码
#include
#include
#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
#include
#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
#include
#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
附一些有关这些寄存器的资料:
上一篇:51单片机中用中断方式实现串口数据发送与接收
下一篇:51单片机中断设置
推荐阅读最新更新时间:2024-03-16 16:08