提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、计数器是什么?
- 二、单片机定时器结构
- 2.1***两个8位如何合成16位,16位如何分成两个8位***
- 2.2 计数器的位数组合?
- 2.3 定时功能和计数功能?
- 2.3.1定时功能
- 2.3.2 计数功能
- 三、使用步骤
- 3.1 定时10us
- 3.2 定时1s怎么办?
- 四、参考程序
- 1.引入库
- 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
二、单片机定时器结构
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.1定时功能
2.3.2 计数功能
三、使用步骤
3.1 定时10us
- 1.定时功能
- 2.确定计数器位数,16位,装初值 65526
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.开启定时器
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.引入库
代码如下(示例):
2.读入数据
代码如下(示例):