51_中断及定时器学习笔记,超全

51_中断及定时器学习笔记,超全
51_中断及定时器学习笔记,超全

*外中断INT0--------void intsvr0(void) interrupt 0 using 1

*定时/计数器T0-----void timer0(void) interrupt 1 using 1

*外中断INT1--------void intsvr0(void) interrupt 2 using 1

*定时/计数器T1-----void timer0(void) interrupt 3 using 1

*串口中断----------void serial0 interrupt 4 using 1

P3口的代替功能

1、IE:中断允许控制寄存器

寄存器地址A8H,可按位寻址,位寻址AFH~A8H。复位IE全部清零

EA:中断允许总控制位

当EA=0时,中断总禁止。

当EA=1时,中断总允许后中断的禁止与允许由各中断源的中断允许控制位进行设置。EX0(EX1):外部中断允许控制位

当EX0(EX1)=0禁止外中断

当EX0(EX1)=1允许外中断

ET0(EX1):定时/计数中断允许控制位

当ET0(ET1)=0 禁止定时(或计数)中断

当ET0(ET1)=1 允许定时(或计数)中断

ET2:定时器2中断允许控制位

ES:串行中断允许控制位

当ES=0 禁止串行中断

当ES=1 允许串行中断

2、IP:中断优先级控制寄存器

PX0——外部中断0优先级设定位,1为高优先级中断,0为低优先级中断

PT0——定时中断0优先级设定位

PX1——外部中断1优先级设定位

PT1——定时中断1优先级设定位

PS——串口中断优先级设定位

PT2——定时器2优先级设定位

3、TCON:定时器控制寄存器

TR0(TR1)——定时器运行控制位

当TR0(TR1)=0 停止定时器/计数器工作

当TR0(TR1)=1 启动定时器/计数器工作

IE0(IE1)——外中断请求标志位

当CPU采样到P3.2(P3.3)[INT0或INT1]出现有效中断请求时,此位由硬件置1。在中断响应完成后转向中断服务时,再由硬件自动清0。

IT0(IT1)——外中断请求信号方式控制位

当IT0(IT1)=1脉冲方式(后沿负跳有效)下降沿触发有效

当IT0(IT1)=0电平方式(低电平有效)此位由软件置1或清0。

TF0(TF1)——计数溢出标志位

当计数器产生计数溢出时,此位由硬件置1。当转向中断服务时,再有硬件自动清0。计数溢出的标志位的使用有两种情况:采用中断方式时,作中断请求标志位来使用;采用查询方式时,作查询状态位来使用。

4、TMOD:工作方式控制寄存器

GATE——门控位

当=0时,以运行TR0(或TR1)启动或禁止定时器、计数器

当=1时,以TR0*/INT0(或TR1*/INT1)启动或禁止定时器、计数器

GATE=0 以TCON寄存器中的TR0(TR1)启动定时器/计数器

GATE=1 TCON寄存器中的TR0(TR1)和外部中断引脚INT0(INT1)启动定时器,高电位有效C/T=1由外引脚T0或T1做计数脉冲,C/T=0由TH和TL做定时数。 M1M0——工作方式

选择位

M1,M0:用来选择计时计数器工作模式

5、T2MOD:工作方式控制寄存器

T2OE:定时器2输出允许位,当=1时,P1.0/T2引脚输出连续脉冲信号

DCEN:当=1时,T2配置成向上向下计数器

6、T2CON:定时器控制寄存器,可进行位寻址

TF2:T2溢出标记;方式2,3置TF2,方式3不置。

当T2溢出时TF2=1,TD2只能用软件清0

当RCLK=1或TCLK=1时,TF2将不置位

EXF2:T2外部标记

当EXEN2=1时,T2EX/P1.1引脚上的负跳变引起T2的捕捉/重装操作,此时EXF2=1。在T2中断允许时,EXF2=1将引起中断,EXF2只能用软件清除。在T2的递增、递减计数模式下(DCEN=1)

EXF2的置位将不引起中断。

RCLK:接收时钟允许

当RCLK=1时,T2的溢出脉冲可用作串行口的接收时钟信号,适于串行口模式1、3当RCLK=0时,T1的溢出脉冲用作串行口接收时钟信号

TCLK:发送时钟允许

当RCLK=1时,T2的溢出脉冲可用作串行口的接收时钟信号,适于串行口模式1、3当RCLK=0时,T1的溢出脉冲用作串行口发送时钟信号

EXEN2:T2外部事件(引起捕捉/重装的外部信号)允许,即外部使能标志

当EXEN2=1时,如果T2没有作串行时钟输出(即RCLK+TCLK=0),则在T2EX/P1.1引脚跳变将引起T2的捕捉/重装操作;

当EXEN2=0时,在T2EX引脚的负跳变将不起作用

TR2:T2计数控制位;TR2=1时允许计数/定时。

C/T2:外部计数器/定时器选择位;C/T2=1时为计数器,计数脉冲来自T2(P1.0);下降沿触发

C/T2=0时为内部定时器,以震荡脉冲的十二分频信号为计数信号。

CP/RL2:捕捉/重装选择

当CP/RL2=1且EXEN2=1时,T2EX/P1.1引脚的负跳变将引起捕捉操作

当CP/RL2=0且EXEN2=1时,T2EX/P1.1引脚的负跳变将引起重装操作

当CP/RL2=0且EXEN2=0时,T2的溢出将引起T2的自动重装操作

当RCLK+TCLK=1时,CP/RL2控制位不起作用,T2被强制工作于重装方式。重装方式发生于T2溢出时,常用来作波特率发生器。

7、SCON:串行口控制寄存器

寄存器地址98H,位寻址9FH~98H。

SM0、SM1:串行口工作方式选择位

SM2:多机通信控制位

对于方式0:SM2=0。

对于方式1:SM2=1,只有接到有效的停止位才激活RI。

对于方式2和3为多机通信控制位;SM2=1,则接收的第9位数据为0时不激活RI

REN:允许/禁止串行口接收的控制位,REN=1允许接收数据

TB8:在方式2和方式3中,是被发送的第9位数据,可根据需要由软件置1或清零,也可以作为

奇偶校验位,在方式1中是停止位。

RB8:在方式2和方式3中,是被接收的第9位数据(来自第TB8位);在方式1中,RB8收到的

是停止位,在方式0中不用。

TI :串行口发送中断请求标志位

当发送完一帧串行数据后,由硬件置1;在转向中断服务程序后,用软件清0。 RI :串行口接收中断请求标志位

当接收完一帧串行数据后,由硬件置1;在转向中断服务程序后,用软件清0。

8、PSW :程序状态字

寄存器地址D0H ,位寻址D7H ~D0H 。

CY ——进位标记。CY=1表示运算时有进位产生。

AC ——半进位标记。补助进位位;

AC=1表示运算时较低4位有进位产生。 F0——用户设定标记

RS1 、RS0——4个工作寄存器区的选择位。 OV ——溢出标记. OV=1表示运算时有益出产生

P ——奇偶校验标记. 奇偶位;P=0表示A 中1的个数是偶数,P=1表示A 中1的个数是奇数。

9、PCON :电源控制器及波特率选择寄存器

SMOD ——波特率倍增位

SMOD=1:串口方式1,2,3时,波特率正常

SMOD=0:串口方式1,2,3时,波特率加倍

是STC 单片机特有的功能

GF1、GF0——用户通用标记,用户课自由使用

PD——掉电模式控制位,PD=1时进入掉电模式,在硬件复位或外中断低电平触发或由下降沿触发恢复。进入掉电模式,外部晶振,cpu,定时器,串行口全部停止工作,只有外部中断工作IDL——空闲模式控制位,IDL=1时进入空闲模式,除cpu外,其余继续工作。

在AT89S51中PCON.4是电源断电标记位POF,上电是为1

进入空闲模式:PCON=0x01; 之前执行AUXR=0xFF;定义空闲模式下看门狗WDT不计数。

定时器

1)对TMOD赋值,以确定T0和T1的工作方式

2)计算初值,并将初值写入TH0,TL0或TH1,TL1

3)中断方式时,对IE赋值,开放中断

4)使TR0或TR1置位,启动定时器计数器定时或计数

能在主程序完成的功能就不在中断函数中些,否则一定要高效简洁

方式0和方式3很少用,方式1用作16位的计数器,方式2用在串口波特率发生器

1、发光二极管以一秒亮灭,11.0592M晶振

定时器0工作方式1

#include //52系列单片机头文件

#define uchar unsigned char

#define uint unsigned int

sbit led1=P1^0;

uchar num;

void main()

{

TMOD=0x01; //设置定时器0为工作方式1(M1M0为01)

TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms为45872

TL0=(65536-45872)%256;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时器0

while(1) //程序停止在这里等待中断发生

{

if(num==200) //如果到了200次,说明1秒时间到

{

num=0; //然后把num清0重新再计200次

led1=~led1; //让发光管状态取反

}

}

}

void T0_time() interrupt 1

{

TH0=(65536-45872)/256; //重装初值

TL0=(65536-45872)%256;

num++;

}

●定时器0工作方式0

1、定时器方式0为13位计数器,最多能装载的数2^=8192个,所以最多经过8192个机器周期该计数

器就会溢出一次,向cpu申请中断

2、计算机器周期T,晶振为11.0592MHz,那么机器周期为12*(1/11059200)=1.0851微s,若

t=5ms,则N=5000/1.0851=4607

3、TH0=(8192-4607)/32;中,对32求模是因为定时器方式0为13位计数器,计数支使用了TL0的低5位,这5位最多装载32个数,再加1进位。16位计数器装载256个数

void main()

{

TMOD=0x00;//设置定时器0为工作方式0(0000 0000)

TH0=(8192-4607)/32; //装初值

TL0=(8192-4607)%32;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时器0

●定时器T0的定时方式2

1、定时器2被称为8位初值自动装载的8位定时器/计数器,THX被作为常数缓冲器,TLX计数溢出时,

在溢出标志TFX置1的同时,还自动将THX中的常数重新装入TLX中,使TLX从初值开始重新计数,提

高定时的精度。

2、定时器2特别适合做较精确的脉冲信号发生器,此时晶振频率一定要是12 的整数倍。

方式2为8位计数器,最多装2^8=256个,即使用12MHz晶振,最多只有256微秒

3、机器周期为12*(1/11059200)=1.0851微s,计时1s,当计250个数,需1.0851*250=271.275微秒。需要溢出1000000/271.275=3686,若为12MHz晶振,则溢出4000次

4、主要应用在串口波特率发生器。

#include //52系列单片机头文件

#define uchar unsigned char

#define uint unsigned int

sbit led1=P1^0;

uint num; //3686远远超过了uchar的范围

void main()

{

TMOD=0x02; //设置定时器0为工作方式2(0000 0010)

TH0=6; //装初值

TL0=6;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时器0

while(1) //程序停止在这里等待中断发生

{

if(num==3686) //如果到了3686次,说明1秒时间到

{

num=0; //然后把num清0重新再计3686次

led1=~led1; //让发光管状态取反

}

}

}

定时方式3

1、方式3只适用于定时器/计数器T0,当设定定时器T1为方式3,定时器T1不计数,T0分成两个独立的8位计数器TL0和TH0。

2、其中TL0为正常8位计数器,计数溢出后置位TF0,并向CPU申请中断,之后重新装初值。TH0将占用定时器T1的。

3、在工作方式3时,T1一定不要用在有中断的场合,不过可以用来当做串行口的波特率发生器。TL0计数器对应的8位定时器

#include //52系列单片机头文件

#define uchar unsigned char

#define uint unsigned int

sbit led1=P1^0;

sbit led2=P1^1;

uint num1,num2;

void main()

{

TMOD=0x03; //设置定时器0为工作方式3(0000 0011)

TH0=6; //装初值

TL0=6;

EA=1; //开总中断

ET0=1; //开定时器0中断

ET1=1; //开定时器1中断

TR0=1; //启动定时器0

TR1=1; //启动定时器0的高8位计数器

while(1) //程序停止在这里等待中断发生

{

if(num1>=3686) //如果到了3686次,说明1秒时间到

{

num1=0; //然后把num1清0重新再计3686次

led1=~led1; //让发光管状态取反

}

if(num2>=1843) //如果到了1843次,说明半秒时间到

{

num2=0; //然后把num2清0重新再计1843次

led2=~led2; //让发光管状态取反

}

}

}

void TL0_time() interrupt 1

{

TL0=6; //重装初值

num1++;

}void TH0_time() interrupt 3

{

TH0=6; //重装初值

num2++;

}

1、定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,定时器1的方式1实现数码

管前两位59s循环计时

#include //52系列单片机头文件

#define uchar unsigned char

#define uint unsigned int

sbit led1=P1^0;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delayms(uint);

void display(uchar,uchar) ;

uchar num, num1,num2,shi,ge;

void main()

{

TMOD=0x01; //设置定时器0为工作方式1(M1M001)

TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms为45872

TL0=(65536-45872)%256;

TH1=(65536-45872)/256; //装初值11.0592M晶振定时50ms为45872

TL1=(65536-45872)%256;

EA=1; //开总中断

ET0=1; //开定时器0中断

ET1=1; //开定时器1中断

TR0=1; //启动定时器0

TR1=1; //启动定时器1

while(1) //程序在这里不停地对数码管动态扫描同时等待中断{

display(shi,ge);

}

}

void display(uchar shi,uchar ge) //显示子函数

{

P0=table[shi]; //送十位段选数据

P0=0xfe; //送位选数据

delayms(5); //延时

P0=table[ge]; //送个位段选数据

P0=0xfd;

delayms(5);

}

void delayms(uint xms)

{

uint i,j;

for(i=xms;i>0;i--) //i=xms即延时约xms毫秒

for(j=110;j>0;j--);

}

void T0_time() interrupt 1

{

TH0=(65536-45872)/256; //重装初值

TL0=(65536-45872)%256;

num1++;

if(num1==4) //如果到了4次,说明200ms时间到了

{

num1=0; //清零,重新再计

led1=~led1;

}

}

void T1_time() interrupt 3

{

TH1=(65536-45872)/256; //重装初值

TL1=(65536-45872)%256;

51单片机定时器初值的计算

51单片机定时器初值的计算 一。10MS定时器初值的计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。10ms=10000次机器周期。65536-10000=55536(d8f0) TH0=0xd8,TL0=0xf0 2.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。 65536-9216=56320(dc00) TH0=0xdc,TL0=0x00 二。50MS定时器初值的计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次机器周期。65536-50000=15536(3cb0) TH0=0x3c,TL0=0xb0 2.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。 65536-46080=19456(4c00) TH0=0x4c,TL0=0x00 三。使用说明 以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而T 每次溢出 最多65536 个机器周期。我们尽量应该让溢出中断的次数最少(如50ms),这样对主程序的干扰也就最小。开发的时候可能会根据需要更换不同频率的晶振(比如c51单片机,用11.0592M的晶振,很适合产生串

口时钟,而12M晶振很方便计算定时器的时间),使用插接式比较方便。 51单片机12M和11.0592M晶振定时器初值计算 2011-01-04 22:25 at89s52,晶振频率12m 其程序如下: 引用代码:#include #include void timer0_init() { TMOD=0x01;//方式1 TL0=0xb0; TH0=0x3c; TR0=1; ET0=1; } void timer0_ISR(void) interrupt 1 { TL0=0xb0; TH0=0x3c;//50ms中断一次 single++; if(single==20) { kk++; single=0; } } void main() { int kk=0;//计数器 int single=0; timer0_init(); } TL0=0xb0; TH0=0x3c; 这两个是怎么算出来得

MCS-51单片机计数器定时器

80C51单片机内部设有两个16位的可编程定时器/计数器。可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。 : 从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。TMOD主要是用于选定定时器的工作方式;TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。当定时器工作在计数方式时,外部事件通过引脚T0(P3.4)和T1 (P3.5)输入。 定时计数器的原理: 16位的定时器/计数器实质上就是一个加1计数器,其控制电路受软件控制、切换。 当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。显然,定时器的定时时间与系统的振荡频率有关。因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。如果晶振为12MHz,则计数周期为: T=1/(12×106)Hz×1/12=1μs 这是最短的定时周期。若要延长定时时间,则需要改变定时器的初值,并要适当选择定时器的长 度(如8位、13位、16位等)。 当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电平。若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的计数值装入计数器。所以检测一个由1至0的跳变需要两个机器周期,故外部事年的最高计数频率为振荡频率的1/24。例如,如果选用12MHz 晶振,则最高计数频率为0.5MHz。虽然对外部输入信号的占空比无特殊要求,但为了确保某给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。

51单片机中断系统详解

的定时器中断后便认为是1s,这样便可精确控制定时时间啦。要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536.,把15536对256求模:15536/256=60装入TH0中,把15536对256求余:15536/256=176装入TL0中。 以上就是定时器初值的计算法,总结后得出如下结论:当用定时器的方式1时,设机器周期为T CY,定时器产生一次中断的时间为t,那么需要计数的个数为N=t/T CY ,装入THX和TLX中的数分别为: THX=(65536-N)/256 , TLX=(65536-N)%256 中断服务程序的写法 void 函数名()interrupt 中断号using 工作组 { 中断服务程序内容 } 在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置,通常定时器初始化过程如下: (1)对TMOD赋值,以确定T0和 T1的工作方式。 (2)计算初值,并将初值写入TH0、TL0或TH1、TL1。 (3)中断方式时,则对IE赋值,开放中断。 (4)使TR0和TR1置位,启动定时器/计数器定时或计数。 例:利用定时器0工作方式1,实现一个发光管以1s亮灭闪烁。 程序代码如下: #include #define uchar unsigned char #define uint unsigned int sbit led1=P1^0; uchar num; void main() { TMOD=0x01; //设置定时器0位工作模式1(M1,M0位0,1) TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872 TL0=(65536-45872)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0 while(1) { if(num==20) //如果到了20次,说明1秒时间 { led1=~led1; //让发光管状态取反 num=0; } } } void T0_time()interrupt 1

51单片机学习笔记(三)_定时器和计数器

51单片机学习笔记(三)_定时器和计数器 注:定时器与计数器原理与使用方法相似、此处计数器知识为基础普及、后 面详讲2 个定时器(寄存器)、定时器0、定时器1、(计数器0、计数器1) TMOD:定时器/计数器模式控制寄存器详见百度百科TMOD 每经过一个机器周期、寄存器+1TF:定时器溢出标志。溢出时自动置1。中 断时硬件清零否则必须软件清零。TR:定时器运行控制位。置1 开始计时、清 零停止计时。C/T:该位为0 时用作计时器、该位为1 时用作计数器。溢出时 时间-开始计时时间=预设定时时间 一个机器周期共有12 个振荡脉冲周期若设定时为0.02s,则: 12*(65535-X)/11059200=0.02s 定时器作加1 次数:X=47104=0xB800 次时间为0.02s 使用定时器的方法 1、设置特殊功能寄存器TMOD,使之工作在需求的状态。 2、设置计数寄存 器的初值,精确设定好定时时间。3、设置特殊功能寄存器TCON,通过打开 TR 来让定时器进行工作。 4、判断寄存器TCON 的FT0 位、检测定时器溢出情况。 假设我们使用定时器0、定时为0.02s,两个寄存器计时 TMOD=0x01; TMOD=0x01,指的是采用T0 方式,将M1 置0,M0 置1,是 方式一的定时器 高八位寄存器TH0=0xB8、低八位寄存器TL0=0x00 C 程序实现1s 钟定时 #include typedef unsigned char uint8;typedef unsigned int uint16;sbit led=P1;uint8 counter;void main(){TMOD=0x01;TH0=0xb8;TL0=0x00;TR0=1;

51单片机利用中断控制灯频率和顺序

#include //包含51单片机寄存器定义的头文件#include int e=0,f=0,d=1,a=0,b=0,c=0,delay=10,m=1,V=128; G=1; /******************************************* 函数功能:主函数 ******************************************/ void main(void) { EA=1; //开放总中断 EX0=1; //允许使用外中断 ET0=1; //定时器0开 EX1=1; TMOD=0X01; IT0=1; //选择负跳变来触发外中断 IT1=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; while(1) ; //无限循环,防止程序跑飞 }

/************************************************************** 函数功能:外中断T0的中断服务程序 **************************************************************/ Time() interrupt 1 //外中断0的中断编号为0 { if(m%delay==0) { m=1; switch(e) { case 0: P1=G; a++; G=P1<<1; // P1=G; if(a==8) { a=0; G=1; } break; case 1: //反序 P1=V; b++; V=P1>>1; // P1=V; if(b==8) { b=0; V=128; } break; case 2: //中间到两边 P1=pow(2,4+c)+pow(2,3-c); c++; if(c==4) { c=0; }

89C51定时器和计数器精编版

AT89C51定时器/计数器 1.定时和计数功能: AT89C51有两个可编程的定时器和计数器:T0和T1。它们可以工作在定时状态也可以工作在计数状态。做定时器时不能用作计数,反之亦然。 2.计数器: 当定时器/计数器作“计数器”用时,可对接到14引脚(T0/P3.4)或15引脚(T1/P3.5)的脉冲信号数进行计数,每当引脚发生从“1”到“0”的负跳变时,计数器加1. 3.定时器: 当定时器/计数器作“定时器”用时,定时信号来自内部的时钟发生电路,每个机器周期等于十二个震荡周期,每过一个机器周期,计数器加1.当晶振频率为12MHz时,则机器周期为1微秒;在此情况下,若计数器为100, 则所定时的时间为:100 x 1 =100微秒。 1

4.与定时器/计数器有关的特殊功能寄存器 5.定时器/计数器的控制 AT89C51单片机定时器/计数器的工作由两个特殊的寄存器TMOD和TCON的相关位来控制, TMOD用于设置它的工作方式,TCON用于控制其启动和中断的请求。 1).TMOD用于设置定时器/计数器的工作方式,其字节地址为89H。低四位用于T0,高四位用于T1。虽有位名称, 2

但无位地址,不可进行位操作。 TMOD中的结构和各位名称 ○1M1,M0:工作方式选择位。M1、M0为两位二进制数,可表示四种工作方式,见下表: ○2C/T:计数/定时方式选择位。 C/T = 1,为计数工作方式,对输入到单片机T0、T1引用的外部信号脉冲计数,负跳变脉冲有效,用作计数器。C/T = 0,为定时工作方式,对片内机器周期(1个机器周期等于12晶振周期)信号计数,用作定时器。 3

单片机实验之定时器计数器应用实验二

一、实验目的 1、掌握定时器/计数器计数功能的使用方法。 2、掌握定时器/计数器的中断、查询使用方法。 3、掌握Proteus软件与Keil软件的使用方法。 4、掌握单片机系统的硬件和软件设计方法。 二、设计要求 1、用Proteus软件画出电路原理图,单片机的定时器/计数器以查询方式工作,设定计数功能,对外部连续周期性脉冲信号进行计数,每计满100个脉冲,则取反P1.0口线状态,在P 1.0口线上接示波器观察波形。 2、用Proteus软件画出电路原理图,单片机的定时器/计数器以中断方式工作,设定计数功能,对外部连续周期性脉冲信号进行计数,每计满200个脉冲,则取反P1.0口线状态,在P 1.0口线上接示波器观察波形。 三、电路原理图 六、实验总结 通过本实验弄清楚了定时/计数器计数功能的初始化设定(TMOD,初值的计算,被计数信号的输入点等等),掌握了查询和中断工作方式的应用。 七、思考题 1、利用定时器0,在P1.0口线上产生周期为200微秒的连续方波,利用定时器1,对 P1.0口线上波形进行计数,满50个,则取反P1.1口线状态,在P 1.1口线上接示波器观察波形。 答:程序见程序清单。

四、实验程序流程框图和程序清单。 1、定时器/计数器以查询方式工作,对外部连续周期性脉冲信号进行计数, 每计满100个脉冲,则取反P1.0口线状态。 汇编程序: START: LJMP MAIN ORG 0100H MAIN: MOV IE, #00H MOV TMOD, #60H MOV TH1, #9CH MOV TL1, #9CH SETB TR1 LOOP: JNB TF1, LOOP CLR TF1 CPL P1.0 AJMP LOOP END C语言程序: #include sbit Y=P1^0; void main() { EA=0; ET1=0; TMOD=0x60; TH1=0x9C; TL1=0x9C; while(1) { TR1=1; while(!TF1); TF1=0; Y=!Y; } }

51单片机中断总结

51单片机中断总结: 1. 查询优先级为固定的(外部中断0>定时器0>外部中断1>定时器1>串行中断)。 2. 执行优先级可以通过IP寄存器进行设置(高/低)。 3. CPU同时收到多个中断请求时,首先响应优先级较高者,然后相应优先级较低者;如果 优先级相同,则按照查询优先级顺序依次响应。 4. 正在执行的中断服务,不能被同级或更低级的中断请求打断,但会被更高级的中断请求 打断。推论(1)高优先级的中断不能被任何其它中断所打断(2)低优先级的中断只能在没有任何中断服务运行时得到响应。 5. 对于定时器和外部中断,在进入中断服务后,其中断标志位会自动清零;对于串行中断,由于有两个中断源,需要手动查询并清零RI或/和TI。 if (RI) { // processing RI = 0; } if (TI) { // processing TI = 0; } 6. 如果是使用汇编写中断服务,需要保护累加器、状态寄存器、寄存器组等 8051 Tutorial: Interrupts https://www.360docs.net/doc/eb12561559.html,/tutint.php As the name implies, an interrupt is some event which interrupts normal program execution. As stated earlier, program flow is always sequential, being altered only by those instructions which expressly cause program flow to deviate in some way. However, interrupts give us a mechanism to "put on hold" the normal program flow, execute a subroutine, and then resume normal program flow as if we had never left it. This subroutine, called an interrupt handler, is only executed when a certain event (interrupt) occurs. The event may be one of the timers "overflowing," receiving a character via the serial port, transmitting a character via the serial

51单片机中断详解

一、中断的概念 CPU在处理某一事件A时,发生了另一事件B请求C PU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待C PU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断二、中断源 在51单片机中有5个中断源 中断号优先级中断源中断入口地址 0 1(最高)外部中断0 0003H 1 2 定时器0 000BH 2 3 外部中断1 0013H 3 4 定时器1 0018H 4 5 串口总段0023H 三、中断寄存器 单片机有10个寄存器主要与中断程序的书写控制有关 1.中断允许控制寄存器IE 2.定时器控制寄存器TC ON 3.串口控制寄存器SCON 4.中断优先控制寄存器IP 5.定时器工作方式控制寄存器TMOD 6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1)

四、寄存器功能与赋值说明 注:在用到中断时,必须要开总中断EA,即EA=1。//开总中断 1.中断允许控制寄存器IE EX0(EX1):外部中断允许控制位 EX0=1 外部中断0开关闭合//开外部0中断 EX0=0 外部中断0开关断开 ET0(ET1):定时中断允许控制位 ET0=1 定时器中断0开关闭合//开内部中断0 ET0=0 定时器中断0开关断开 ES: 串口中断允许控制位 ES=1 串口中断开关闭合//开串口中断 ES=0 串口中断开关断开 2.定时器控制寄存器TCON //控制外部中断和定时器中断 外部中断: IE0(IE1):外部中断请求标志位 当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1,cpu开始响应,处理终端,而当入

51单片机定时器初值的计算

51单片机定时器初值的计算一。10MS定时器初值的计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。10ms=10000次机器周期。 65536-10000=55536(d8f0) TH0=0xd8,TL0=0xf0 2.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。 65536-9216=56320(dc00) TH0=0xdc,TL0=0x00 二。50MS定时器初值的计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次机器周期。 65536-50000=15536(3cb0) TH0=0x3c,TL0=0xb0 2.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。 65536-46080=19456(4c00)

TH0=0x4c,TL0=0x00 三。使用说明 以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而T 每次溢出 最多65536 个机器周期。我们尽量应该让溢出中断的次数最少(如50ms),这样对主程序的干扰也就最小。 开发的时候可能会根据需要更换不同频率的晶振(比如c51单片机,用11.0592M的晶振,很适合产生串口时钟,而12M晶振很方便计算定时器的时间),使用插接式比较方便。 对12MHz 1个机器周期1us 12/fosc = 1us 方式0 13位定时器最大时间间隔 = 2^13 = 8.192ms 方式1 16位定时器最大时间间隔 = 2^16 = 65.536ms 方式2 8位定时器最大时间间隔 = 2^8 = 0.256ms =256 us 定时5ms,计算计时器初值 M = 2^K-X*Fosc/12 12MHz 方式0: K=13,X=5ms,Fosc=12MHz 则M = 2^13 - 5*10^(-3)*12*10^6/12= 3192 = 0x0C78 THx = 0CH,TLx = 78H, 方式1: K=16,X=5ms,Fosc=12MHz 则M = 2^16 - 5*10^(-3)*12*10^6/12= 60536 = 0xEC78 THx = ECH,TLx = 78H,

89C51单片机定时器所定时间的计算以及写法

89C51单片机定时器时间的计算以及写法 今晚学单片机的时候,有一点儿问题,就去网上看了看,发现了很多人不会单片机定时,也就是具体时间的设定,不知道如何设定,而且有关方面的书籍、资料讲解又太过术语化,所以就写一篇通俗些的语言讲述一下如何定时。 为了便于理解,先讲解一点儿关于单片机内部定时器和计数器的基本知识,如果学过数字电路,就不用管这些,看下边的就好了: (1)由于单片机内部定时器、计数器均为八位,所以它们从0开始到计数计满,也就是能从0000 0000计数到1111 1111,即 2^0到2^16,转换成十进制,就是0——65536。 (2)外部的晶振电路提供的频率,到单片机内部,经过硬件电路,进行了12分频,不要问为什么,就这么记着就好了。比如外 部晶振是12MHZ的,那么到了单片机内部,用的频率就是 1MHz的。 89C51单片机常使用的晶振频率为12MHz和11.0592MHz两种,主要讲述这两种频率的,如果用其他的,只需要相应改变即可,下面分别讲述如何定时: (1)使用12MHz晶振: 单片机工作的频率f:12MHz/12=1MHz, 那么时钟周期T1:T1=1/f=1μs, 比如你要定时T2=50ms=50000μs,

你需要总时间T=T1 x T2=50000,也就是说你需要50000个周期才能走完你所要定的时间,当把数全都计满,是需要65536个周期,也就是说还有65536-50000=15536个周期没有走,那么,我们可以把这个初始值放到计数器里面,让它从15536开始计数,当计够50000个周期,也就计满了,即到达了65536。 就像水往水缸里流,你需要流满半缸水的时间,但是现在水缸是空的,你可以先把水缸灌半缸水,然后让它从半缸水开始流,当流满了的时候,也就到了你需要的那个时间。 然后,15536转成十六进制为:0x3CB0,将3C放到定时器的高8位,B0放到第8位,就完成了定时。 我们在写程序赋初始值的时候一般是这么写的,可以参考一下:TH0=0x3C; TL0=0xB0; 或者 TH0=(65536-50000)/256; TL0=(65536-50000)%256; PS:如果你定时是其他的,可以把根据我上边讲解的,把T=50000换成相应的数值即可。 (2)使用11.0592MHz晶振: 单片机工作的频率f:11.0592MHz/12=0.9216MHz, 那么时钟周期T1:T1=(1/0.9216)μs,

51单片机计数器和定时器的本质区别及应用方法

51单片机计数器和定时器的本质区别及应用方法 在51单片机的学习过程中,我们经常会发现中断、计数器/定时器、串口是学习单片机的难点,对于初学者来说,这几部分的内容很难理解。但是我个人觉得这几部分内容是单片机学习的重点,如果在一个学期的课堂学习或者自学中没有理解这几部分内容,那就等于还没有掌握51单片机,那更谈不上单片机的开发了,我们都知道在成品的单片机项目中,有很多是以这几部分为理论基础的,万年历是以定时器为主的,报警器是以中断为主的,联机通讯是以串口为主的。 在这几部分内容中,计数器/定时器对于初学者说很容易搞混淆,下面我将对这方面的内容结合自己的学习经验谈几点看法。 计数器和定时器的本质是相同的,他们都是对单片机中产生的脉冲进行计数,只不过计数器是单片机外部触发的脉冲,定时器是单片机内部在晶振的触发下产生的脉冲。当他们的脉冲间隔相同的时候,计数器和定时器就是一个概念。 在定时器和计数器中都有一个溢出的概念,那什么是溢出了。我们可以从一个生活小常识得到答案,当一个碗放在水龙头下接水的时候,过了一会儿,碗的水满了,就发生溢出。同样的道理,假设水龙头的水是一滴滴的往碗里滴,那么总有一滴水是导致碗中的水溢出的。在碗中溢出的水就浪费了,但是在单片机的定时计数器中溢出将导致一次中断。 在定时器计数器中,我们有个概念叫容量,就是最大计数量。 方式0是2的13次方, 方式1是2的16次方, 方式2是2的8次方, 把水滴比喻成脉冲,那么导致碗中水溢出的最后一滴水的就是定时计数器的溢出的最后一个脉冲。 在各种单片机书本中,在介绍定时计数器时都讲到一个计数初值,那什么是计数初值呢?在这里我们还是假设水滴碗。假设第一百滴水能够使碗中的水溢出,我们就知道这个碗的容量是100。

51单片机定时器计数器汇编实验报告

批 阅 长沙理工大学 实验报告 年级光电班号姓名同组姓名实验日期月日 指导教师签字:批阅老师签字: 内容 一、实验目的四、实验方法及步骤 二、实验原理五、实验记录及数据处理 三、实验仪器六、误差分析及问题讨论 单片机定时器/计数器实验 一、实验目的 1、掌握51单片机定时器/计数器的基本结构。 2、掌握定时器/计数器的原理及编程方法。 二、实验仪器 1、装有keil软件的电脑 2、单片机开发板 三、实验原理 51单片机有2个16位的定时器/计数器,分别是T0和T1,他们有四种工作方式,现以方式1举例。若定时器/计数器0工作在方式1,计数器由TH0全部8位和TL0全部8位构

成。 方式1作计数器用时,计数范围是:1-65536(2^16);作定时器用时,时间计算公式是:T=(2^16-计数初值)×晶振周期×12。 四、实验内容 1、计算计数初值 单片机晶振频率为6MHz,使用定时器0产生周期为120000μs等宽方波连续脉冲,并由P1.0输出。设待求计数初值为x,则: (2^16-x)×2×10^-6 = 120000×10^-6解得x=5536。二进制表示为:00010101 10100000B。十六进制为:高八位(15H),低八位(A0H)。 2、设置相关控制寄存器 TMOD设置为xxxx0001B 3、程序设计 ORG 0000H AJMP MAIN ORG 30H MAIN: MOV P1,#0FFH ;关闭所有灯 ANL TMOD,#0F0H ;置定时器0工作方式1 ORL TMOD,#01H ;不影响T1的工作 MOV TH0,#15H ;设置计数初始值 MOV TL0,#0A0H SETB EA ;CPU开中断 SETB ET0 ;定时器0开中断 SETB TR0 ;定时器开始运行 LOOP: JBC TF0,INTP ;如果TF0=1,则清TF0并转到INTP AJMP LOOP ;然跳转到LOOP处运行 INTP: MOV TH0,#15H ;重新设置计数初值 MOV TL0,#0A0H CPL P1.0 ;输出取反 AJMP LOOP END AJMP LOOP

51单片机定时器使用

51单片机定时器使用——小灯闪烁一、定时器工作方式设置TMOD=0x01 GATE =0 由TR=1控制开始计时; C/ T=0 作为定时时器使用; M1=0\M0=1 用作16位定时器 二、计数寄存器TH0\TL0初始值计算如定时0.02秒 普通51单片机12T模式: (一)手工计算例如晶振为10.6850MHZ 定时20毫秒 X/10.6850*1000000*12=20毫秒 X=17808 原始值T0=Y Y+17808=65536 Y=47728 利用科学计算器进行16进制转换为0Xb800 TH0=0x80 TL0=0x00 (二)单片机公式计算 TL0=T1MS;//初始化定时的计数初值(第8位),高8位丢失 (三)启动定时器(TR0=1),判断是否溢出(If(TF0==1){//}),时间到。 (四)闪烁的小灯代码 #include //P1 0脚接LED小灯 sbit led=P1^0;

//定义延时函数,循环cs次,时间长为20*cs毫秒 void delay20(unsigned int cs) { unsigned int shuL=0; TMOD=0x01; //初始值根据单片机时钟频率计算 TH0=0xB8; TL0=0x00; //启动定时器 TR0=1; while(shuL<=cs) { if(TF0==1) //查询是否溢出,溢出后复位溢出标志,赋初始值,循环计数加。{TF0=0; TH0=0xBA; TL0=0x70; shuL=shuL+1; } } } void main()

{ delay20(500); //小灯取反,亮500*20毫秒,即10秒; led=~led; delay20(500); }

51单片机中断控制LED

单片机作业 题目要求: 设计这样一个系统:在一个51单片机最小系统板上,P1口低四位接四个四角按键,高四位接四个LED灯。按键中断作为总中断,当接中断的按键按下后,所有灯均可按照对应的按键进行点亮。当没有中断按下时,无论怎么按接在P1口低四位的按键,均不能是按键点亮。 实现步骤: 第一:电路搭建: 电路搭建说明: 1.采用AT89C52单片机,DIP40封装。 2.选用12M,并使晶振尽可能接近单片机,采用22pf的电容接在晶振两边并接地,使晶振更容易起振。 3.标号为D18的LED是中断触发指示灯,一旦中断触发,D18会一直亮着。没有中断触发时会一直灭着。 4.key1,key2,key3,key4分别控制D1,D2,D3,D4,D 5. 5.D5为复位指示灯,当复位按键按下时,D5亮。反之灭。 第二:程序实现: 本程序十分简单,秉着杜绝抄袭,自助设计的理念,本程序完全有本人设计完成。没有采用老师讲解的例程。程序的注释已经将程序称述的很明白,现做简要说明: 本人将按键查询部分都放在中断处理函数中处理。当中断触发按键按下时,D18亮,程序进入中断函数,开始不断查询按键值,并点亮相应led.。这样的程序 对CPU的占有率较高,但由于这样写代码更加简单明了,有由于题目对cpu占有率的并没有明确要求,本着开发周期尽可能短的原则,本程序选择了简单方案。

现将代码复制如下: 将KEIL与PROTEUS联调,调试结果如下: 1.启动程序: ,可以看到图中三角符号变绿。此时:

此时,图中所有led灭,无现象。 1.此时按下任意按键,比如key1,key2两个(为了方便截图,直接将开关用导线短路): 现象如下: 可以看到,并没有认可指示灯亮。 2.按复位按键观察是否正常(为了方便截图,直接将开关用导线短路):

51单片机中断详解

一.中断的概念 1.中断发生 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理 2.中断响应和中断服务 CPU暂时中断当前的工作,转去处理事件B 3.中断返回 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A 这一过程称为中断 二.中断过程示意图 三.MCS51中断系统的结构

MCS51的中断系统有5个中断源(8052有6个),2个优先级,可实现二级中断嵌套 四.中断寄存器 单片机有10个寄存器主要与中断程序的书写控制有关 1.中断允许控制寄存器IE 2.定时器控制寄存器TCON 3.串口控制寄存器SCON 4.中断优先控制寄存器IP 5.定时器工作方式控制寄存器TMOD 6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1) 五.部分寄存器详解

1.中断允许控制寄存器(IE) EX0:外部中断0允许位; ET0:定时/计数器T0中断允许位; EX1:外部中断1允许位; ET1:定时/计数器T1中断允许位; ES :串行口中断允许位; EA :CPU中断允许(总允许)位。 2.定时器/计数器控制寄存器控制寄存器(TCON) IT0:外部中断0触发方式控制位 当IT0=0时,为电平触发方式(低电平有效) 当IT0=1时,为边沿触发方式(下降沿有效) IE0:外部中断0中断请求标志位 IT1:外部中断1触发方式控制位 IE1:外部中断1中断请求标志位

TF0:定时/计数器T0溢出中断请求标志位 TF1:定时/计数器T1溢出中断请求标志位 3.串行口控制寄存器(SCON) RI:串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。 TI:串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。 4.中断优先级控制寄存器(IP) PX0:外部中断0优先级设定位 PT0:定时/计数器T0优先级设定位 PX1:外部中断0优先级设定位 PT1:定时/计数器T1优先级设定位

51单片机中断系统程序实例

51单片机中断系统程序实例(STC89C52RC) 51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。 单片机的学习不难,只要掌握学习方法,学起来并不难。什么是好的学习方法呢,一定要掌握二个要点: 1. 要知道寄存器的英文全拼,比如IE = interrupt中断 不知道全拼,要去猜,去查。这样就可以理解为什么是这个名称,理解了以后就不用记忆了。 2. 每个知识点要有形像的出处 比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位 看到ET0, 马上要形像地定位到IE寄存器的第2位 hi.baidu./tuenhai/独家揭秘:形像是记忆的最大技巧。当人眼看到某个图时,是把视觉信号转化成电信号,再转化成人能理解的形像。当我们回忆形像时,就是在重新检索原先那个视觉信号,并放大。在学习过程中,不断练习检索、放大信号,我们的学习能力就会越来越强。

写程序代码时,也要把尽量把每行代码形像化。 51单片机中断源 8051有五个中断源,有两个优先级。与中断系统有关的特殊功能寄存器有IE(中断允许寄存器)、IP(中断优先级控制寄存器)、中断源控制寄存器(如TCON、SCON的有关位)。51单片机的中断系统结构如下图(注意,IF0应为TF0): 8052有6个中断源,它比8051多一个定时器/计数器T2中断源。 8051五个中断源分别是:

(1)51单片机外部中断源 8051有两个外部中断源,分别是INT0和INT1,分别从P3.2和P3.3两个引脚引入中断请求信号,两个中断源的中断触发允许由TCON的低4位控制,TCON的高4位控制运行和溢出标志。 INT0也就是Interrupt 0。在这里应该看一下你的51单片机开发板的电路原理图。离开形像的记忆是没有意义的。读到上面这句,你应该回忆起原理图上的连接。任何记忆都转化为形像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。 TCON的结构如下图: (a)定时器T0的运行控制位TR0 TR0由软件置位或者清0。当门控位GATE=0时,TO计数器仅由TR0控制,TR0=1启动计数,TR0=0时停止。当门控位GATE=1时,T0计数器由INT0和TR0共同控制,当INT0=1且TR0=1时启动T0计数器。

51单片机中断系统详解(定时器、计数器)

51单片机中断系统 51单片机中断级别 中断源默认中断级别序号(C语言用) INT0---外部中断0 最高0 T0---定时器/计数器0中断第2 1 INT1---外部中断1 第3 2 T1----定时器/计数器1中断第4 3 TX/RX---串行口中断第5 4 T2---定时器/计数器2中断最低 5 中断允许寄存器IE 位序号DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 符号位EA ------- ET2 ES ET1 EX1 ET0 EX0 EA---全局中允许位。 EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。EA=0,关闭全部中断。 -------,无效位。 ET2---定时器/计数器2中断允许位。EA总中断开关,置1为开; ET2=1,打开T2中断。EX0为外部中断0(INT0)开关,…… ET2=0,关闭T2中断。ET0为定时器/计数器0(T0)开关,……ES---串行口中断允许位。EX1为外部中断1(INT1)开关,…… ES=1,打开串行口中断。ET1为定时器/计数器1(T1)开关,…… ES=0,关闭串行口中断。ES为串行口(TX/RX)中断开关,…… ET1---定时器/计数器1中断允许位。ET2为定时器/计数器2(T2)开关,…… ET1=1,打开T1中断。 ET1=0,关闭T1中断。 EX1---外部中断1中断允许位。 EX1=1,打开外部中断1中断。 EX1=0,关闭外部中断1中断。 ET0---定时器/计数器0中断允许位。 ET0=1,打开T0中断。 ET0=0,关闭T0中断。 EX0---外部中断0中断允许位。 EX0=1,打开外部中断0中断。 EX0=0,关闭外部中断0中断。 中断优先级寄存器IP 位序号DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 位地址--- --- --- PS PT1 PX1 PT0 PX0 -------,无效位。 PS---串行口中断优先级控制位。

51单片机中断程序大全

( //实例42:用定时器T0查询方式P2口8位控制LED闪烁 #include<> // 包含51单片机寄存器定义的头文件 void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 : TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; ] TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频 #include<> // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为引脚 void main(void) ( {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 — { while(TF1==0); TF1=0;

51定时器计数器使用

第六章MCS51单片机定时器/计数器 第一节定时器/计数器结构和工作方式 (一)学习要求 (1) 了解定时器/计数器0、1结构。 (2)了解定时器/计数器0、1的四种方法。 (二)内容提要 一、定时/计数器构成 1、定时方法 软件延时通过执行循环而获得延时,短时间延时; 硬件延时由硬件电路实现延时,长时间延时; 可编程定时通过对系统时钟脉冲的计数而获得延时。 2、MCS-51单片机的定时/计数器 16位定时/计数器T0、T1,分别由4个8位计数器组成,均属SFR寄存器。 T0由TH0、TL0构成,字节地址为8CH、8AH;T1由TH1、TL1构成,字节地址为8DH、8BH; 3、MCS-51单片机定时/计数器的功能,归根结底是计数器。 (1)定时功能对片内机器周期进行计数,即每个机器周期产生一个计数脉冲,计数加1。 (2)计数功能对片外从T0(P3.4)、T1(P3.5)引脚输入的外部脉冲信号进行计数,下降沿计数加1。 二、定时/计数器的控制寄存器 与定时/计数器有关的控制寄存器有3个: 1、定时器控制寄存器TCON(88H) SFR寄存器TCON既参与定时控制又参与中断控制,有关定时控制的有4位,表示如下: TF1/TF0:当T1/T0的计数器计数溢出时,该位置“1”。TR1/TR0:T1/T0运行控制位。软件将其置“1”时,启动T1/T0工作。 2、设定定时器工作方式寄存器TMOD(89H) SFR寄存器TMOD用于2个定时器/计数器T1/T0的工作方式设定,各位的含义表示如下: GA TE:门控位,定义T1/T0的启动方式,逻辑如图: C/T:定时/计数功能选择位。为“0”,作定时器

51单片机汇编语言教程:18课单片机中断系统

51单片机汇编语言教程:第18课-单片机中断系统

MCS-51单片机中断系统的结构: 5个中断源的符号、名称及产生的条件如下。 INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。 INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。 T0:定时器/计数器0中断,由T0计满回零引起。 T1:定时器/计数器l中断,由T1计满回零引起。 TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起。整个中断系统的结构框图见下图一所示。

<51单片机中断系统结构> 如图所示,由与中断有关的特殊功能寄存器、中断入口、次序查询逻辑电路等组成,包括5个中断请求源,4个用于中断控制的寄存器IE、IP、ECON和SCON来控制中断类弄、中断的开、关和各种中断源的优先级确定。 中断请求源: (1)外部中断请求源:即外中断0和1,经由外部管脚引入的,在单片机上有两个管脚,名称为INT0、INT1,也就是P3.2、P3.3这两个管脚。在内部的TCON中有四位是与外中断有关的。IT0:INT0触发方式控制位,可由软件进和置位和复位,IT0=0,INT0为低电平触发方式,IT0=1,INT0为负跳变触发方式。这两种方式的差异将在以后再谈。IE0:INT0中断请求标志位。当有外部的中断请求时,这位就会置1(这由硬件来完成),在CPU响应中断后,由硬件将IE0清0。IT1、IE1的用途和IT0、IE0相同。(2)内部中断请求源TF0:定时器T0的溢出中断标记,当T0计数产生溢出时,由硬件置位TF0。当CPU响应中断后,再由硬件将TF0清0。TF1:与TF0类似。TI、RI:串行口发送、接收中断,在串行口中再讲解。2、中断允许寄存器IE在MCS-51中断系统中,中断的允许或禁止是由片内可进行位寻址的8位中断允许寄存器IE来控制的。见下表EAX 其中EA是总开关,如果它等于0,则所有中断都不允许。ES-串行口中断允许ET1-定时器1中断允许EX1-外中断1中断允许。ET0-定时器0中断允许EX0-外中断0中断允许。如果我们要设置允许外中断1,定时器1中断允许,其它不允许,则IE能是EAX 即8CH,当然,我们也能用位操作指令SETB EA SETB ET1SETB EX1 来实现它。3、五个中断源的自然优先级与中断服务入口地址外中断0:0003H定时器0:000BH 外中断1:0013H定时器1:001BH串行口:0023H它们的自然优先级由高到低排列。写到这里,大家应当明白,为什么前面有一些程序一始我们这样写: ORG0000HLJMP START ORG0030H START:。 这样写的目的,就是为了让出中断源所占用的向量地址。当然,在程序中没用中断时,直接从0000H开始写程序,在原理上并没有错,但在实际工作中最好不这样做。优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即能由程序员设定那些中断是高优先级、

相关文档
最新文档