关于嵌入式,我就自己的XXX长话短说一下,说来话就长了,学过Java、Java
下面进入正题:
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:守时形式。
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 | 低 |
中止运用方法如下所示:
函数名
例如:void
那么,这儿的x代表的是何种中止详细如下:
0:代表外部中止0
1:守时/计数器0
2:外部中止1
3:守时/计数器1
4:串行口中止
这儿y代表寄存器组,可取0~7,也能够不写。
例如,外部中止0能够写:
interrupt
外部中止1可写
interrupt
下面看一个运用守时器和中止的数字时钟的比如:
#include
#define
uchar
uchar
uchar
void
int
while(a–){
for(i=0;i<148;i++);
}
}
//次函数标明运用的是守时器,守时为50ms
void
{
TMOD
//TMOD为
//且为16位守时器,GATE=0,合作下面TR0=1,则发动寄存器
TH0
//设定初值,即设定守时时刻
TL0
//设定初值,即设定守时时刻
IE
//0x82二进制为1000
//设定答应呼应总中止和T0中止
TR0
//设置TCON中TR0=1,答应T0作业
}
void
{
TH0
//从头设定初值
TL0
count++;
if(count==20){
count=0;
second++;
//时刻秒数加1
}
}
uchar
uchar
uchar
int
for(i=0;i<4;i++){
P1=hang[i];
temp=0x10;
for(j=0;j<4;j++){
if(!(temp&P1)){
return
}
temp<<=1;
}
}
return
}
uchar
uchar
uchar
P2=0;
P0=tab[y/10]-0x80;
Delay(1);
P2=1;
P0=tab[y];
return
}
uchar
uchar
uchar
P2=3;
P0=tab[y/10]-0x80;
Delay(1);
P2=4;
P0=tab[y];
return
}
uchar
uchar
uchar
P2=6;
P0=tab[y/10]-0x80;
Delay(1);
P2=7;
P0=tab[y];
return
}
void
{
uchar
uchar
uchar
Time0_Init();
while(1){
Delay(1);
if(mk==0){
s=show_second(second);
second%=60;
mk++;
}
else
minute+=s;
m=show_minute(minute);
minute%=60;
mk++;
}else{
hour+=m;
h=show_hour(hour);
hour%=24;
mk++;
mk=mk%3;
}
k=
if(12==k||13==k||14==k){
Delay(50);
k=
if(12==k||13==k||14==k){
if(12==k)hour++;
else
else
}
}
}
}