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

发布者:炉火旁的Yye最新更新时间:2018-07-12 来源: eefocus关键字:51单片机  中断  定时计数器 手机看文章 扫描二维码
随时随地手机看文章

这是我的第一篇有关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单片机的中断与定时计数器尝试

上一篇:51单片机中用中断方式实现串口数据发送与接收
下一篇:51单片机中断设置

推荐阅读最新更新时间:2024-03-16 16:08

关于ARM中断的具体的启动代码解释
关于中断的具体的启动代码解释: 可以这么理解,44B0 中断系统中有两张中断转移表,经过二重转移才跳到中断处理程序。第一张中断向量表由硬件决定,所在区域为ROM(flash),地址空间从0X00开始,其中0X00-0X 1C为异常向量入口地址,0X20-0XC0为中断向量入口地址。另一张中断向量表在RAM 中,可以随便改,其位置在程序连接后才定。由于 RAM 放在地址空间的高端(距离中断向量超过了 32M),为了从第一张中断向量表跳到第二张中断向量表,故在第一张中断向量表对应位置上写上 ldr PC,# interrupt_service 如:ldr PC,=HandlerEINT4567。 (1) 一级中断向量表
[单片机]
51单片机-中断的实验现象
1.卡顿的流水灯 我们用一个实验现象来再一次理解中断函数。 在主函数里我们使八盏灯不停地左右快速流水,此时若是被外部因素触发了中断函数的执行,我们就在中断函数里实现蜂鸣器响一下,看看此时主函数里的流水灯是什么现象。 代码下载进去,我们随意按K4,观察流水灯。 #include reg52.h #include function.h //详见第六章第8讲 void main() { u8 i,dir; IT1 = 1; //下降沿触发模式 EX1 = 1; EA = 1; LED_Init();//初始化LED硬件模块 KEY_Init();//初始化按键功能模块
[单片机]
编程点滴:8位AVR定时器比较匹配中断测试程序
程序实现以Timer0比较匹配中断方式控制LED以500ms为间隔产生亮灭变化。 TCCR0寄存器的WGM0位配置为CTC模式时,当比较匹配发生时会自动清除计数器,无需对TCNT0手动置零。 文件组成:测试程序 main.c ,定时器配置程序 timer_8bit_test2.c 和头文件 timer_8bit_test2.h 。 main.c /* ******************************************* * File name: main.c * Function: 8位定时器比较匹配中断方式测试程序 * Description: 定时器控制LED以500ms间隔闪烁 * Author
[单片机]
51单片机软件三重监视抗干扰技术
应用于工业过程控制和智能化仪器仪表的单片机,由于现场条件往往十分恶劣,不可避免地会受到各种各样的电磁干扰。当串入系统的干扰作用于单片机内部的CPU部件时,后果更加严重,将导致系统失控。最典型的失控故障是破坏程序计数器PC的状态,导致程序在地址空间内“乱飞”,或者陷入“死循环”。因此,尽可能早地发现程序失控,并采取相应的补救措施,是单片机应用系统抗干扰设计的重要内容。 使程序从“乱飞”状态纳入正轨的方法称为程序拦截技术,包括指令冗余技术、软件陷阱技术等。使程序摆脱“死循环”,通常多采用硬件电路实现的监视技术,又称“看门狗”技术(Watchdog)。常见的硬件“看门狗”电路有单稳态型“看门狗”电路、计数器型“看门狗”电路、微处理器监
[单片机]
基于C51单片机中的通信协议分享
一、基本格式: 通信头-》巴克码-》地址字-》长度字-》命令字-》信息位-》校准字 1.通信头:占1~8个字节,表通信开始(0x00、0xff不能用作通信头); 2.巴克码:占1字节,一般为0x72,表通信头结束; 3.地址字:表终端的地址,占1字节(0x00作为广播地址); 4.长度字:占1字节,表示从地址字到信息位之间的字节数; 5.命令字:占1字节,指示终端的不同操作; 6.信息位:不定长,从0~252字节; 7.校验位:两个字节,采用和校验及CRC校验。 二、应答 1.如果终端接收正确,则应答ACK;如果终端接收错误,则应答NAK; 2.发送方收到ACK,此次通信结束; 3.发送方收到NAK,重发刚才的命令字(最多7次
[单片机]
基于C<font color='red'>51单片机</font>中的通信协议分享
51单片机教程:数码管动态显示(0~99999999)74hc138驱动
数码管动态显示0~99999999 一、共阴极8位数码管原理 首先了解一些必要知识 1、多位数码管是扫描显示,也就是同一时刻只有一个数码管显示 2、视觉暂留效果:第一个数码管显示完,第二个数码管接着显示,接着后面数码管一次显示,当显示(扫描)足够快的时候,人眼是看不到闪烁的,就认为多个数码管是同时显示的 3、多位数码管只能同时显示多个一样的数字,要显示不同数字需要扫描显示 比如说要显示12345678,你看起来8个数码管是同时亮的,其实同一时刻只有一个数码管是亮的 我们把时间放慢,看看数码管都发生了什么变化: 1、第1毫秒 2、第二毫秒 3、第三毫秒 4、第四毫秒 5、第五毫秒 6、第六毫秒
[单片机]
<font color='red'>51单片机</font>教程:数码管动态显示(0~99999999)74hc138驱动
中断的原理和使用心得(一)
又是很长时间没有写东西了,感觉时间长不写人都变懒了。其实,说实话:不是我不写,我也在总结,单片机以前学过一次,都是这看一点,那看一点,没有系统的学习。现在工作闲的发慌,总感觉在浪费青春,才想起自己还有个爱好。就想把单片机系统的学一遍。所以,我现在也是一边学习、一边总结,可以说我也是个十足的菜鸟,还不如你呢! 很多单片机初学者都会对中断、定时/计数器、串口有些恐惧。原因有: 1.没学之前被老鸟吓。到,很多学单片机的新手问单片机难不难,就会有些老鸟故意吓唬说中断、定时器很难等等。 2.很多新手听说难学,在编程时会极力避免使用中断、定时器,以至于越不使用,越不会用,就越害怕使用。(其实我说的只是我自己遇到的一些,不必究其细节,目的
[单片机]
一种高效多串口单一中断源的芯片设计
  1概述   随着单片机技术的不断发展,单片机的应用越来越广泛,其中 51系列的单片机以价格低等优势始终占据着很大一块市场。但是,单片机串行口的数量通常都不多,比如 8051单片机只有一个串行口,实际使用往往要进行串行口的拓展。传统方法扩展多个串行口是利用多个中断源,而在嵌入式系统中,花费大量的中断源来扩展串口无疑是大量的资源浪费。   为更好地利用原有的资源去拓展串口,本设计利用单一中断源去拓展多个串行口,设计一个多串口单一中断源的芯片。该芯片能配合单片机进行数据读写及传送,并且能保证多个串口中断的无遗漏检测与服务。下一步,还将对设计进行一系列严格的仿真和仿真结果分析。结果表明,该设计具有较高的应用价值。   2 总体
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved