学习目标:
计数就是计算脉冲个数
1.定时器如何工作
2.寄存器介绍
3.定时器的主要寄存器介绍
4.如何编程和程序代码
学习内容:
1.定时器如何工作
1)先设置好定时器的时钟源( 如果需要的话)
2)初始化时钟相关寄存器
3)设置定时时间( 计数个数)
4)设置中断处理程序
5)打开定时器
2.寄存器介绍
什么是寄存器
( 1 ) register
( 2 ) 寄存器, 寄存, 内容可变, 一般按位定义
( 3 ) 寄存器使用地址访问, 编程上像内存一样
寄存器的工作原理
( 1 ) 寄存器和硬件之间有双向影响
( 2 ) 软件可以读写寄存器
( 3 ) 总结: 寄存器是软件能够控制硬件的关键
单片机学习的关键就是各种寄存器
( 1 ) 单片机的学习主要包括2 个: CPU 和各种内部外设
( 2 ) 各种内部外设的编程接囗就是寄存器
( 3 ) 熟悉一款单片机其实就是熟悉他的寄存器
( 4 ) 寄存器会随着单片机的复杂化而变复杂
( 5 ) 学会用c 语言操作寄存器的技巧
3.定时器的主要寄存器介绍
定时器的主要寄存器介绍1
TCON
( 1 ) 8 个位, 但是有4 个名字: TF 、TR 、IE 、IT , 每个名字的符号都有2 个, 后面分别带0 和1 , 对应T0和T1
( 2 ) TF : timer
flag , 定时器( 溢出) 标志位, 是只读( 软件只是通过读取TFI 来知道硬件的状态, 而不用去写这一位来设置硬件的状态) 的。timer 定时时间到了后会做2 件事情: 第一个是把TF 标志改为1 ,第二个是产生中断让CPU 去中断处理; TF 是硬件清零的( 由1 变0 是自动的, 不需要软件来干预。) 有一些CPU 的设计是需要软件去清零的, 这时候用户的程序就一定要记得给标志位清零, 不然就不能重复进入中断或者反复不停的重复进入中断。
( 3 ) TR就是timer
run , 就是定时器的启动计数的开关。当我们把整个定时器初始化好了之后, 我们给TR 位写1 就可以开启计数了。
TR位和GATE位有一定关联性
(4)GATE是TMOD寄存器中的,也是2个分别对应T0和T1。GATE位中文名叫门控位,工作方式是,当GATE=0时(相当于门是打开的,此时GATE位是可以忽略的),此时定时器开关就只受TR位影响。具体就是TR=1开启计数,TR=0结束计数。当timer处于定时器工作模式时GATE就要等于0;GATE一般是在timer处于计数器模式时用的。当timer用来计数时,很关键的就是什么条件下计数,什么条件下不计数。当GATE=0时计数条件只有TR1一个,TR1=1就计数,TR1=0不计数。当GATE=1时是否计数不仅取决于TR1还取决于INT1引脚(P3.3),实际规则是:当TR1=1并且INT1引脚也为高电平时才会计数。
( 1 ) IE 也是一个标志位, 用就是用展示硬的状态改变的。譬如IE1 对应外部断1 (INT1)
平时不发生INT1时“IE1=0 , 当INT1 发生中断时, 硬件自动IE1=1 , 当CPU 处理了INTI1时硬件会自动给1E1=0 ( 硬件自动清零)。
( 2 ) IT 是用来设置外部中断的中断触发方式的。所谓中断的触发方式, 就是指硬件在某种条件下才会被判定为要产生中断, 所以其实就是中断产生的条件。中断触发方式一般就是: 边沿触发和电平触发2 种。边沿触发又分为: 上升沿触发、下降沿触发、双边沿触发; 电平触发方式分为:高电平触发、低电平触发2 种。
TMOD
( 1 ) GATE上面已经介绍完
( 2 )C/T位设置T0 / TI 工作在定时器模式还是计数器模式。1 表示计数器, 0 表示定时器
( 3 ) MI + M0 , 2 个位一起来表示T0 / TI 处于哪种工作模式下, 一般有4 种: 13 位、16 位、8 位自动重载、双8位。
4.如何编程
( 1 ) 定时(timer 初始化)
( 2 ) 主程该干嘛干嘛
( 3 ) 中断处理程序
我们开发板的定时器最多能订多长时间?
内部时钟频率是1MHz , 时钟周期是1us 。最多能定65535 ( 16 位定时器) , 也就是说最大定时时间为65535 * 1us = 65535us = 65.535ms 。
如果要定比较长的时间( 譬如2s ) , 定时器直接是不能满足的, 解决办法是多次定时后加起来构成一个长时间。
计算TLO 和THO :
( 1 ) 确定自己定时时间, 定为50ms
( 2 ) 确定内部时钟周期, 因为12T 模式, 外部晶振12MHz , 所以为:1us
( 3 ) 定时个数就是: 50ms / lus = 50000
( 4 ) TLO = (65536-50000) % 256 ,THO=(65535-50000) / 256 //因为51是加法计数器所以要减50000
可以使用工具计算
#include<reg51.h> //头文件包含
unsigned char count;//10此对应500ms
sbit LED = P0^1;
void timer0_isr(void) interrupt 1 using 1
{
TL0 = (65535-50000) % 256;
TH0 = (65535-50000) / 256;
if(count--==0)
{
//说明已经中断了10次了,500ms到了
//LED取反
LED = !LED;
count = 10;
}
}
void main(void)
{
TMOD=0x01; //T0设置工作在16位定时器模式下
//50ms 因为是16位所以最大65ms
TL0 = (65535-50000) % 256;
TH0 = (65535-50000) / 256;
TR0 = 1; //开启计数器
//
ET0 = 1; //开启T0中断
EA = 1; //开启中断总开关
count = 10;
while(1); //主任务
}
学习时间:
提示:这里可以添加计划学习的时间
例如:
- 周一至周五晚上 7 点—晚上9点
- 周六上午 9 点-上午 11 点
- 周日下午 3 点-下午 6 点
学习产出:
提示:这里统计学习计划的总量
例如:
- 技术笔记 2 遍
- CSDN 技术博客 3 篇
- 习的 vlog 视频 1 个