51单片机实战指南-定时器与数码管显示_第1页
51单片机实战指南-定时器与数码管显示_第2页
51单片机实战指南-定时器与数码管显示_第3页
51单片机实战指南-定时器与数码管显示_第4页
51单片机实战指南-定时器与数码管显示_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

定时器与数码管显示51单片机实战指南本章内容:51单片机的定时器/计数器基本知识1定时器/计数器工作方式2定时器/计数器的应用3数码管的显示原理及实现46.151单片机的定时器/计数器基本知识定时器是对单片机的内部时钟计数。计数器则是对外部输入事件进行计数。本质上都是计数,只是计数的对象不同。51基本型有2个16位加1计数器,T0和T1。6.1.1定时/计数器结构图6-1定时/计数器基本结构作为定时器使用时,是对单片机内部机器周期计数,因其内部频率为晶振频率的1/12,如果晶振频率为12MHz,则定时器每接收一个输入脉冲的时间为1μs。当用作对外部事件进行计数时,接相应的外部输入引脚T0(P3.4)或T1(P3.5),当检测到输入引脚上的电平由高跳变到低时,计数器加1。6.1.1定时/计数器结构1.工作方式寄存器TMOD(89H)工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。6.1.2特殊功能寄存器2.控制寄存器TCONTCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。6.1.2特殊功能寄存器6.2.2方式16.2定时器/计数器工作方式(方式1和2)6.2.3方式26.2定时器/计数器工作方式(方式1和2)6.3.1定时器/计数器的初始化1.初始化步骤在使用定时器的时候,应对它进行初始化编程。通常需要完成以下几个步骤:1)设置特殊功能寄存器TMOD,配置好工作方式。2)设置计数寄存器TH和TL的初值。3)定时/计数器在中断方式工作时,需编程IE寄存器,开CPU中断和源中断。4)设置TCON,通过TR0或TR1置1来让定时器启动计数。另外,如定时/计数器工作在查询方式时,则在程序执行过程中还需判断TCON寄存器的TF0位,监测定时器的溢出情况。6.3定时器/计数器的应用6.3.1定时器/计数器的初始化2.计数初值的计算如果设定定时器计数初值为X,机器周期为Tc,定时器定时时间为Td,则Td=(2n-X)Tc,那么定时器的初值为X=2n-Td/Tc得到X初值后,则可根据定时器的工作方式来装载TH与TL。TH=(65536-N)/256;TL=(65536-N)%256;或TH=-N/256;TL=-N%256;TH=TL=256-N;或TH=TL=-N;6.3定时器/计数器的应用【例6-1】如图6-6所示,P0.1口输出频率为0.5Hz的方波,为了便于观察,可以通过P0.1口接的LED灯的亮灭来观察现象,即LED亮灭各1s。6.3.2应用举例1.查询方式#include<reg52.h>/******端口定义*****************/sbitWave=P0^1;//位定义,Wave即代表P0.1sbitLSC=P1^7;//特殊功能寄存器的位定义,sbitLSB=P1^6;//3-8译码器的输入端,sbitLSA=P1^5;//控制三极管Q2~Q6的导通voidmain() //主函数{ unsignedcharcnt=0;//记录T0溢出次数 LSA=0; LSB=0; LSC=0;6.3.2应用举例 Wave=0; //初始化P1.0=0 TMOD=0x01; //设置定时器T0工作方式1 TL0=-18432/256; //计数器初值 TH0=-18432%256; TR0=1; while(1) //主循环 { if(TF0==1)//判断T0是否溢出 { TF0=0;//清零中断标志 TL0=-18432/256; //计数器初值 TH0=-18432%256;

6.3.2应用举例 cnt++; //计数值自加1 if(cnt>=50)//1s到? { cnt=0;//计数值清零 Wave=~Wave;//Wave取反 } } }}6.3.2应用举例2.中断方式#include<reg52.h>//端口定义sbitWave=P0^1; sbitLSC=P1^7; sbitLSB=P1^6; sbitLSA=P1^5; unsignedcharcnt=0; 6.3.2应用举例voidmain() { LSA=0; LSB=0; LSC=0; Wave=0; TMOD=0x01; TL0=-18432/256; TH0=-18432%256; TR0=1; ET0=1; EA=1;//开中断 while(1);//模拟主程序其它工作} 6.3.2应用举例/*T0中断服务程序*/voidTimer0(void)interrupt1 //定时器T0中断响应{ TL0=-18432/256; TH0=-18432%256;

