51单片机定时器TMOD与TCON、SCON |
您所在的位置:网站首页 › 团队m0是干嘛的 › 51单片机定时器TMOD与TCON、SCON |
51单片机中断级别
中断源 默认中断级别 序号(C语言用) INT0---外部中断0 最高 0 T0 ---定时器/计数器0中断 第2 1 INT1---外部中断1 第3 2 T1 ----定时器/计数器1中断 第4 3 TX/RX---串行口中断 第5 4 T2 ---定时器/计数器2中断 最低 5 ———————————————— 定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 D0~D3为T0定时/计数器的设置,D4~D7为T1定时/计数器的设置 。 GATE :为门控位,GATE=0时,只要在编写程序时,使TCON中的TRO或TR1为1,就可以启动定时器/计数器工作。 GATE=1时,不仅要在编写程序时,使TCON中的TRO或TR1为1,且需要外部引脚也为高电平,才能 工作。 C/T :定时/计数模式切换,C/T=0时为定时模式,C/T=1时为计数模式。 M1,M0:用来选择定时计/计数器的工作方式,一般使用都是采用16位的计时计数器。 TCON 定时器控制寄存器定时器控制寄存器,作用是控制定时器的启、停,标志定时器溢出和中断情况。 TF1 :TF1=1表示T1有中断产生。(Timer Flag,定时器标志位) TR1 :TR1=1表示T1开始运行。(单片机中T0引脚,需要高低电平的驱动) TF0 :TF0=1表示T0有中断产生。 TR0 :TR0=1表示T0开始运行。(单片机中T1引脚,需要高低电平的驱动) IE1 :IE1=1表示INT1有中断产生。 IT1 :IT1=1表示INT1为下降沿触发,IT1=0表示INT1为低电平触发。 IE0 :IE0=1表示INT0有中断产生。 IT0 :IT0=1表示INT0为下降沿(负跳变)触发,IT0=0表示INT0为低电平触发。 外部中断: IE0/IE1:外部中断请求标志位 当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1, CPU开始响应,处理中断,而当入中断程序后由单片机自动置0. IT0/IT1:外部中断触发方式控制位 //选择有效信号 IT0/IT1=1:脉冲触发方式,下降沿有效。 IT0/IT1=0:电平触发方式,低电平有效。 ———————————————— 中断允许寄存器 IE (A8H)EA :整体中断允许位;EA=1允许中断。 ET2 :T2中断允许位;ET2=1允许中断(S52才有)。 ES :串行中断允许位;ES=1允许中断。 ET1 :T1中断允许位;ET1=1允许中断。 EX1 :INT1中断允许位;EX1=1允许中断。 ET0 :T0中断允许位;ET0=1允许中断。 EX0 :INT0中断允许位;EX0=1允许中断。 在程序中,通过设订两个8位寄存器中TH与TL的值,来决定定时值和计数值。TH与TL的计算过程如下: 假设定时器的时间常数为X,定时器的位数为N 定时时间T=(2的N次方-X)12/单片机晶振频率 (例如11.0592MHZ的振荡器频率F=1/11.0592) N为定时器的工作方式(关于定时/计数器的4中工作方式,以下会有具体介绍): 方式0时,N=13(此为TH为8位,TL为5位) 方式1时,N=16(此为TH为8位,TL为8位) 方式2时,N=8(此为TH为8位,TL为0位) 方式3时,N=8(此为TH为8位,TL为8位,只适用于T0,且T0被分成两个独立的8位计数器TH与TL) 根据定时时间和工作方式,通过公式:定时时间T=(2的N次方-X)12/单片机晶振频率,计算出时间常数X 把X转换成二进制数,高8位送给TH1,低8位送给TL1,就可以启动定时器开始定时了。 定时器的3种工作方式图解: 工作方式0: 工作方式1: 工作方式2: 工作方式3: 总结定时器的操作步骤如下: 1.选择工作方式(设置M0,M1的值) 2.选择控制方式GATE(为0是只要软件设定好参数即可,为1则需要软件设定参数,且定时器/计数器的中断引脚需要为高电平) 3.确定定时器的工作模式,是定时模式还是计数模式 C/T. 4.给定时器设初值(设置THX与TLX) 5.开启定时器中断(设置ET0或ET1) 6.开启总中断(设置EA的值) 7.定时器/计数器的选择T0/T1(设置TR1或TR0的值) 例:设置一个LED灯每500ms的评率闪烁 #include sbit led = P1^0; int i = 0; void timer1_init() { TMOD = 0x10; //定时器 1 选择工作方式1 TH1 = 0x4C; //设置初始值,定时50ms TL1 = 0x00; EA = 1; //打开总中断 ET1 = 1; //打开定时器1中断 TR1 = 1; //启动定时器1 } void main() { led = 1; timer1_init(); //定时器1的初始化 while(1) { if(i==10) { led = ~led; i = 0; //注意i需要零 } } } void timer1() interrupt 3 { TH1 = 0x4C; //设置初始值,定时50ms TL1 = 0x00; i++; } ¡定时器操作步骤: 选择工作方式(设 ¡定时器操作步骤: 选择工作方式(设置M1,M0) 选择控制方式(设置GATE) 选择定时器还是计数器模式(设置C/T) 给定时/计数器赋初值(设置THx和TLx 开启定时器中断(设置ET0或ET1 开启总中断(设置EA) 打开计数器(设置TR1或TR0) 置M1,M0) 选择控制方式(设置GATE) 选择定时器还是计数器模式(设置C/T) 给定时/计数器赋初值(设置THx和TLx 开启定时器中断(设置ET0或ET1) 开启总中断(设置EA) 打开计数器(设置TR1或TR0) 定时器操作步骤 选择工作方式(设置M1,M0) 选择控制方式(设置GATE) 选择定时器还是计数器模式(设置C/ 给定时/计数器赋初值(设置THx和TLx) 开启定时器中断(设置ET0或ET1 开启总中断(设置EA) 打开计数器(设置TR1或TR0) 由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0 ———————————————— SCON 串口控制寄存器SM0、SM1工作方式控制位 SM2:多机通信控制位,1-允许、0-不允许 REN:串行接收允许位。1-允许、0-不允许 TB8:发送数据第九位 RB8:接收数据第九位 TI:发送中断标志位 RI:接收中断标志位 ①SM0和SM1 :串行口工作方式选择位 ,两个选择位对应四种通信方式,如下图所示,其中fosc是振荡频率 SM2:多机通信控制位,主要用于方式2和方式3。 若SM2 = 1;则允许多机通信。多机通信协议规定,第9位数据(D8)为1,说明本帧数据为地址帧;若第9位数据为0,则本帧数据为数据帧。当一个89c51(主机)与多个89c51(从机)通信时,所有从机的SM2位都置1,主机首先发送的一帧数据为地址,即某从机号,其中第9位为1,所有的从机接收数据后,将其中第9位数据装入RB8中。各个从机根据接收到的第9位数据(RB8中)的值来决定从机是否再接收主机的信息、若(RB8)= 0,说明是数据帧,则使接收中断标志位RI = 0,信息丢失,若RB8 = 1,说明是地址帧,数据装入SBUF并置RI = 1,中断所有从机,被寻址的目标从机清除SM2,以接收主机发来的一帧数据,其它从机仍然保持SM2 = 1。 若SM2 = 0,即不属于多机通信情况,则接收完一帧数据后,不管第9位数据是0还是1,都置RI = 1,接收到的数据装入SBUF中。在方式0时SM2必须置0。在方式1时,若SM2 = 1,则只有接收到有效停止位时,RI才置1,以便接收下一帧数据。 REN:允许接收控制位,由软件置1或清0 REN = 1时,允许接收,相当于串行接收的开关 REN = 0时,禁止接收 在串行通信接收控制过程中,如果满足RI = 0和REN = 1的条件,就允许接收。 TB8:发送数据的第9位(D8)装入TB8中。在方式2或方式3中,根据发送数据的需求由软件置位或复位。在许多通信协议中可用作奇偶校验位,也可以在多机通信中作为发送地址帧或者数据帧的标志位。 RB8:接收数据的第9位,原理同TB8 TI:发送中断标志位,在一帧数据发送完时被置位。在串行发送到停止位的开始时由硬件置位,可用软件查询。它同时也申请中断。TI置位意味着向CPU提供“发送缓冲器SBUF已空”的信息,CPU可以准备发送下一帧数据。串行口发送中断被响应后,TI不会自动清0,必须软件清0. RI:接收中断标志,在接收到一帧数据后由硬件置位。当RI = 1时,申请中断,表示一帧数据接收结束,并已装入接收SBUF中,要求CPU取走数据,CPU响应中断,取走数据。RI位也必须由软件来清0,。 串行发送中断标志TI和接收中断标志RI是同一个中断源,CPU事先不知道是发送中断TI还是接收中断RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。复位时SCON所有位都清0. /* SMOD为PCON的最高位 9600==(2^SMOD / 32)*(T1溢出率) T1溢出率==11059200/12/(256-TH) 9600=(1/32)*( 11059200/12/(256-TH) ) TH==256-11059200/12/32/9600==256-3=0xFD */ /* ***************************************** **函数功能:串口初始化函数 ***************************************** */ void UART_Init() { TMOD = 0x20; //定时器1工作模式2,自动重装8位计数器 TH1 = 0xfd; TL1 = 0xfd; //定时器溢出时,会自动将高8位中的值赋值给低8位.比特率9600 TR1 = 1; SM0 = 0; SM1 = 1; REN = 1; EA = 1; ES = 1; } /* ******************************************** **函数名称:串口中断函数 ******************************************** */ void UART() interrupt 4 { if(RI == 1) //如果接收到计算机发的数据 { num = SBUF; //取出数据 num++; RI = 0; //清除标志位 SBUF = num; //把数据加1后再发送给计算机 } if(TI == 1) //如果发送完毕 { TI = 0; //清除标志位 } } ———————————————— PCON 电源控制位寄存器电源控制位寄存器PCON中只有SMOD位与串口工作有关,如下图所示 SMOD:波特率倍增位。在方式1、2、3中,当SMOD = 1时,波特率提高一倍。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |