单片机定时器讲解和实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、计数器是什么?
  • 二、单片机定时器结构
    • 2.1***两个8位如何合成16位,16位如何分成两个8位***
    • 2.2 计数器的位数组合?
    • 2.3 定时功能和计数功能?
      • 2.3.1定时功能
      • 2.3.2 计数功能
  • 三、使用步骤
    • 3.1 定时10us
    • 3.2 定时1s怎么办?
  • 四、参考程序
    • 1.定时1s
    • 2.读入数据
  • 五、思考
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

日常生活中,哪里用到时间?
定时是如何实现的?
单片机如何实现定时?


提示:以下是本篇文章正文内容,下面案例可供参考

一、计数器是什么?

推荐观看基础视频

及其巧妙的设计!让几个简单的元器件实现计数!CPU是如何实现计数的!计数器的工作原理!

https://www.bilibili.com/video/BV1D3411v7jP/?spm_id_from=333.337.search-card.all.click

二进制计数器

https://www.bilibili.com/video/BV18K4y177Xx/?spm_id_from=333.337.search-card.all.click

入坑单片机 – [12_1]定时器工作原理

https://www.bilibili.com/video/BV1MY4y1u7eY/?spm_id_from=333.337.search-card.all.click

二、单片机定时器结构

单片机定时器讲解和实现_第1张图片

2.1两个8位如何合成16位,16位如何分成两个8位

unsigned char h0 ,l0  //两个8位
unsigned int t16;    //16位
t16=h0*256+l0;
h0=t16/256;   // 高八位   1000/256  =3
l0=t16%256;   //低八位    1000%256  =232 =0xe8    

单片机定时器讲解和实现_第2张图片

2.2 计数器的位数组合?

单片机定时器讲解和实现_第3张图片

2.3 定时功能和计数功能?

2.3.1定时功能

单片机定时器讲解和实现_第4张图片

2.3.2 计数功能

单片机定时器讲解和实现_第5张图片

三、使用步骤

3.1 定时10us

  • 1.定时功能
  • 2.确定计数器位数,16位,装初值 65526

单片机定时器讲解和实现_第6张图片

TMOD=0X01;  //不能位寻址  M1=0 不对的

假设装0, 0 1 2 3 4 5 6 7 8 9
方法1: 有可能会错过

while(1)
{
	t16=TH0*256+TL0
	if(t16==9)
	{
		
	}
}

方法2:
中断

65536-10=65526;
TH0=65526/256;
TL0=65526%256;

t就是设定的定时us 数,注意目前是12MHz
t的范围 0 - 65535 1-65536us 够1s吗?
TH0=(65536-t)/256;
TL0=(65536-t)%256;

  • 3.开启定时器
    单片机定时器讲解和实现_第7张图片
TR0=1;
  • 4.配置中断
ET0=1;
EA=1;
PT0=0;

  • 5.中断服务函数
void timer0() interrupt 1
{

   TH0=65526/256;
   TL0=65526%256;
   LED=!LED;
}

3.2 定时1s怎么办?

t的范围 0 - 65535 1-65536us 够1s吗?
TH0=(65536-t)/256;
TL0=(65536-t)%256;

解决方法:50ms溢出一次,进一次中断

放一个变量num

num=20
20*50=1000ms=1s

修改代码

...
unsigned char num
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;


void timer0() interrupt 1
{
	
	TH0=(65536-50000)/256;//
    TL0=(65536-50000)%256;// 必须要重新装,否则从0计
	num++;
	if(num==19)
	{
		num=0;
		LED=!LED;
    }
  
}
...







四、参考程序

1.定时1s

代码如下(示例):

#include "reg51.h"

sbit LED=P2^0;
unsigned char num;
void main()
{

	TMOD=0X01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	
	ET0=1;
	EA=1;
	PT0=0;
	
	TR0=1;
	
	
	while(1)
	{
	
	
	
	}
}

void timer0() interrupt 1
{
	
	TH0=(65536-50000)/256;//
    TL0=(65536-50000)%256;// 必须要重新装,否则从0计
	num++;
	if(num==19)
	{
		num=0;
		LED=!LED;
    }
  
}


2.读入数据

代码如下(示例):



五、思考

    1. 使用按键改变定时时间 按键1 +0.5s
    1. 按键2 -0.5s
    1. 时间范围 0.5-5s

总结

你可能感兴趣的:(单片机,单片机,嵌入式硬件)