定时/计数器实现功能:

(1)定时功能:

定时/计数器说明(最高单次计时时间是71毫秒=65535*1.085us,1.085us是机器周期):

使用51定时/计数器步骤:

定时/计算器控制寄存器:

设置定时寄存器的工作模式:

将想计时的时间(这个时间意思是想让定时/计数器经过多长时间溢出,溢出后就说明达到了你设定的时间)转化为微秒级(50毫秒=50000微妙)再用转化后的数除以1.085(机器周期时间)得到的数就是要加的次数 ,定时/计数器总共加65535次就会溢出,提前有一个初始值就可减少达到溢出的的次数。

例子:想50毫秒后定时/计数器溢出,50毫秒=50000微妙
(第一种方式)50000除以1.085得到46082(次),然后就可以将高八位TH0=46082/256(意思是有多少个256放入高八位中),低八位TL0=46082%256(意思是将剩余的256放到低八位中)。
(第二种方式)也可以用65535减46082得到初值,再将十进制初值转化为十六进制,将前两位给TH0后两位给TL0

计时器代码示例

#include<reg52.h>
#include<intrins.h>#define uint unsigned int
#define uchar unsigned charsbit beep=P2^3;
sbit DUAN =P2^6;//数码管段选
sbit WEI=P2^7; //数码管位选
uchar temp;
//共阴极数码管段选表0——9,code表示数组中的数据在程序执行过程中不能被修改
//加code存放的是ROM区不加code存放的是RAM区
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(void)   //误差 -0.000000000001us
{unsigned char a,b;for(b=15;b>0;b--)for(a=152;a>0;a--);
} void display(uint i)
{   uint bai,shi,ge;bai=i/100;shi=i%100/10;ge=i%10;P0=0xff;//清除断码WEI=1;//打开位选锁存器P0 = 0xfe;//1111 1110 给第一个数码管接地,让它工作WEI =0;//关闭位选锁存器,进行段选(显示数字)DUAN=1;//打开段选锁存器P0 =table[bai];DUAN =0;//锁存段选锁存器delay();P0=0xff;//清除断码WEI=1;P0 = 0xfd;WEI =0;DUAN=1;P0 = table[shi];DUAN =0;delay();P0=0xff;//清除断码WEI=1;P0 = 0xfb;WEI =0;DUAN=1;P0 = table[ge];DUAN =0; delay();
}
//定时器0初始化
void timeInit()
{TR0=1;//启动定时器0TMOD=0x01;//定时器工作模式一,16位定时计时模式//TH0=0x4b;//TL0=0xfd;//定时50毫秒;TH0=(65535-46082)/256;TL0=(65535-46082)%256;//定时50毫秒;
}void main()
{uchar msec,sec;//声明毫秒和秒储存变量timeInit();while(1){if(TF0==1){TF0=0;//软件清0溢出标志位TH0=0x4b;TL0=0xfd;//重放初值msec++;//50毫秒到if(msec==20){msec=0;sec++;//一秒时间到if(sec>100)sec=0;//计时到100秒从1开始               }       }display(sec);  //数码管显示时间}
}

(2)计数功能:

#include<reg52.h>
#include<intrins.h>#define uint unsigned int
#define uchar unsigned charsbit DUAN =P2^6;//数码管段选
sbit WEI=P2^7; //数码管位选
sbit LED1=P1^0;
uchar temp;
//共阴极数码管段选表0——9,code表示数组中的数据在程序执行过程中不能被修改
//加code存放的是ROM区不加code存放的是RAM区
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(void)   //误差 -0.000000000001us
{unsigned char a,b;for(b=15;b>0;b--)for(a=152;a>0;a--);
} void display(uint i)
{   uint bai,shi,ge;bai=i/100;shi=i%100/10;ge=i%10;P0=0xff;//清除断码WEI=1;//打开位选锁存器P0 = 0xfe;//1111 1110 给第一个数码管接地,让它工作WEI =0;//关闭位选锁存器,进行段选(显示数字)DUAN=1;//打开段选锁存器P0 =table[bai];DUAN =0;//锁存段选锁存器delay();P0=0xff;//清除断码WEI=1;P0 = 0xfd;WEI =0;DUAN=1;P0 = table[shi];DUAN =0;delay();P0=0xff;//清除断码WEI=1;P0 = 0xfb;WEI =0;DUAN=1;P0 = table[ge];DUAN =0; delay();
}
//计数器0初始化
void jishuInit()
{TR0=1;//启动计数器0TMOD|=0x05;//定时器工作模式一,16位计数模式TH0=0;TL0=0;
}
//定时器1初始化
void timeInit()
{TR1= 1;//启动定时器1TMOD|=0x10;//定时器工作模式一,16位定时模式TH1=0x4b;TL1=0xfd;
}void main()
{uchar msec;//声明毫秒和秒储存变量jishuInit();//计数器0初始化timeInit();//定时器1初始化while(1){if(TF1==1){TF1=0;//软件清0溢出标志位TH1=0x4b;TL1=0xfd;//重放初值msec++;//50毫秒到if(msec==10)//定时500毫秒到{msec=0;LED1=~LED1;//产生方波}}display(TL0);   //数码管显示时间}
}

