360搜索网站提交入口,医院建筑工程网,个人网站可以做自媒体吗,景观规划设计公司51单片机快速入门之定时器
断开外部输入
晶振振荡 假设为 12MHz
12分频之后,为1MHz 当其从0-65536 时,需要65536μs 微秒 也就是65.536ms 毫秒
溢出(值65536 时)中断执行中断操作 假设需要1ms后产生溢出,则需要设置初始值为64536
此时定时器会从 64536 开始计…51单片机快速入门之定时器
断开外部输入
晶振振荡 假设为 12MHz
12分频之后,为1MHz 当其从0-65536 时,需要65536μs 微秒 也就是65.536ms 毫秒
溢出(值65536 时)中断执行中断操作 假设需要1ms后产生溢出,则需要设置初始值为64536
此时定时器会从 64536 开始计数 (1000μs 微秒 1 ms 毫秒 )
51单片机快速入门之计数器
计算外部输入的脉冲信号
假设设置其为16位计数器,其最大计数值为 2^1665536
溢出(值65536 时)中断执行中断操作 假设需要100个脉冲后产生溢出,则需要设置初始值为65436
此时计数器会从 65436 开始计数 结构原理
由 两个8位 计数器构成的 16位 计数器
由 TCON 寄存器 控制 开(1) / 关(0)
由 TMOD 寄存器 设置 工作方式 (定时还是计数)
TMOD寄存器
以下图片来源于stc89c52官方数据手册: 这个GATE用于IO口控制 定时器 使用(1) / 不使用(0) 如果需要IO口控制 需设置其为 1
C/T 设置是 定时器 断开引脚输入 还是 计数器 从引脚输入
M1 M0 为模式选择,有不同的搭配
0 0 时 为13位 模式 (由 两个8位 计数器构成的 16位 计数器) 一计数器低5位 | 二计数器全8位 当低五位计数器溢出时它会向高八位计数器提供一个进位信号这个信号会使高八位计数器的值加1。此时低五位计数器会自动复位为其最小值通常为0 “低 5 位”通常是指一个二进制数的最右边的 5 个比特位 从右向左数
举例:16位二进制数 1010 1100 0101 1001 低五位 就为 10011 0 1 时 为16位 两个8位全用
1 0 时 为8位自动重载 第一个计数器溢出之后先转移当前值到 第二个计数器中,再复位为0 每次溢出时第二个计数器的值就会增加或减少取决于计数方向) 1 1 时 停止计数(暂停) 这里要注意数据手册上标注 当M1 M0 都为 1 时 定时器 0 的工作方式 第一个计数器可以设置成 8位定时器/计数器 受 定时器 0 控制 但是 第二个计数器 只能是 8位定时器 受 定时器 1 控制 TCON寄存器
以下图片来源于stc89c52官方数据手册: 定时器1
TF1 溢出标志位 (溢出时其为 1 ,会向CPU 请求中断 ,CPU响应后 0) 可手动设置
TR1 运行控制位 (控制开/关 ) 这里要注意TMOD中 GATE 的设置 定时器0 TF0 溢出标志位 (溢出时其为 1 ,会向CPU 请求中断 ,CPU响应后 0) 可手动设置 TR0 运行控制位 (控制开/关 ) 这里要注意TMOD中 GATE 的设置 IE1 / IE0 分别为 外部中断1 / 外部中断0 请求标志位
有请求时为1 处理后 由硬件自动清0(默认为0) IT1 / IT0 分别为外部中断1 / 外部中断 0 触发方式控制位 为0 是低电平触发
程序设计时:在中断服务例程ISR的开始部分直接控制IO拉高(低电平触发时)
假设设置为 低电平 触发
低电平时 IE0或IE1 会被置位即设置为1 表示有一个中断请求待处理。 中断请求来时以下步骤会发生 中断请求使IE0或IE1置位设置为1。CPU响应中断请求暂停当前的任务并跳转到中断服务例程ISR。在ISR中你处理中断请求完成相应的任务。在ISR结束之前你需要手动或自动 清零IE0或IE1以表示中断请求已经被处理完毕。 定时器 程序设计
例子:产生1kHz方波信号 时钟频率12MHz
分析: 信号周期T1/f T1/1000 1ms 高低电平设计为0.5ms(500μs) 定时初始值计算公式:2^16-定时值2^16-50065036
第一计数器 A 存储 初值 高八位,第二计数器 B 存储 初值 低八位 在计算机科学中一个字节由8位二进制数字组成。这8位数字可以分为高四位和低四位也可以称为高四位和低四位。 高八位指的是这个字节中最左边的8位也就是最高位的那一部分。低八位指的是这个字节中最右边的8位也就是最低位的那一部分。 65036(10进制)转换成16进制为 0xFE0C A存储FE B存储0C
因 65036 数过大,计算比较费劲 所以要适当 缩小
65036/256取商得到 254 计数器值常需除以256因计算机处理数据以字节为单位每字节8位可表256个值0-255。此操作适用于字节操作、防止溢出、图像处理中表示颜色深度、遵循数据格式及简化数学计算。 在计算机科学和电子工程中计数器的值经常需要 除以256这通常是因为以下几个原因 1. 字节操作 计算机中的数据通常以字节byte为单位处理而一个字节等于8位bit。由于256等于2的8次方2^8它刚好是一个字节可以表示的最大整数值从0到255。因此当处理字节或进行位操作时256是一个关键的参考点。 2. 溢出和模运算 计数器在增加过程中可能会超过其最大表示范围导致溢出。如果一个计数器是用一个字节表示的那么当它的值超过255时就会从0开始循环。这种现象可以用模运算即取余数来描述而模数通常是256。 3. 颜色深度 在图形和图像处理中每个像素的颜色可能由若干个字节表示比如RGB色彩模型中每个颜色分量红、绿、蓝通常用一个字节表示因此有256种可能的强度级别。 4. 协议和数据格式 某些通信协议或数据格式可能规定了特定的字段长度或计数范围这时候使用256作为基数可以帮助确保兼容性和标准化。 5. 数学和算法 在一些数学算法和数据结构中256因其与二进制系统的紧密关系常常被用作基数或除数以简化计算和逻辑操作。 总的来说除以256的操作反映了计算机系统中对字节边界和模运算的常见需求。 65036%256取余数 12 在计算机科学和数学中取余数模运算是一种非常常见的操作。当我们对一个数进行除法运算时余数是除不尽的部分。取余数的操作可以帮助我们解决以下几类问题 溢出处理在某些系统中例如基于字节的操作我们需要确保数值不会超过某个范围如0到255。通过取余数我们可以使数值“循环”回这个范围内避免溢出。 周期性事件如果我们想要跟踪每隔一定数量的事件发生的情况比如每256个事件取余数可以帮助我们确定是否到达了这个周期的某个特定点。 密码学在密码学中模运算是基础操作之一用于创建和解密密码系统。 数据校验和压缩在数据传输和存储中模运算可以用于生成和验证校验和以检测错误。在某些压缩算法中它也被用来减少数据的大小。 数学算法许多数学算法和公式中会用到模运算因为它可以简化计算特别是在处理大数时。 对于65036除以256的情况取余数的操作可以告诉我们65036在256的倍数之间的“剩余”部分是多少。 定时器 程序代码
设置工作模式 :第一计数器 A 存储 初值 高八位,第二计数器 B 存储 初值 低八位
TMOD0X01;
//0x01 是一个十六进制数它代表的二进制数是 0000 0001
A65036/256;//存储高八位
B65036%256;//存储低八位
EA1;//打开总中断
ET01;//允许定时器0中断
TR01;//打开定时器0
定时器 中断函数代码 void T0(void) interrupt 1 using 1 { A65036/256;//存储高八位 复位 B65036%256;//存储低八位 复位 这里放入中断后需要做的操作 } 代码解释: void T0(void)这是一个函数声明表明函数 T0 不接受任何参数并且不返回任何值。interrupt 1这是关键字和参数用于指定这个函数是一个中断服务例程其中 1 表示中断号。不同的中断号对应不同的中断源.using 1这是另一个关键字和参数用于指定该中断服务例程使用的工作寄存器组。在一些微控制器中允许程序员在中断服务例程中使用不同的工作寄存器组以避免与主程序中的寄存器冲突。这里的 1 表示使用第1个工作寄存器组。 中断号解释: interrupt 外部中断0 (INT0) 中断号0定时器/计数器0 (T0) 中断号1外部中断1 (INT1) 中断号2定时器/计数器1 (T1) 中断号3串行口中断 (串行I/O) 中断号4 寄存器组解释: using 参考链接https://blog.csdn.net/cssdl/article/details/41674095?sharetypeblogdetailsharerId41674095sharereferPCsharesourceqq_43422073sharefromfrom_link R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。 using 0时 设置 RS10RS0 0用第0组寄存器R0--R7的在数据存储区里的实际地址是00H-07H。R000H....R707H using 1时 设置 RS10RS0 1用第1组寄存器R0--R7的在数据存储区里的实际地址是00H-07H。R008H....R70FH using 2时 设置 RS11RS0 0用第2组寄存器R0--R7的在数据存储区里的实际地址是08H-0FH。R010H....R717H using 3时 设置 RS11RS0 1用第3组寄存器R0--R7的在数据存储区里的实际地址是00H-07H。R018H....R71FH 计数器为什么要复位 : 在单片机编程中特别是涉及到定时器/计数器的中断服务例程时经常会看到这样的情况在中断服务例程的开始部分会将一些寄存器的值重新赋值给计数器。 1. 防止溢出 定时器/计数器在达到最大值后会溢出并从零开始计数。如果不重新赋值计数器可能会继续从溢出点开始计数导致不正确的结果。通过在中断服务例程中重新赋值可以确保计数器从预期的值开始计数。 2. 实现精确的定时 在一些应用中需要实现非常精确的定时。通过在中断服务例程中重新赋值计数器可以调整定时器的计数值从而实现更精确的定时。 3. 初始化计数器 在中断服务例程中可能需要对计数器进行初始化以便从一个已知的状态开始。这在处理复杂的定时任务或多任务环境中尤为常见。 4. 实现周期性任务 如果中断服务例程需要周期性地执行某些任务可以通过重新赋值计数器来实现这一点。例如如果中断服务例程每1毫秒执行一次可以在中断服务例程的开始部分将计数器设置为一个适当的值以确保下次中断发生在1毫秒后。 5. 处理中断嵌套 在多中断环境下可能会出现中断嵌套的情况。在这种情况下需要确保每次中断服务例程执行时计数器的值是正确的。通过在中断服务例程中重新赋值计数器可以确保这一点。 中断相关资料 EX0EX01允许外部中断0中断EX00禁止中断 ET0ET01允许T0中断ET00禁止中断 EX1EX11允许外部中断1中断EX10禁止中断 ET1ET11允许T1中断ET10禁止中断 ESES1允许串行口中断ES0禁止中断
EAEA1CPU开放中断EA0CPU禁止所有的中断请求
中断相关 参考链接https://blog.csdn.net/weixin_43398418/article/details/121916218?sharetypeblogdetailsharerId121916218sharereferPCsharesourceqq_43422073sharefromfrom_link TMOD0X01; //0x01 是一个十六进制数它代表的二进制数是 0000 0001 这里操作的是 定时器0 按位带入以下图片中 可以知道定时器0 的 M10 M01
M10 M01 时 为16位 两个8位全用 计数器程序代码
例子: 50kHz方波信号 时钟频率12MHz
TMOD0X20;
//0X20 是二进制 0010000 控制的是定时器1
//结合上图M11 M00为8位自动重载 第一个计数器A1溢出之后先转移当前值到 第二个计数器B1中,再复位为0
A1246;//设置初始值 溢出相关
B1246;//设置初始值
//246-256 需要10μs
EA1;//打开总中断
ET11;//打开定时器1中断
TR11;//启动定时器1
void T1(void) interrupt 3 using 1
{
//因为是8位重载所以不用初始化计数器
//这里放入需要做的操作}
注意:以上代码省略了main()主函数