您的位置 首页 元件

关于单片机的计时器与中止体系

关于嵌入式,我就自己的XXX长话短说一下,说来话就长了,学过Java、JavaWebandsoon,也做过一些东西,说实话成就感还是蛮大的,但是,学过

关于嵌入式,我就自己的XXX长话短说一下,说来话就长了,学过Java、JavaWebandsoon,也做过一些东西,说实话成就感仍是蛮大的,可是,学过之后却总是感觉这些东西都太粗浅了,用另一总话说来,便是感觉学这些东西,站在伟人的膀子上,却看不到伟人。什么东西都是封装好的,知道怎样用就行了,说实话,的确,学这些东西压力很小,可是总感觉不是真本事。所以出产实习的时分自己报的是Java,可是老是跑到嵌入式的去听课,之前也没听过嵌入式的课,所以是云里雾里。Java的课也没听过几节,最终做东西的时分底子不知道教师叫做个什么东西。关于Java的图形化编程我仍是比较厌烦的,没什么技术含量还费事的要死,到最终XXX说让我帮帮忙,说实话我是真的不会。出产实习的成果便是最终两端都没捞着好(嵌入式写了一些驱动,可是他们说跟他们用的接口不相同,最终发现教师给的有典范,直接依照上面改就行了,搞的我跟傻X相同,Java直接写都不想写,真不知道那段能两个星期不洗澡的日子是怎样熬过来的)。我自己感觉最终的大体方向便是:底层开发,包含操作系统什么的这一系列开发,当然,厚实的硬件、汇编、言语、算法等根底是少不了的。为什么写这些东西呢?由于在家大冬季的这么冷,手都不想伸出来写代码,只能学学理论,实践实践缺少了许多,所以写下加深形象,也为今后查资料便利(课程设计的时分我的博客真是一大宝库啊!!!:-),下面是以我的51单片机为例阐明的)。
下面进入正题:

1、计时器

下面先看一个图:

其间能够清楚的看到,TH0和TL0是两个8位寄存器,这两个寄存器组合成T0加1计数器,所以计数器为16位计数器。同理,TL1和TH1组合成了T1加1计数器。
再看TMOD寄存器,它是一个8位寄存器,姓名叫做作业方法寄存器,明显它是操控作业方法的,看电路图上看它有两条灰色的线条延伸到T0和T1,即它可操控T0和T1的作业方法,也能够清楚的看到,其低四位操控T0的作业方法,高4位操控T1的作业方法。
那么什么叫做作业方法呢?作业方法便是指开或许关,芯片是作业在守时形式仍是计数模式,和寄存器的运用情况。整体如下:
GATE是门控位,GATE=0时,TCON中TR0/TR1=1时可发动。
GATE=1时,TCON中TR0/TR1=1,且外部中止引脚为高电平时可发动。

C/T=0:守时形式。C/T=1:计数形式。

M1M0组合运用,其值如下:

00 13位守时/计数器
01 16位守时/计数器
10 8位主动重装守时/计数器
11 T0分红两个守时/计数器,T1中止

关于这四种方法的运用下面再介绍。

再看TCON寄存器,它与TMOD相同,叫做操控寄存器,它是用于操控外部中止发动、请求的一系列作业的。守时器/计数器的作业要依赖于溢出中止,在中止处理中处理相关事情T0或许T1寄存器溢出时会请求中止,然后再处理。比方所以假如想要运用T0计数100,那么就用16位寄存器的溢出值减去初始值,既是计数值,那么便是65536-100=65436(65536-65436=100),所以T0要首要置初始值65436。这儿先介绍TCON的高4位。

TF1:T1溢出中止请求标志位,T1溢出时TF1为1,相应中止后主动清0,也可运用软件操控。

TR1:T1运转操控位,TR1为1时,T1作业,TR1为0时,T1中止作业。

TF0:T0溢出中止请求标志位。同理TF1。

TR0:T0运转操控位,同理TR1。

M1M0操控的四种作业方法如下:

00 13位计数,运用了TL0的低5位和TH0的8位组成,TH0溢出置TF0中止。
01 16位计数,运用T0。同00。
10 主动重装初值的8位计数方法。
11 T1中止,TH0和TL0分隔计数。


计时器运用进程:
·对TMOD赋值,确认T1、T0的作业方法。
·核算初值,并将其写入T0或许T1。
·对IE(IE后边再介绍)赋值,敞开中止。
·使TR0或许TR1置位,发动计数。

二、中止

中止估量都知道是干啥的,这些就不烦琐了,这儿先上一幅图:

看这图估量都没心境,下面剖开来看:

其他的先不看,先看这点图,这是一个中止源,其间IT0是挑选中止的方法,IT0=1时为挑选下降沿有用,IT0=0时为低电平有用(有一个非门)。当中止触发时就将IE0置1,此刻,向CPU请求中止。那么,IT0和IE0是在什么地方呢?
还记得上面讲的TCON吗?现在把低四位也加进去:

TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

2、


参照1:INT0。
3、

TF0中止,上面现已介绍。
4、

TF1中止,上面现已介绍。
5、(RI或TI中止)

串行口中止请求标志,当串行口接纳完一帧串行数据时,置位RI或当串行口发送完一帧串行数据时置位TI,向CPU请求中止。

TCON中止

其间,TCON中的中止标志有如下几个:

TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

IT0:外部中止0触发方法门控位。
·IT0=0为下降沿有用
·IT0=1为负边缘触发
IE0:外部中止0中止请求标志位。
IT1:外部中止1触发方法操控位(同IT0)。
IE1:外部中止1中止请求标志位。
TF0:T0溢出中止。
TF1:T1溢出中止。

SCON中止

SCON中的中止如下:

TI RI

RI:串行口接纳中止标志位。当答应串行口接纳数据时,每接纳完一个串行帧,由硬件置位RI,相同,RI有必要由软件铲除。
TI:串行口发送中止标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就发动了发送进程,每发送完一个串行帧,由硬件置位TI,CPU呼应中止时,不能主动铲除TI,TI有必要由软件铲除。

下面再看上图的下一部分:

这部分叫做中止答应操控,当一个中止产生时,有必要由中止答应操控来检测是否答应,假如答应则转入中止处理,否则不处理。
先看右边的EA,这个是总的中止答应操控位,CPU想要处理中止,有必要开此中止答应。
再看左面:
其间各个中止答应操控如下:
·EX0:外部中止0答应位
·ET0:T0中止答应位
·EX1:外部中止1答应位
·ET1:T1中止答应位
·ES:串行口中止答应位
其间,这几个位都是由中止答应寄存器IE操控的,IE寄存器详细如下:

EA ES ET1 EX1 ET0 EX0


很明晰,中止呼应条件如下:
1、有中止请求
2、中止源中止答应位为1
3、CPU开中止(EA=1)

其间,8051有两个中止优先级,能够完成二级中止嵌套。每个中止源的中止优先级都是由中止优先级寄存器IP中的相应位的状况来规则的。
IP寄存器如下:

PT2 PS PT1 PX1 PT0 PX0

PX0:外部中止0优先级设定位,当将其设置为1时中止优先级较高。
能够依照上图以此类推。
(这儿,PT2是80C52的中止,不介绍)
优先级高的中止能够打断优先级低的中止而先履行,完成中止嵌套。那么同一优先级之间不能打断,假如多个同优先级中止一起请求,则依照天然优先级次序履行中止,天然优先级如下:

中止源 中止标志 中止服务程序进口 优先级次序
外部中止0 IE0 0003H
T0 TF0 000BH
外部中止1 IE1 0013H
T1 TF1 001BH
串行口中止 RI或许TI 0023H


中止运用方法如下所示:
函数名interruptxusingy
例如:voidfun()interrupt0using1
那么,这儿的x代表的是何种中止详细如下:
0:代表外部中止0
1:守时/计数器0
2:外部中止1
3:守时/计数器1
4:串行口中止
这儿y代表寄存器组,可取0~7,也能够不写。
例如,外部中止0能够写:
interrupt0using1
外部中止1可写
interrupt2using1


下面看一个运用守时器和中止的数字时钟的比如:

#include

#defineucharunsignedchar

ucharsecond=1; //秒,全局变量
ucharcount=0; //中止次数
ucharcodetab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xe7};

voidDelay(inta){ //推迟
inti;
while(a–){
for(i=0;i<148;i++);
}
}

//次函数标明运用的是守时器,守时为50ms
voidTime0_Init()
{
TMOD=0x01;
//TMOD为00000001 标明守时器处于守时形式,
//且为16位守时器,GATE=0,合作下面TR0=1,则发动寄存器
TH0=0x4c;
//设定初值,即设定守时时刻
TL0=0x00;
//设定初值,即设定守时时刻
IE =0x82;
//0x82二进制为10000010,即RA=1,ET0=1,
//设定答应呼应总中止和T0中止
TR0=1;
//设置TCON中TR0=1,答应T0作业
}

voidTime0_Int()interrupt1 //中止处理
{
TH0=0x4c;
//从头设定初值
TL0=0x00;
count++;
if(count==20){
count=0;
second++;
//时刻秒数加1
}
}

ucharkeyscan(){//4×4键盘扫描检测
ucharhang[4]={0xfe,0xfd,0xfb,0xf7};
uchartemp;
inti,j;
for(i=0;i<4;i++){
P1=hang[i];
temp=0x10;
for(j=0;j<4;j++){
if(!(temp&P1)){
returni*4+j;
}
temp<<=1;
}
}
return0;
}

ucharshow_hour(ucharh){ //显现小时
ucharx=h/24;
uchary=h$;
P2=0;
P0=tab[y/10]-0x80;
Delay(1);
P2=1;
P0=tab[y];
returnx;
}

ucharshow_minute(ucharm){ //显现分钟
ucharx=m/60;
uchary=m`;
P2=3;
P0=tab[y/10]-0x80;
Delay(1);
P2=4;
P0=tab[y];
returnx;
}

ucharshow_second(uchars){ //显现秒
ucharx=s/60;
uchary=s`;
P2=6;
P0=tab[y/10]-0x80;
Delay(1);
P2=7;
P0=tab[y];
returnx;
}

voidmain()
{
ucharhour=1,minute=1;
ucharh,m,s;
uchark,mk=0;
Time0_Init();
while(1){
Delay(1);
if(mk==0){
s=show_second(second);
second%=60;
mk++;
}
elseif(mk==1){
minute+=s;
m=show_minute(minute);
minute%=60;
mk++;
}else{
hour+=m;
h=show_hour(hour);
hour%=24;
mk++;
mk=mk%3;
}
k=keyscan();//检测按键
if(12==k||13==k||14==k){
Delay(50);
k=keyscan(); //软件消抖
if(12==k||13==k||14==k){
if(12==k)hour++;
elseif(13==k)minute++;
elseif(14==k)second++;
}
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/261604.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部