定时器中断

中断情况下TF由硬件清0,若无中断则有软件清0。

代码示例:

#include<reg52.h>
#include<intrins.h>#define uint unsigned int
#define uchar unsigned charsbit beep=P2^3;
sbit DUAN =P2^6;//数码管段选
sbit WEI=P2^7; //数码管位选uchar temp;
uchar msec,sec;//声明毫秒和秒储存变量
//共阴极数码管段选表0——9,code表示数组中的数据在程序执行过程中不能被修改
//加code存放的是ROM区不加code存放的是RAM区
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(void)   //误差 -0.000000000001us
{unsigned char a,b;for(b=15;b>0;b--)for(a=152;a>0;a--);
} void display(uint i)
{   uint bai,shi,ge;bai=i/100;shi=i%100/10;ge=i%10;P0=0xff;//清除断码WEI=1;//打开位选锁存器P0 = 0xfe;//1111 1110 给第一个数码管接地,让它工作WEI =0;//关闭位选锁存器,进行段选(显示数字)DUAN=1;//打开段选锁存器P0 =table[bai];DUAN =0;//锁存段选锁存器delay();P0=0xff;//清除断码WEI=1;P0 = 0xfd;WEI =0;DUAN=1;P0 = table[shi];DUAN =0;delay();P0=0xff;//清除断码WEI=1;P0 = 0xfb;WEI =0;DUAN=1;P0 = table[ge];DUAN =0; delay();
}
//定时器0初始化
void timeInit()
{EA=1;//打开总中断ET0=1;//打开中断允许位TR0=1;//启动定时器0TMOD=0x01;//定时器工作模式一,16位定时计时模式//TH0=0x4b;//TL0=0xfd;//定时50毫秒;TH0=(65535-46082)/256;TL0=(65535-46082)%256;//定时50毫秒;
}void time0() interrupt 1//中断函数
{TH0=0x4b;TL0=0xfd;//重放初值msec++;//50毫秒到if(msec==20)//1s时间到{msec=0;sec++;//一秒时间到if(sec>100)sec=0;//计时到100秒从1开始              }           }void main()
{timeInit();while(1){display(sec);  //数码管显示时间}
}

定时器中断进行数码管动态扫描:

#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned charsbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管位选
sbit key_s2 = P3^0;//独立按键S2
sbit key_s3 = P3^1;//独立按键S3
uchar num;//数码管显示的值//共阴数码管段选表
uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//数码管位选码
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};
//毫秒级延时函数定义
void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--);
} void display(uchar i)
{static uchar wei;      P0 = 0XFF;//清除断码WE = 1;//打开位选寄存器P0 = SMGwei[wei];WE = 0;//锁存位选寄存器switch(wei){case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break;  case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;     }wei++;if(wei == 3)wei = 0;
}
//定时器0初始化
void timer0Init()
{EA = 1;   //打开总中断ET0 = 1;//打开定时器0中断TR0 = 1;  //启动定时器0TMOD = 0X01; //定时器工作模式,16位定时模式TH0 = 0xED;TL0 = 0xFF; //定时5ms
}void main()//main函数自身会循环
{   timer0Init();//?¨ê±?÷03?ê??ˉwhile(1){if(key_s2 == 0)//判断S2是否被按下{delay(20);//按键消抖if(key_s2 == 0){if(num != 120)num++;while(!key_s2);//松手检测}   }if(key_s3 == 0)//判断S3是否被按下{delay(20);//按键消抖if(key_s3 == 0){if(num > 0)num--;while(!key_s3);//松手检测}  }}
} //定时器中断函数
void timer0() interrupt 1
{TH0 = 0xED;TL0 = 0xFF; //定时5msdisplay(num); //数码管显示函数
}

