




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4讲定时器/计数器AtmelAT89C51AtmelAT89C52定时器/计数器的主要特性C51系列有2个定时/计数器(T0、T1)C52系列有3个定时/计数器(T0、T1、T2)通过编程设置,每个定时器/计数器可以根据系统时钟实现定时,也可以对外部信号计数(T0/P3.4、T1/P3.5)每个定时器/计数器都有多种工作方式每个定时器/计数器都会在预设定时计数时间到时产生溢出,可以通过查询或中断方式处理使用定时/计数器的步骤方式选择——TMOD初值设置——TH0、TL0(TH1、TL1)中断允许——EA、ET0(ET1)启动操作——TR0(TR1)定时/计数器的方式寄存器TMOD 可以一次定义两个定时/计数器的工作方式GATEC/TM1M0GATEC/TM1M0D7D6D5D4D3D2D1D0定时器1定时器0M1M0工作方式方式说明00013位定时/计数器01116位定时/计数器1028位自动重置定时/计数器113两个8位定时/计数器(仅T0有此方式)定时/计数器的方式寄存器TMODC/T=1计数方式C/T=0定时方式GATE——控制定时/计数器的启动是否受外部中断请求信号的影响GATE=1——外部中断请求高电平启动计数GATE=0——定时/计数器启动与外部中断请求无关一般情况下GATE=0定时/计数器的控制寄存器TCON用于控制定时/计数器的启动与溢出TF1——溢出标志TR1——启动位(=1:启动=0:停止)TF0——溢出标志TR0——启动位(=1:启动=0:停止)TF1TR1TF0TR0IE1IT1IE0IT0D7D6D5D4D3D2D1D0外部中断控制方式2——自动重置8位计数M1M0=10TL0——计数(最大定时256μs)TH0——保存初值,便于自动重置例:TH0=0x06TL0=0x06TL0计数到256发生溢出,计数值为250然后重新置入0x06,继续计数在P1.0端口输出周期为500μs的方波//查询方式(晶振频率12MHz)#include<reg52.h>sbitP1_0=P1^0;voidmain(){ TMOD=0x02; //定时器T0设置为方式2 TH0=0x06; //256-6=250,定时250μs TL0=0x06; TR0=1; //启动定时器T0 while(1) { if(TF0==1) //如果检测到溢出,意味着定时时间到
{ TF0=0; //取消溢出标志
P1_0=!P1_0; //输出高/低电平转换
} }}250μs250μs说明晶振频率12MHz,作为定时/计数器的基准信号定时/计数器进行12分频,定时工作频率1MHz,定时工作周期1usTMOD=0x02(00000010B)T0工作于方式2(8位自动重置定时)定时器方式GATEC/TM1M0GATEC/TM1M0D7D6D5D4D3D2D1D0定时器1定时器0说明TL0=0x06TH0=0x06计数从6开始,每个工作周期(1us)加1,经过250us之后产生溢出,TF0==1方式2为自动重置,将TH0的值再次装入TL0,继续计数每次检测到TF0==1,就使P1^0的状态改变一次,从而产生了周期为500us的对称方波思考设单片机晶振频率为12MHz,对于前例,如果要求T0输出的方波周期为200μs,计数初值应该怎样设置?机器周期=时钟周期*12
=12/晶振频率
=1μs计数初值=256-200/2
=156(0x9c)TH0=0x9c;TL0=0x9c;在P1.0端口输出周期为500μs的方波//中断方式#include<reg52.h>sbitP1_0=P1^0;voidmain(){ TMOD=0x02; //T0设置为方式2 TH0=0x06; TL0=0x06; EA=1; //中断允许总控
ET0=1; //允许定时器T0中断
TR0=1; //启动定时器
while(1); //等待中断的发生}voidtime0_int(void)interrupt1 //定时器T0对应interrupt1{ P1_0=!P1_0;}LED0以200ms间隔闪烁(方法一)#include<reg52.h>sbitLED0=P0^0; //LED0接在P0^0端口chari;voidmain(){ TMOD=0x01; //方式1,16位定时/计数
TH0=0xd8; TL0=0xf0; //0xd8f0=55536计数初值,定时10ms EA=1; ET0=1; //定时器T0允许中断
i=0; TR0=1; //启动定时器T0 while(1);}voidtime0_int(void)interrupt1 //定时器T0对应的就是interrupt1{ TH0=0xd8; TL0=0xf0; //恢复计数初值,继续延时
i++; //每计数一次,延时10ms
if(i==20) //若满足200ms { LED0=!LED0; //LED0闪烁一次
i=0; //恢复初始状态
}}LED0以200ms间隔闪烁(方法二)#include<reg52.h>sbitLED0=P0^0;chari;voidmain(){ TMOD=0x01; //方式1,16位定时/计数
TH0=0x3c; TL0=0xb0; //0x3cb0=15536计数初值,定时50ms EA=1; ET0=1; i=0; TR0=1; while(1);}voidtime0_int(void)interrupt1 //定时器T0对应的就是interrupt1{ TH0=0x3c; TL0=0xb0; //恢复计数初值,继续延时
i++; //每计数一次,延时50ms
if(i==4) //若满足200ms { LED0=!LED0; //LED0闪烁一次
i=0; //恢复初始状态
}}思考方法一:定时10ms,i计数20次方法二:定时50ms,i计数4次这两种做法,哪种更好些?方法二更好些,因为充分利用了定时器的最大定时能力,减少了对CPU时间的占用练习利用定时器T1产生定时时钟,由P0口控制8个LED依次逐个闪动,频率为10次/秒,循环重复程序代码(主程序部分)#include<reg52.h>#include<intrins.h>unsignedcharLED,i;voidmain(){ i=0; LED=0xfe; //LED0首先发光
P0=LED; TMOD=0x01; //定时器方式1(16位定时)
TH1=0x3c; //定时初值0x3cb0=15536 TL1=0xb0; EA=1; //中断总控允许
ET1=1; //定时器1中断允许
TR1=1; //启动定时器1 while(1); //等待中断发生}程序代码(中断服务程序部分)voidtime1_int(void)interrupt3//定时器1允许{ TH1=0x3c; //重置定时50ms的初值
TL1=0xb0; i++;
if(i==20) //定时时间到,闪动一次
{ LED=_cror_(LED,1); P0=LED; i=0; //恢复初始状态
}}练习利用定时器产生定时控制信号,在8个LED上稳定地显示“01234567”分析:要实现稳定地显示,根据以往经验,切换速度要求不大于2ms定时器完全可以代替以前使用的延时程序,这样就节省了CPU时间程序代码#include<reg52.h>unsignedcharcodetable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};unsignedchari;voidmain(){ i=0; TMOD=0x01; TH1=0xf8; TL1=0x30; //延时2ms,0xf830=63536 EA=1; ET1=1; //允许定时器1中断
TR1=1; //启动定时器1 while(1);}voidtime1_int(void)interrupt3 //定时器1产生interrupt3中断{ TH1=0xf8; TL1=0x30; P0=table[i]; //获取段位码
P2=i; //选择LED i++;
if(i==8)i=0; //轮流显示了全部8个LED之后,回归原位}练习利用定时器实现的定时间隔,在8个LED上稳定地显示电话号码“68752219”程序代码#include<reg52.h>unsignedcharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedcharcodeNumber[8]={6,8,7,5,2,2,1,9};unsignedchari,j;voidmain(){ i=0; TMOD=0x01; TH1=0xf8; TL1=0x30; EA=1; ET1=1; TR1=1; while(1);}voidtime1_int(void)interrupt3{ TH1=0xf8; TL1=0x30; j=Number[i]; P0=table[j]; P2=i; i++;
if(i==8)i=0;}练习在8个LED数码管的右端从0开始显示数字,利用定时器控制,以200ms的间隔逐次加1,到达255之后归0,循环往复分析:本题的任务最好使用两个定时器来完成T1的定时间隔为200ms,用来修正计数T0的定时间隔为2ms,用来刷新LED主程序#include<reg52.h>#defineucharunsignedcharucharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharmydata[3]={0,0,0};uchari,number,d0;voidmain(){ i=0; number=0; TMOD=0x01; TH1=0x3c; TL1=0xb0; EA=1; ET1=1; TR1=1; TH0=0xf8; TL0=0x30; ET0=1; TR0=1; d0=0; while(1);}定时器1的中断服务程序voidtime1_int(void)interrupt3{ TH1=0x3c; TL1=0xb0; i++;
if(i==40) //定时间隔5ms,乘以40倍
{ number++; mydata[2]=number/100; mydata[1]=number/10%10; mydata[0]=number%10; i=0; }}定时器0的中断服务程序voidtimer0_int(void)interrupt1{ TH0=0xf8; TL0=0xf0; P0=table[mydata[d0]]; //获取段位码
if(d0==2) P2=5; //百位数显示在LED5 else P2=(d0==1)?6:7; //十位数显示在LED6 d0=(d0+1)%3;}练习在8个LED数码管上按右对齐的方式从0开始显示数字,利用定时器控制,以200ms的间隔逐次加1,到达255之后归0,循环往复练习LED0的亮度分为0~9共10档可调,每按一次独立开关S17(连接到P34),LED0亮度增加一个档次,增加到10时则回到最低亮度数据定义与准备#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitLED0=P0^0; //要控制的LED灯sbitK1=P3^4; //控制亮度,每按一次增加一档亮度ucharscale=5; //占空比的低电平时间份额,总共10份uintn=0;定时器初始化voidtimer0_init(){ TMOD=0x02; //T0为方式2,自动重置8位计数
TH0=0x06; //晶振频率12MHz,定时250μs TL0=0x06; TR0=1; //启动定时器0 ET0=1; //开放定时器0中断
EA=1; //开放总控中断 }定时器中断timer0()interrupt1 //定时器T0中断服务程序{ //每10次中断,LED0发光保持scale次
staticuchar
tt; //保存当前时间在一秒中的比例位置
TF0=0; //清除溢出标志,迎接下次中断
tt++; //统计中断发生的次数
if(tt==10) //每发生10次中断,开始LED0发光
{
tt=0;
if(scale!=0) //加这句为了消除灭灯状态产生的鬼影
LED0=0; }
if(scale==tt) //按照当前占空比切换输出高电平
LED0=1; //LED0熄灭}主函数voidmain(void){ Timer0_init(); while(1) { if(!K1) //如果检测到K1按下
{
for(n=0;n<1000;n++); //等待K1稳定按下
while(!K1); //等待K1松开
for(n=0;n<1000;n++); //等待K1稳定松开
scale++; //亮度增加一档
if(scale==10)scale=0; //亮度增加到10则回归最暗状态
} }}Atmel89C52定时器/计数器2编程定时器2的工作方式:16位重装载方式16位捕获方式16位波特率发生器方式工作方式由T2CON寄存器决定TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2D7D6D5D4D3D2D1D0T2CON寄存器各位功能符号功能TF2定时器2溢出标志。溢出时,又由硬件置位,必须由软件清0。当RCLK或TCLK=1时,定时器2溢出,不对TF2置位EXF2外部标志。RCLK接收时钟允许。=1,用定时器2溢出脉冲作为串口接收时钟;=0,用定时器1的溢出脉冲作为接收时钟TCLK发送时钟允许。=1,用定时器2溢出脉冲作为串口发送时钟;=0,用定时器1的溢出脉冲作为发送时钟EXEN2外部允许标志。=1,若定时器2未用作串行口的波特率发生器,T2EX端出现负跳变时,激活定时器2捕获或重装载TR2启动/停止控制。=1,启动定时器2C/T2定时器/计数器方式控制。=0,定时器方式;=1,对外部事件计数方式(下降沿触发)CP/RL2捕获/重装载选择。=1,若EXEN2=1,且T2EN端出现负跳变时发生捕获操作;=0,若溢出或EXEN2=1,T2EN出现负跳变时自动重装载在数码管中显示多个浮点数要求:第0位显示温度传感器编号第2~5位显示温度值(2位小数,带小数点)第6~7位显示°C原始温度数据由float类型数组提供每个温度数据显示2秒,依次轮换数据定义与准备#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintfloattempfloat[8]={37.65,33.28,36.10,32.39,33.57,36.40,34.66,35.17};ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x63,0x00}; //0123456789ABCDEF度空ucharLED[8]={0,17,0,0,0,0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 孩子叛逆期家庭教育对策研究
- 学校思政教育中的文化自信培育
- 学校资源合理配置研究
- 2025年中国微乳化切削液数据监测报告
- 2025年中国彩色小菊种子市场调查研究报告
- 2025年中国开关柜配套用变压器市场调查研究报告
- 2025年中国工业级纯碱市场调查研究报告
- 如何进行高质量的HIIT训练
- 创新服务模式提升客户体验
- 2025年中国姜根市场调查研究报告
- 2025年度粤医云、国培卫健全科医学临床医学2月题目及答案
- 校园消费进行时青春权益不掉队-3·15消费者权益日教育宣传主题班会课件
- 英语-安徽省滁州市2025年(届)高三下学期第一次教学质量监测(滁州一模)试题和答案
- 人教版六年级下学期数学第四单元《比例》典型题型专项练习(含答案)
- 污水处理设施运维服务投标方案(技术标)
- 发票红冲申请书
- 大数据技术在医疗健康领域的应用方案设计
- 2025年全国教育工作会议学习心得
- 《酒店数字化运营概论》课件-项目四 任务1 酒店定价与收益管理
- 2025届南通市高三第二次模拟考试数学试卷含解析
- 画谜课件教学课件
评论
0/150
提交评论