51单片机定时器使用与计算-----day3

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
下图为重点:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
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= 921600
T; 设定时20ms
X=65536-921600*T
X=47104
T单位为S。
一次定时时间不能超过71ms。
程序如下:
LED灯每1S闪烁一次。

#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); */
	 }
}
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从小白到大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值