定时/计数器(定时和计数的功能)、定时器中断相关推荐

  1. 单片机定时报警C语言程序,51单片机 定时器 中断程序 (C语言)

    EA     是 中断总开关, 不管是定时器,串口还是外部中断,都需要打开 EA 才能触发中断; ET0   是 定时器0 的专用中断开关, 也就是说: 打开了EA.而不打开ET0,定时器0是无法触发 ...

  2. 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

    上节我们讲了中断的外部中断,基本的了解了一下中断,这一节我们继续来学习中断系统的定时器中断基本原理,本节很重要无论是在比赛中还是在单片机.嵌入式等的学习上都有着很重要的地位.如对本作者有兴趣可以去我主 ...

  3. 单片机-定时/计数器原理功能介绍

    在单片机应用系统中,我们会需要有定时控制的功能,如定时输出,定时检测,定时扫描等. 这就是单片机中定时/计数器的功能所在,我们在此详细介绍一下计时/计数器的原理功能. 一.定时/计数器的功能原理: 定 ...

  4. 【单片机】脉冲计数(定时/计数器实验)

    [单片机]脉冲计数(定时/计数器实验) 一.操作目的 二.操作内容 三.程序框图 四.程序接线图 五.程序清单 六.代码详解 一.操作目的 熟悉单片机内部定时/计数器功能,掌握初始化编程方法. 二.操 ...

  5. 定时/计数器应用——从P1.0输出周期为1s的方波,让发光二极管以1Hz闪烁

    利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1Hz闪烁,设晶振频率为12MHz. 2021-01-20,51单片机学习笔记 代码(精简注释): /**************** ...

  6. 【单片机】C51中的定时/计数器介绍

    C51定时器和计数器 开发板:普中51-单核-A2: 仿真软件:proteus: 开发环境:Keil4: 参考资料:开发板所附视频: 如有错误,感谢指正.如有侵权请联系博主. 定时器原理 与CPU时序 ...

  7. CC2530的定时/计数器原理与应用

    目录 1.定时计数器的基本原理 2.CC2530的定时/计数器 2.1.定时器1的工作原理 2.2.定时器1的三种工作模式 3.CC2530的定时/计数器中断系统 3.1.定时器1的最大计数值和计算与 ...

  8. 51单片机汇编学习笔记9——定时计数器

    这一小节介绍一下51单片机的一个重要外设定时计数器. 顾名思义定时计数器主要是两种功能:定时.计数. 定时:就是当你开启定时器后到了设定的时间他会触发中断,然后去执行中断服务函数里面的程序. 计数:主 ...

  9. 单片机 -定时/计数器的初始化编程及应用

    定时/计数器的编程 1.根据要求选择方式,确定方式控制字,写入TMOD寄存器,配置好工作模式. 2.根据要求计算定时/计数器的计数值,在求得计数初值,写入初始化寄存器 . 3.根据需求,开放定时/计数 ...

  10. 51单片机定时/计数器

    定时计数器 什么是定时/计数器以及用处 51单片机有2个16位定时器/计数器:定时器0(T0为P3.4)和定时器1(T1为P3.5) 这里所说的16位是指定时/计数器内部分别有16位计数寄存器. 当工 ...

最新文章

  1. 【机器视觉案例】(10) AI视觉搭积木,手势移动虚拟物体,附python完整代码
  2. Date, TimeZone, MongoDB, java中date的时区问题
  3. 作者为何要写《简约之美》这本书?程序员们又能从中学到什么呢?
  4. CRM问题:导入、导出实体错误
  5. VC遍历窗体控件的实现
  6. ajax省市联动案例,AJAX案例四:省市联动(示例代码)
  7. php 上传文件漏洞,【文件上传】PHP文件上传漏洞
  8. 【Modern OpenGL】纹理 Textures
  9. [Angular 2] Nesting Elements in Angular 2 Components with ng-content (AKA Angular 2 Transclusion)
  10. 多项logistic回归系数解释_因变量无序多分类资料的logistic回归
  11. 混合云是趋势?阿里云与私有云厂商 ZStack合作
  12. linux数据向量化指令,不充分SIMD向量化技术研究.PDF
  13. GitChat · 前端 | JavaScript 进阶之 Vue.js + Node.js 入门实战开发
  14. CentOS7中安装五笔输入法
  15. Origin下载安装教程(亲测有用)
  16. 来成都旅游,千万不要做的22件事!
  17. 腾讯云服务器安全组8080端口开放教程
  18. WSJ Merkel Top On Forbes' Most Powerful Women List For 4th Year
  19. win7系统配置时间服务器,与Internet时间服务器同步 设Win7精确时间
  20. 重温FPGA开发32

热门文章

  1. 学习笔记(30):Python网络编程并发编程-Event事件
  2. html 响应式 同一行,一行CSS实现各种响应式元素 – Fluidity
  3. opengl2 vtk 编译_编译和使用VTK时值得注意的点(待续)
  4. nvidia显卡对比分析
  5. 计算机无法正常更新,无法完成更新正在撤销更改请不要关闭你的计算机如何修复...
  6. python的闭包要素_Python的闭包
  7. 2019-5-30-websocket下readyState常量
  8. FL-EM7688 Smart评估板openwrt开发环境搭建(linux固件部分)
  9. vue中的适配:px2rem
  10. 2018-07-10 为Chrome和火狐浏览器编写扩展