51单片机定时器量程的硬件扩展方式
来源:互联网 发布:pecs effect java 编辑:程序博客网 时间:2024/04/27 14:42
51单片机工作模式2自动装载定时值,按教科书的描述定时能力显得相对精准,但是此时的为8位定时器:当晶振为12MHz时,只能定时0.256ms。
升个级,精准性不要了,使定时器工作在模式1,16位定时器:当晶振为12MHz时已经能定时到65.56ms,略微牛逼不少。如果还要定时更长的数,可能会用软件方式
来扩展计数范围。软件方式扩展的大概思路是:在定时器中断服务程序中对定时器中断请求进行计数,当中断请求的次数达到要求的值时才进行相应的处理。例如,某事件的处理周期为1s,但由于受到最大定时时间的限制,无法一次完成定时,此时可以将定时器的定时时间设为以10ms为一个单位,启动定时器后的每一次定时器溢出中断产生10ms的定时,进入中断服务程序后,对定时器的中断次数进行统计,每100次定时器溢出中断进行一次事件的处理。
这篇文章的标题是硬件扩展,所以软件扩展的具体实现这里就省略了。以下主要围绕硬件方式展开。
硬件方式扩展的思路是:
1)T0设置为16位定时器方式,当T0溢出时,执行T0的中断服务程序。在T0的中断服务程序中将P1.0取反。这样在P1.0将输出一个方波,其周期为T0定时时间的2倍。设T0的定时时间为TIME,则由P1.0输出的方波的周期为2×TIME。
2)T1设置为16位计数器方式,将P1.0输出的方波接到T1的定时器外部输入端T1(P3.5),作为定时/计数器1的外部计数脉冲,其每个周期的下降沿使T1加1。设计数器T1的计数脉冲数为COUNT,则当T1溢出时,总定时时间T为:T = 2×TIME×COUNT。
下面罗列代码,定时器T0 T1全都工作在模式2
#include <REG52.H> #include <INTRINS.H>sbit P1_0 = P1^0;sbit P1_1 = P1^1;#define MakeByte(target, Hi,Lo) \do{ \target |= (((Hi)<<4)|(Lo)); \}while(0); \#define SetTH(n,val) \do{ \TH##n = val; \}while(0); \#define SetTL(n,val) \do{ \TL##n = val; \}while(0); \#define EnableET(n) \do{ \ET##n = 0x01; \IE |= 0x80; \}while(0); \#define StartTn(n) \do{ \TR##n = 0x01; \}while(0);\unsigned char FetchData=0;unsigned int OnePeriod=0;int main(){//T0定时器 方式2 自动装载 //T1计数器 方式2 自动装载 MakeByte(TMOD, 0x06,0x02);//T0 0.2ms中断一次,P1.0翻转周期0.4msSetTH(0,0x38);SetTL(0,0x38); EnableET(0);EnableET(1);//计满50次产生中断//50*0.4ms=20msSetTH(1,0xCE);SetTL(1,0xCE);StartTn(0);StartTn(1);while(1){while(!FetchData);FetchData = 0;}}void IsrT0() interrupt 1{P1_0 = ~P1_0;}void IsrT1() interrupt 3{ //20MS elapsedOnePeriod++;//这个用于软件定时 //每经过20Ms,OnePeriod加一, //然后在main函数里经行统计P1_1 = ~P1_1;}
下面上图:P1.0的输出接P3.5
最后上仿真结果:
第一张示波器的时基为2MS,第二张示波器的时基为0.2MS
- 51单片机定时器量程的硬件扩展方式
- 51单片机基于定时器0的硬件延时代码
- 51单片机---定时器工作方式
- 51单片机工作于方式0的定时器模式
- 51单片机STC89C52 定时器(查询方式)
- 51单片机STC89C52 定时器(中断方式)
- 51单片机的硬件结构
- 51单片机的定时器/计数器
- 51单片机定时器的使用
- 51单片机的定时器扯淡
- STM32单片机的IIC硬件编程---查询等待方式
- STM32单片机的IIC硬件编程---查询等待方式
- STM32单片机的IIC硬件编程---查询等待方式
- 51单片机,计时器0,11.0592M晶振,工作方式1,几个常用的定时器初始值
- 单片机的硬件结构
- 51单片机定时器初值的计算
- 关于51单片机定时器的灵活使用
- 51单片机定时器初值的计算
- 《Accelerate C++》读书笔记(二)
- jstl 标签使用
- matlab矩阵内存预分配
- servlet中通过request.getRequestDispatcher跳转到jsp页面乱码问题
- nginx源码分析--master和worker进程模型
- 51单片机定时器量程的硬件扩展方式
- UVA - 10591 Happy Number
- Matlab与Word无缝连接
- R中统计假设检验总结
- 程序员四大禁忌
- android学习十(android的文件存储)
- C结构体之位域(位段)
- Cf Round #104 (Div. 1) E Lucky Queries 线段树
- 文件上传Uploadfy控件使用详解,及其使用过程中遇到的问题