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

2018-07-12 22:06:17编辑:什么鱼 关键字: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单片机  中断  定时计数器

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/2018/ic-news071240280.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机实现LED流水灯(数组方式和位运算方式)

/* 名称:51单片机实现LED流水灯(数组方式和位运算方式)说明:今天又重新开始系统的学习51了,LED就算个开端吧。 要注意两点: 1、sfr和sbit是C语言扩展出来的关键字。其中sfr用于对特殊功能寄存器进行声明,sbit用于对某些特殊功能寄存器的某位进行声明。这里和宏定义很相似,但是不能用宏定义进行替换,对于前者是因为51单片机的寄存器存在于内部空间0x80-0xFF,这空间属于直接寻址,51特殊功能寄存只能直接寻址,不能间接寻址。如果用宏定义的话,在翻译成汇编时就会认为是通过总线访问对应的外部地址了。对于后者,sbit是定义一个标志位,也叫位变量。而类似于#define key1 P3
发表于 2018-07-21 13:08:22

51单片机之按键实验

/* 名称:51单片机之按键实验 说明:键盘是计算机最基础、最重要的输入设备之一。对于键盘来说,其工作任务大体可以分为以下三项: (1)、按键识别。即判断有无按键按下。 (2)、求键值。判断哪个键被按下。 (3)、执行相应的操作。 在这里,实验所用到的键盘为独立键盘和矩阵键盘。对于独立键盘,它的每个按键需要占用一个IO口。一般来说,按键一端接地,另一端接IO口。当按键按下时,线路被导通,IO口被拉低,即状态为‘0’。所以在使用是我们一般把对应IO口置成高电平,然后不断检测此IO口是否被拉低,从而判断按键是否按下。 对于矩阵键盘来说,它用较少的IO口完成较多个按键
发表于 2018-07-21 13:07:26

51单片机之数码管显示实验

/* 名称:51单片机之数码管显示实验 说明:对于数码管来说,其本质上可以理解为按照一定规则组合的多个二极管。其使用只需按照特定规则显示对应的二极管即可。要稍微注意一点的就是多个数码管的显示分为静态显示和动态显示。静态显示就是每个二极管显示的内容是一样的,通过片选信号来决定是哪个二极管该显示。动态数码管,即利用人眼的视觉停留效果,快速扫描,快速显示每个数码管的内容,使得每个数码管看起来好像是一起显示的一样。 本实验编写了几个数码管显示的简单程序。在此不做赘述了。*/#include <reg52.h>#define uchar unsigned char//共阳极段码(a在高位,dp在低位
发表于 2018-07-21 13:06:23

关于单片机死机的一些问题

最近的一个项目中测试系统的高低温实验,结果意外的发现经过高低温实验后(80℃到-20摄氏度)单片机有些已经死机了,所以不得不着手研究一下这个问题,在网上查阅资料后,基本上可以归结于以下几个问题:1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象 2. 中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。  3. 地址溢出,常见错误为指针操作
发表于 2018-07-16 20:31:16

单片机外部中断的两种模式

51单片机的外部中断有两种模式:电平触发模式和跳变沿触发模式第一,选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。第二,选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。 区别:电平触发模式时,中断标志寄存器不锁存电平中断请求信号。单片机把每个周期的S5P2采样外部中断口的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换言之,就是要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行
发表于 2018-07-16 20:29:36

基于80C51单片机——中断小结

最近看了一下80C51单片机的中断部分的实验,做一些笔记,方便以后学习查找。 首先说一下什么是中断吧,中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设(外部设备)请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去执行相应的服务处理程序;当服务处理程序运行完毕之后,CPU再返回到暂停处继续执行原来的程序。那什么是中断嵌套呢?简单点说就是低优先级的中断可以被高优先级的中断源所中断,等高优先级中断服务程序结束后,再返回去执行被中断的的低优先级的中断服务程序。举个简单的栗子吧(之前写过但不知道怎么删了,,又让我重新编辑):比如我们就是一个CPU,我们当前在洗衣服(当前程序),突然电话铃声响了(中断来了
发表于 2018-07-16 20:26:35

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved