51单片机定时器-----day3
8051单片机介绍:
集成 8位CPU、 4K字节ROM(掉电不丢失)、 128字节RAM(掉电丢失)、 4个8位并口、 1个全双工串行口、2个16位定时/计数器。 寻址范围64K, 并有控制功能较强的布尔处理器(带位操作)。
单片机结构内部框图:
机器周期和指令周期
( 1) 振荡周期: 也称时钟周期, 是指为单片机提供时钟脉冲信号的振荡源的周期, JY51-V1.0实验板上晶振为11.0592M。振荡周期: T=1/11059200
( 2) 状态周期: 每个状态周期为时钟周期的 2 倍, 是振荡周期经二分频后得到的。
( 3) 机器周期: 一个机器周期包含 6 个状态周期S1~S6, 也就是 12 个时钟周期。 在一个机器周期内, CPU可以完成一个独立的操作。 T=12*(1/11059200)
( 4) 指令周期: 它是指CPU完成一条操作所需的全部时间。每条指令执行时间都是有一个或几个机器周期组成。 MCS - 51系统中, 有单周期指令、 双周期指令和四周期指令。
时钟周期T是时序中最小的时间单位。 具体计算就是1/时钟源。 单片机使用的时钟周期= 1/11059200 s。
机器周期 CPU完成一个操作的最短时间。普通51一个机器周期是12个时钟周期。
注:不带括号的可以操作独立寄存器,带括号的只能整体使用不可单独位寻址
寄存器:
工作方式:
13位计数器:0-2^13
16位计数器:0-2^16
模式1: 16位的计数器。 ( TH1,TL1)
模式2: 自动装载8位计数器。 主要应用在串口波特率发生器。
模式0和模式3: 几乎不用。
TCON和TMOD复位后都会自动变成0x00。
★ C/T= 0, 设置为定时方式。
定时器计数 805l片内脉冲, 亦即对机器周期计数。
★ C/T= 1, 设置为计数方式,
计数器的输入是来自T0(P3. 4)或Tl(P3.5)端的外部脉冲。
GATE= 0时, 只要用软件使TR0(或TRl)置1就启动了定时器,而不管INT0(或INT1)的电平是高还是低。
GATE= l时, 只有当INT0(或INT1)引脚为高电平且由软件使TR0(或TRl)置1时, 才能启动定时器工作。
TMOD不能位寻址 , 只能用字节设置定时器工作方式;
低半字节设定T0 , 高半字节设定T1。
下图为重点:
文章来源:https://www.toymoban.com/news/detail-768887.html
TCON各位的作用如下:
TF1: T1溢出标志位。 当T1溢出时由硬件自动使中断触发器TF1置1, 并向CPU申请中断。 当CPU响应进入中断服务程序后, TF1又被硬件自动清0。 TF1也可以用软件清0。
TF0: T0溢出标志位**。 其功能和操作情况如TF1。
TR1: T1运行控制位。 可由软件置1或清0来启动或关闭T1。 指令(SETBTRl)使TR1位置1, 定时器T1便开始计数。
TR0: T0运行控制位。 其功能及操作情况同TRl。8051复位时, TCON的所有位被清0。
定时器操作步骤,不使用中断函数如下:
第一: 设置特殊功能寄存器TMOD, 使之工作在需求的状态。
第二: 设置计数寄存器的初值, 精确设定好定时时间。
第三: 设置特殊功能寄存器TCON, 通过打开TR来让定时器进行工作。 (也可设置为中断模式)
定时时间计算方法:
定时器: 每经过一个机器周期, 寄存器加1。因此, 可以将机器周期看作为计数周期。===>12*(65536 – x) /11059200 = 需要定时的时间
定时器从设定的初值开始累加。
TH1 = 0xB8; TL1 = 0X00;
12*(65536 – x) /11059200 = 需要定时的时间
65536-X = (11059200/12 )T
65536-X= 921600T; 设定时20ms
X=65536-921600*T
X=47104
T单位为S。
一次定时时间不能超过71ms。
程序如下:
LED灯每1S闪烁一次。文章来源地址https://www.toymoban.com/news/detail-768887.html
#include<reg52.h>
sbit HC595_SCK = P0^5;
sbit HC595_RCK = P0^6;
sbit HC595_DATA = P0^7;
code unsigned char Led8_One_Array[2] = {0x01,0x00};
code unsigned char Led8_Two_Array[2] = {0x00,0x00};
void Send_595_Data(unsigned char Led8_One,unsigned char Led8_Two)
{
unsigned char i;
HC595_RCK = 0;
for(i=0;i < 8;i++)
{
HC595_SCK = 0;
if(0 != (Led8_One & 0x80))
{
HC595_DATA = 1;
}
else
{
HC595_DATA = 0;
}
Led8_One = Led8_One<<1;
HC595_SCK = 1;
}
for(i=0;i < 8;i++)
{
HC595_SCK = 0;
if(0 != (Led8_Two & 0x80))
{
HC595_DATA = 1;
}
else
{
HC595_DATA = 0;
}
Led8_Two = Led8_Two<<1;
HC595_SCK = 1;
}
HC595_RCK = 1;
}
/*void Delay_1MS(unsigned int i)
{
unsigned int j;
for(;i > 0;i--)
{
for(j=0;j<110;j++);
}
}
*/
void Time0_Init()
{
TMOD = 0X01;
TH0 = 0XB8;
TL0 = 0X00;
TR0 =1; //设置成1后定时器开始计时。
}
void main()
{
unsigned char k,Counter = 0;
Time0_Init();
while(1)
{
if(1 == TF0) //判断是否T0是否溢出是的话清0,未用中断所以需要手动清零
{
TF0 = 0;
TH0 = 0XB8; //重装初值
TL0 = 0X00;
Counter++; //每20MS加1
}
if(100 == Counter) //2s中后进行翻转LED灯状态
{
Counter = 0;
k = !k;
}
Send_595_Data(Led8_One_Array[k],Led8_Two_Array[0]);
/*Delay_1MS(1000);
Send_595_Data(Led8_One_Array[1],Led8_Two_Array[0]);
Delay_1MS(1000); */
}
}
到了这里,关于51单片机定时器使用与计算-----day3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!