各种周期之间的关系
51单片机T数是12.
中断寄存器
单片机的中断寄存器主要包括:
IE – 中断允许控制寄存器(重点)
IP – 中断优先级控制寄存器
TMOD – 定时器工作方式寄存器(重点)
TCON – 定时器控制寄存器(重点)
SCON – 串口控制寄存器
THx/TLx – 定时器初值寄存器(重点)
中断允许控制寄存器 IE
EA -全局中断允许位,当此位是1时中断可用。(重要)
ET2-定时器/计数器2中断允许位
ES -串口中断允许位
ET1-定时器/计数器1中断允许位
EX1-外部中断1允许位
ET0-定时器/计数器0中断允许位 (重要)
EX0-外部中断0允许位
定时器控制寄存器 TCON
TF1 定时器1溢出标志位
TR1 定时器1运行控制位,将该位置1时启动定时器1(重要)
TF0 定时器0溢出标志位
TR0 定时器0运行控制位,将该位置1时启动定时器0 (重要)
IE1 外部中断1请求标志
IT1 外部中断1触发方式选择位
IE0 外部中断0请求标志
IT0 外部中断0触发方式选择位
定时器初值寄存器 THx/TLx
第一种
TH0=(65536-50000)/256; //定时器T0的高8位赋初值
TL0=(65536-50000)%256; //定时器T0的高8位赋初值
50000就是我们设置的时间,比如机械周期是1us,那么50000*1us=50ms
第二种
TH0 = 0x3c;//高位
TL0 = 0xb0; //低位
首先把高低位拼在一起,THTL=0x3cb0,转换成十进制为THTL =15536,65536-15536=50000
定时器工作方式寄存器 TMOD
TMOD中取决定因素的是M1、M0两位,TMOD=10,则T1采用方式1,T0采用方式0。
四种模式的定时时间算法为:
1、(2^13-T0初值)振荡周期单片机T数
2、(2^16-T0初值)振荡周期单片机T数
3、(2^8-T0初值)振荡周期单片机T数
/**************************************************************************************
实验现象:下载程序后,D1小灯循环点亮1秒,熄灭1秒。使用单片机内部定时器可以实现准确延时
接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)
1,单片机-->LED&交通灯模块
P20-->D1
注意事项:
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit led=P2^0; //定义P20口是led
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
Timer0Init(); //定时器0初始化
while(1);
}
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 1
* 函数功能 : 定时器0中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
led=~led;
}
}