cnt++; if(cnt>=50) { cnt=0; Wave=~Wave; }} 6.3.2应用举例【例6-2】定时器T0外接按键KEY2用于模拟计数输入,工作于计数模式,当5个计数值满,P0.1口发光二极管取反。#include<reg52.h>sbit LED=P0^1; //位定义,LED即代表P0.1sbit LSA=P1^5; sbit LSB=P1^6; sbit LSC=P1^7; 6.3.2应用举例voidmain() { LSA=0; LSB=0; LSC=0; TMOD=0x06; //定时器T0工作方式2计数 TL0=-5; //计数器初值 TH0=-5; TR0=1; //启动定时器 ET0=1; //开中断 EA=1; while(1); //主循环} 6.3.2应用举例/*T0中断服务程序*/voidTimer0(void)interrupt1 //T0中断响应{ LED=~LED; //反向} 6.3.2应用举例脉冲宽度调制PWM(PulseWidthModulation)是利用微处理器的数字输出来对模拟电路进行控制的一种技术手段。就是调节一个周期中高电平所占的百分比,也就是调节占空比。比如可以通过调节占空比来控制直流电机的通电时间,以达到调速的目的,或通过调节占空比控制加热时间,进行温度控制等。 6.3.3用定时器实现PWM控制【例6-3】利用定时器T0产生PWM来控制P0口LED灯的亮度,原理图见图6-6所示。#include<reg52.h>sbit LSA=P1^5; sbit LSB=P1^6; sbit LSC=P1^7;unsignedcharHighRH=0; //高电平重载值的高字节unsignedcharHighRL=0;//高电平重载值的低字节unsignedcharLowRH=0; //低电平重载值的高字节unsignedcharLowRL=0; //低电平重载值的低字节voidConfigPWM(unsignedintfr,unsignedchardc);voidClosePWM();

6.3.3用定时器实现PWM控制voidmain(){ unsignedinti; EA=1;//开总中断 LSA=0; LSB=0; LSC=0; while(1) { ConfigPWM(100,10);//频率100Hz,占空比10% for(i=0;i<40000;i++); ClosePWM(); ConfigPWM(100,40);//频率100Hz,占空比40%

6.3.3用定时器实现PWM控制

for(i=0;i<40000;i++); ClosePWM(); ConfigPWM(100,90);//频率100Hz,占空比90% for(i=0;i<40000;i++); ClosePWM();//关闭PWM,相当于占空比100% for(i=0;i<40000;i++); }}/*配置并启动PWM,fr:频率,dc:占空比*/voidConfigPWM(unsignedintfr,unsignedchardc){ unsignedinthigh,low; unsignedlongtmp;

tmp=(11059200/12)/fr;//计算一个周期所需的计数值 high=(tmp*dc)/100;//计算高电平所需的计数值6.3.3用定时器实现PWM控制

low=tmp-high;//计算低电平所需的计数值 high=65536-high+12;//高电平的重载值并补偿 low=65536-low+12;//低电平的重载值并补偿 HighRH=(unsignedchar)(high>>8); //高电平拆分 HighRL=(unsignedchar)high; LowRH=(unsignedchar)(low>>8);//低电平拆分 LowRL=(unsignedchar)low; TMOD&=0xF0; //清零T0的控制位 TMOD|=0x01; //配置T0为模式1 TH0=HighRH; //加载T0重载值 TL0=HighRL; ET0=1; //使能T0中断 TR0=1; //启动T0 P0=0xff; //输出高电平}6.3.3用定时器实现PWM控制/*关闭PWM*/voidClosePWM(){ TR0=0; //停止定时器 ET0=0; //禁止中断 P0=0xff; //输出高电平}6.3.3用定时器实现PWM控制/*T0中断服务函数,产生PWM输出*/voidTimer0()interrupt1{ if(P0==0xff)//当前输出为高,装载并输出低电平 { TH0=LowRH; TL0=LowRL; P0=0x00; } else //当前输出为低时,装载并输出高电平 { TH0=HighRH; TL0=HighRL; P0=0xff; }}6.3.3用定时器实现PWM控制6.4.1数码管显示原理6.4数码管的显示原理及实现图6-8数码管的结构和原理6.4.1数码管显示原理6.4数码管的显示原理及实现表6-2数码管显示代码表【例6-4】利用图6-9所示电路,在数码管最低位显示字型“0”。6.4.2数码管静态显示静态显示原理#include<reg52.h>//端口定义sbitLSC=P1^7;//特殊功能寄存器的位定义,sbitLSB=P1^6;//3-8译码器的输入端,sbitLSA=P1^5;//控制三极管Q2~Q6的导通unsignedcharcodesmgduan[]=//共阳极的显示代码表0~9{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};voidmain(){LSC=0;LSB=0;LSA=1;P0=smgduan[0];//显示代码经P0口输出while(1);}6.4.2数码管静态显示【例6-5】在上例基础上,在数码管最低位间隔一秒循环显示字型“0”~“9”。和例题4.1比较可以看出,只需在程序中采用循环查表的方式,将表格中的显示代码依次经P0口输出,并延时1秒即可实现功能要求,具体程序可自行在上例基础上修改。但在本例中采用不同的编程方式,采用结构化的编程方法,主程序的代码并不会因为功能的增加而过于复杂,也便于程序的修改和移植。led.h文件led.c文件主程序main.c(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论