89C51单片机定时计数器中断共35页文档Word文档格式.docx
《89C51单片机定时计数器中断共35页文档Word文档格式.docx》由会员分享,可在线阅读,更多相关《89C51单片机定时计数器中断共35页文档Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
}
voidmain()
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
while
(1);
voidtimer0()interrupt1
TH0=(65536-10000-6)/256;
TL0=(65536-10000-6)%256;
k++;
if(k==100)
{
k=0;
m++;
}
if(m==8)m=0;
P2=temp<
<
m;
//这个语句是将变量temp左移m位给P2,不改变temp的值。
//如果改成temp=temp<
m,就改变了temp的值
宋以后,京师所设小学馆和武学堂中的教师称谓皆称之为“教谕”。
至元明清之县学一律循之不变。
明朝入选翰林院的进士之师称“教习”。
到清末,学堂兴起,各科教师仍沿用“教习”一称。
其实“教谕”在明清时还有学官一意,即主管县一级的教育生员。
而相应府和州掌管教育生员者则谓“教授”和“学正”。
“教授”“学正”和“教谕”的副手一律称“训导”。
于民间,特别是汉代以后,对于在“校”或“学”中传授经学者也称为“经师”。
在一些特定的讲学场合,比如书院、皇室,也称教师为“院长、西席、讲席”等。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
定时器中断c语言解析interrupt
x
using
y
课本、报刊杂志中的成语、名言警句等俯首皆是,但学生写作文运用到文章中的甚少,即使运用也很难做到恰如其分。
为什么?
还是没有彻底“记死”的缘故。
要解决这个问题,方法很简单,每天花3-5分钟左右的时间记一条成语、一则名言警句即可。
可以写在后黑板的“积累专栏”上每日一换,可以在每天课前的3分钟让学生轮流讲解,也可让学生个人搜集,每天往笔记本上抄写,教师定期检查等等。
这样,一年就可记300多条成语、300多则名言警句,日积月累,终究会成为一笔不小的财富。
这些成语典故“贮藏”在学生脑中,自然会出口成章,写作时便会随心所欲地“提取”出来,使文章增色添辉。
interrupt表示中断优先级,using表示所用工作寄存器组。
interrupt
y
跟在interrupt后面的x
值是中断号,就是说这个函数对应第几个中断端口,一般在51中,x对应的中断如下:
0
外部中断0
1
定时器0
2
外部中断1
3
定时器1
4
串行中断
其它的根据相应的单片机有自己的含义,实际上c在编译的时候就是把你这个函数的入口地址放到这个对应中断的跳转地址
这个y是说这个中断函数使用的那个寄存器组就是51里面一般有4个
r0
--
r7寄存器,如果你的中断函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈,返回时也不会弹出来节省代码和时间
外部中断INT0
voidintsvr0(void)interrupt0using1
定时/计数器T0
voidtimer0(void)interrupt1using1
外部中断INT1
voidintsvr1(void)interrupt2using1
定时/计数器T1
voidtimer1(void)interrupt3using1
串口中断
voidserial0(void)interrupt4using1
一,中断的概念
中断:
当计算机执行正常程序时,系统中出现某些急需处理的异常情况和特殊请求.
中断的执行:
当CPU正在执行某一程序时,若有中断响应,则CPU转而执行中断服务程序,当中断服务程序执行完毕后,CPU自动返回原来的程序继续执行.
中断服务程序的语句写法与函数的写法完全相同,所以,中断服务程序也是函数,只在函数头部有不同(后续).
中断服务程序的执行与函数的执行不同:
函数的执行是有固定位置的,是通过函数的调用来完成的;
而中断服务程序的执行是不固定位置的,只要有中断响应,在一定条件下都会去响应中断,即执行中断服务程序.
二,中断源
中断源:
任何引起计算机中断的事件,一般一台机器允许有许多个中断源.
8051系列单片机至少有5个可能的中断(8052有6个,其它系列成员最多可达15个).下面以5个中断源为例.
8051单片机的五个中断源是:
外部中断请求0,由INT0(P3.2)输入;
外部中断请求1,由INT1(P3.3)输入;
片内定时器/计数器0溢出中断请求;
片内定时器/计数器1溢出中断请求;
片内串行口发送/接收中断请求.
三,与中断有关的寄存器
1,定时/计数器控制寄存器TCON
TF1TR1TF0TR0IE1IT1IE0IT0
D7D6D5D4D3D2D1D0
.IT0,IT1:
外部中断0,1触发方式选择位,由软件设置;
1→下降沿触发方式,INT0/INT1管脚上高到低的负跳变可引起中断;
0→电平触发方式,INT0/INT1管脚上低电平可引起中断.
.IE0,IE1:
外部中断0,1请求标志位;
当外部中断0,l依据触发方式满足条件,产生中断请求时由硬件置位(IE0/IE1=1);
当CPU响应中断时由硬件清除(IE0/IE1=0).
.TR0,TR1:
启动定时/计数器0,1.
.TF0,TF1:
定时器/计数器0,1(T/C0,T/C1)溢出中断请求标志;
当T/C0,1计数溢出时由硬件置位(TF0/TF1=l);
当CPU响应中断由硬件清除(TFO/TF1=0).
2,串行口控制寄存器SCON
TIRI
.RI:
串行口接收中断请求标志位;
当串行口接收完一帧数据后请求中断,由硬件置位(RI=1)
RI必须由软件清"
0"
.
.TI:
串行口发送中断请求标志位.
当串行口发送完一帧数据后请求中断,由硬件置位(TI=1)
TI必须由软件清"
.
3,中断允许寄存器IE
EAET2ESET1EX1ET0EX0
.EX0,EX1:
外部中断0,1的中断允许位;
l→外部中断0,1开中断;
0→外部中断0,1关中断.
.ET0,ET1:
定时器/计数器0,1(T/C0,T/C1)溢出中断允许位;
1→T/C0,T/Cl开中断;
0→T/C0,T/Cl关中断.
.ES:
串行口中断允许位;
1→串行口开中断;
0→串行口关中断.
.ET2:
定时器/计数器2(T/C2)溢出中断允许位;
1→T/C2开中断;
0→T/C2关中断.
.EA:
CPU开/关中断控制位.
1→CPU开中断.0→CPU关中断.
8051复位时,IE被清"
此时CPU关中断,各中断源的中断也都屏蔽
4,中断优先级寄存器IP
PSPT1PX1PT0PX0
.PX0,PX1:
外部中断0,1中断优先级控制位;
1→高优先级;
0→低优先级.
.PT0,PT1:
定时器/计数器0,1中断优先级控制位;
.PS:
串行口中断优先级控制位;
8051复位时,IP被清"
5个中断源都在同一优先级,其内部优先级的顺序从高到低为:
外部中断0(IE0)
定时器/计数器0(TF0)
外部中断1(IE1)
定时器/计数器1(TF1)
串行口中断(RI+TI)
四,中断响应
8051的CPU在每个机器周期采样各中断源的中断请求标志位,如果没有下述阻止条件,将在下一个机器周期响应被激活了的最高级中断请求:
1.CPU正在处理同级或更高级的中断;
2.现行机器周期不是所执行指令的最后一个机器周期;
3.正在执行的是RETI或是访问IE或IP的指令.
CPU在中断响应后完成如下的操作:
1.硬件清除相应的中断请求标志;
2.执行一条硬件子程序,保护断点,并转向中断服务程序人口
3.结束中断时执行RETI指令,恢复断点,返回主程序.
8051的CPU在响应中断请求时,由硬件自动形成转向与该中断源对应的服务程序入口地址,这种方法为硬件向量中断法.
五,中断服务程序的入口地址
编号中断源人口地址
0外部中断00003H
1定时器/计数器0000BH
2外部中断10013H
3定时器/计数器1001BH
4串行口中断0023H
各中断服务程序入口地址仅间隔8个字节,编译器在这些地址放入无条件转移指令跳转到服务程序的实际地址.
六,中断服务程序的语法规则
中断服务程序的语法规则如下:
函数的返回值函数名([参数])interruptn[usingm]
函数体;
对中断程序而言,函数的返回值和参数一般为void.
interruptn中n的取值为0~31的常数,不允许用表达式,表示中断向量的编号.
usingm中m的取值为0~3的常数,不允许用表达式,表示内部RAM中的工作寄存器.
七,中断说明
中断不允许用于外部函数,它对函数目标代码影响如下z
·
当调用函数时,SFR中的ACC,B,DPH,DPL和PSW(当需要时)入钱;
.如果不使用寄存器组切换,甚至中断函数所需的所有工作寄存器都入钱;
.函数退出前,所有的寄存器内容出钱;
函数由8051的指令"
RETI"
终止.
中断服务程序使用的任何程序也使用同一寄存器组.
八,中断例子
#include〈reg51.h〉
unsignedcharstatus;
bitflag;
voidservice_int()interrupt2using2
{
flag=1;
status=P1;
voidmain(void)
IP=0x04;
IE=0x84;
for(;
;
){
if(flag){
switch(status){
case0:
break;
case1:
case2:
case3:
default:
;
flag=0;
习题
试设计满足下列要求的电路图:
1单片机采用89C51,时钟11.0592MHz;
2有4个指示灯表示状态;
3外接12位A/D芯片AD574;
4有4*4的键盘;
5有字符型LCD(画成插座形式,12Pin插座,管脚接法见书P253);
6有串行接口与计算机连接;
7设置8位二进制的地址,地址范围可表示为0~255;
8外接EEPROM.
定时器/计数器(T/C)
8051系列单片机至少有两个16位内部定时器/计数器,8052有三个定时器/计数器,其中有两个是基本定时器/计数器是定时器/计数器.它们既可以编程为定时器使用,也可以编程为计数器使用.
若是计数内部晶振驱动时钟,它是定时器;
若是计数,8051的输入管脚的脉冲信号,它是计数器.
当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数率=1/12fosc.例当晶振为12MHz时,计数率=1000kHz,即每1μs计数值加1.
当T/C工作在计数器时,计数脉冲来自外部脉冲输入管脚T0(P3.4)或T1(P3.5),当T0或T1脚上负跳变时计数值加1.识别管脚上的负跳变需两个机器周期,即24个振荡周期.所以T0或T1脚输入的可计数外部脉冲的最高频率为1/24fosc,当晶振为12MHZ时,最高计数率为500kHz,高于此频率将计数出错.
一,与T/C有关的SFR
1,计数寄存器Th和TL
T/C是16位的,计数寄存器由TH高8位和TL低8位构成.
在特殊功能寄存器(SFR)中,
对应T/C0为TH0和TL0;
对应T/C1为TH1和TL1.
定时器/计数器的初始值通过TH1/TH0和TL1/TL0设置.
2,定时器/计数器控制寄存器TCON
前面已介绍.
二,与T/C有关的SFR
3,T/C的方式控制寄存器TMOD
.C/T:
计数器或定时器选择位;
1→为计数器;
0→为定时器.
.GATE:
门控信号;
1→T/C的启动受到双重控制,即要求TR0/TR1和INT0/INT1同时为高;
0→T/C的启动仅受TR0或TR1控制.
GATEC/TM1M0GATEC/TM1M0
T/C1
T/C0
三,四种工作方式
M1M0方式功能
00013位定时器/计数器,TL是低5位,TH是高8位
01116位定时器/计数器
102常数自动重装的8位定时器/计数器
113仅用于T/C0,是两个8位定时器/计数器
利用定时器编写时钟程序.
四,T/C工作方式的说明
1.方式0:
当TMOD中MlM0=00时,T/C工作在方式0;
方式0为13位的T/C,由TH的高8位,TL的低5位的计数值,满计数值213,但启动前可以预置计数初值.
若T/C开中断(ET=1)且CPU开中断(EA=1)时,则定时器/计数器溢出时,CPU转向中断服务程序时,且TF白动清0.
2.方式1:
当TMOD中MlM0=01时,T/C工作在方式1;
方式1与方式0基本相同.唯一区别在于计数寄存器的位数是16位的,由TH和TL寄存器各提供8位,满计数值为216.
3.方式2:
当TMOD中MlM0=10时,T/C工作在方式2;
方式2是8位的可自动重载的T/C,满计数值为28;
在方式0和方式1中,当计数满后,若要进行下一次定时/计数,须用软件向TH和TL重装预置计数初值;
方式2中TH和TL被当作两个8位计数器,计数过程中,TH寄存8位初值并保持不变,由TL进行8位计数.计数溢出时,除产生溢出中断请求外,还自动将TH中初值重装到TL,即重装载.
4.方式3:
方式3只适合于T/C0.当T/CO工作在方式3时,TH0和TL0成为两个独立的8位计数器.
五,定时器/计数器的初始化
在使用8051的定时器/计数器前,应对它进行编程初始化,主要是对TCON和TMOD编程;
计算和装载T/C的计数初值.一般完成以下几个步骤:
(1)确定T/C的工作方式——编程TMOD寄存器;
(2)计算T/C中的计数初值,并装载到TH和TL;
(3)T/C在中断方式工作时,须开CPU中断和源中断——编程IE寄存器;
(4)启动定时器/计数器——编程TCON中TR1或TR0位.
六,定时器/计数器的初值计算
在定时器方式下,T/C是对机器周期脉冲计数的,若fosc=12MHz,一个机器周期为12/fosc=1μs,则:
方式013位定时器最大定时间隔=8.192ms;
(2的13次方=8192)
方式116位定时器最大定时间隔=65.536ms;
(2的16次方=65536)
方式28位定时器最大定时间隔=256μs.
若使T/C工作在定时器方式1(16位二进制),要求定时1ms,求计数初值.设计数初值为x,则有:
(65536-x)×
1μs=1000μs
或x=65536一1000
因此,TH,TL可置-1000;
即:
TH=-1000/256;
TL=-1000%256.
对一般fosc有下列公式(设定时时间为timeμs):
(216-x)×
12/fosc=timeμs
例1,设单片机的fosc=12MHz,要求在P1.0脚上输出周期为2ms的方波
采用查询方式.
sbitP1_0=P1^0;
voidmain(void〉
{TMOD=0x01;
)
{TH0=-1000/256;
TL0=-1000%256;
do{}while(!
TF0);
P1_0=!
P1_0;
TF0=0;
采用中断方式.
#include〈reg51.h>
voidtimer0(void)interrupt1using1{P1_0=!
TH0=-1000/256;
{TMOD=0x01;
P1_0=0;
TH0=-1000/256;
EA=1;
ET0=1;
TR0=1;
do{}while
(1);
例2,设单片机的fosc=6MHz,要求在P1.7脚上的指示灯亮一秒灭一秒.
{P1_7=0;
P1_0=1;
TMOD=0x61;
TH0=-50000/256;
TL0=-50000%256;
TH1=-5;
TL1=-5;
IP=0x08;
EA=l;
ET1=l;
TR0=l;
TR1=1;
for(;
){}
#include
sbitP1_7=P1^7;
voidtimer0()interrupt1using1
{P1_0=!
voidtimer1()interrupt3using2
{P1_7=!
P1_7;
例3,设单片机的fosc=10MHz,要求在P1.0脚上输出周期为2.5μs,占空比20%.
#defineucharunsignedchar
uchartime;
ucharperiod=250;
ucharhigh=50;
voidtimer0()interruptlusing1
{TH0=-8333/256;
TL0=-8333%256;
if(++time==high)P1=0;
elseif(time==period)
{time=0;
P1=1;
TMOD=0x01;
TH0=-8333/256;
do{)while
(1);
#defineuintunsignedint
uchartime,status,percent,period;
bitone_round;
uintoldcount,target=500;
voidpulse(void)interrupt1usingl
{TH0=-833/256;
TL0=-833%256;
ET0=l;
if(++time==percent)P1=0;
elseif(time==100)
P2=l;
}
voidtachmeter(void)interrupt2using2
{union{uintword;
struct{ucharhi;
ucharlo;
}byte;
}newcount;
newcount_byte.hi=TH1;
newcount_byte.lo=TLl;
period=newcount.word--oldcounts;
oldcount=newcount.word;
one-round=1;
{IP=0x04;
TCON=0x54;
TH1=0;
TL1=0;
IE=0x86;
{if(one_round)
{if(period
{if(percent0)
--percent;
串行口
8051系列单片机有一个标准的串行通信接口,发送数据时由TXD端口送出,接收数据时由RXD端口输入.
内置两个缓冲器SBUF,一个接受缓冲器,另一个是接收缓冲器,可实行全双工的串行通信.
近距离可直接用TTL电平,若与计算机通信,则需要将电平转换成RS232电平形式,若需长距离通信可以采用RS485电平形式,通信的数据必须通过软件的编写来完成.
一,与串行口有关的SFR
1,串行口控制寄存器SCON
SM0SM1SM2RENTB8RB8TIRI
.SM0,SM1:
串行口工作方式控制位(见书P158).
.SM2:
多机通信控制位(方式2,3);
1→只有接收到第9位(RB8)为1,RI才置位;
0→接收到字符RI就置位.
.REN:
串行口接收允许位;
1→允许串行口接收;
0→禁止串行口接收.
.TB8:
方式2和方式3时,为发送的第9位数据,也可以作奇偶
校验位.
.RB8:
方式2和方式3时,为接收到的第9位数据;