《8051单片机原理及应用》 课件 第五章 定时器系统_第1页
《8051单片机原理及应用》 课件 第五章 定时器系统_第2页
《8051单片机原理及应用》 课件 第五章 定时器系统_第3页
《8051单片机原理及应用》 课件 第五章 定时器系统_第4页
《8051单片机原理及应用》 课件 第五章 定时器系统_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

网络空间安全学院网络安全基础技术应用第五章定时器系统目录CONTENT5.1.定时器工作原理5.2.定时器配置5.3.PWM定时器5.1.1.定时器内部结构定时器通过记录单位时间发生的次数完成定时、延时等功能,所以定时器的核心是一个计数寄存器组,记录脉冲发生的次数。以定时器0为例,定时器0自动重装载内部结构及工作原理如图5.1-1所示。图5.1-1定时器0自动重装载内部结构图SYSclk在第二章图2.3-2已经说明。定时器内部结构的核心是计数寄存器TH0、TL0。在这两个寄存器前面,有两个选择开关,分别受到AUXR.7、C/T控制;在这两个计数寄存器下面,有2个重装寄存器RL_TH0、RL_TL0,是TH0和TL0的预装值。定时器的工作过程说明如下。5.1.1.定时器内部结构(1)TH0、TL0:定时器0的计数寄存器,从初值开始往上计数,是向上计数器。当定时器工作在16位模式时,TH0和TL0组合成为一个16位寄存器,TL0是低字节,TH0是高字节;如果定时器工作在8位模式,TL0和TH0是两个独立的8位寄存器。(2)当TR0=1,TH0、TL0开始对输入振荡器信号计数,计满后让TF0=1,向CPU发出中断请求。(3)TH0、TL0溢出后,一方面TF0置1,发出中断请求;另一方面自动重新载入RL_TH0、RL_TL0的值,开始新一轮的计数。(4)RL_TH0、RL_TL0是TH0和TL0的影子寄存器,当用户第一次给TH0、TL0赋值的时候,这个初值就被写入到RL_TH0、RL_TL0,一旦TH0、TL0计满溢出不仅置位TF0,而且会自动将影子寄存器的内容重新载入到TH0、TL0。5.1.1.定时器内部结构(5)定时器可以由软件启动,也可以由硬件启动。当GATE=0时无需外部条件只要TR0=1就可以让定时器计时;当GATE=1时需要INT0管脚为1,此时TR0=1才有效。(6)当C/T=0时,多路开关连接到系统内部系统时钟,是定时器的方式。定时器对内部系统时钟SYSclk周期计数,AUXR.7决定了SYSclk是否分频,如果AUXR.7=0,那么12个SYSclk定时器才计数一次,如果AUXR.7=1,那么1个SYSclk计数一次。(7)当C/T=1时,多路开关连接到芯片外部的T0管脚,是计数器的方式,不计算时间,只记录脉冲发生次数,当计数达到规定的值就溢出,发出中断请求。(8)当T0CLKO=1时,定时器0在P3.5管脚输出脉冲波形,为外围电路提供时钟信号源。5.1.2.定时器的工作模式不同的单片机型号提供的定时器数量是不一样的。传统8051单片机只有定时器0和1,且只有定时器1可做串口通信的波特率发生器。现代单片机定时器数量大大增加,STC8、STC32系列内置5个16位定时器。定时器的核心是计数寄存器,计数寄存器到底怎么工作,决定了定时器的工作模式。按照计数寄存器的位数,分为8位定时器、16位定时器;按照计数器初值是否能自动重装,分为自动重装载和不可重装两种。表5.1-1列出了STC单片机各定时器的工作模式。从列表5.1-1可知,定时器0和定时器1有四种工作模式,定时器2~4只有一种工作模式。下面分别介绍这四种工作模式。定时器x(Tx)定时器0(T0)定时器1(T1)定时器2~4(T2、T3、T4)模式016位自动重装载16位自动重装载模式模式116位不可重装模式28位自动重装模式3不可屏蔽中断的16位自动装载无效表5.1-1STC系列单片机定时器的工作模式5.1.2.定时器的工作模式1.模式0——16位自动重装:图5.1-2是定时器0的16位自动重装内部结构图,定时器的两个计数器THx、TLx都参与计数,当计数溢出后,单片机自动把影子寄存器的初始值赋值给它们,重新从初值开始计数。图5.1-2定时器的16位自动重装载模式5.1.2.定时器的工作模式2.模式1——16位不可重装:图5.1-3是定时器0的16位不可重装结构图,定时器的两个计数器THx、TLx都参与计数,当计数溢出后,THx和TLx向高位进位产生TF0信号,自身清零。因为没有自动重装初值,所以TH0、TL0从0开始重新计数,为了与上次定时时间一致,程序要对THx、TLx再次赋值。16位不可重装的工作过程如图5.1-3所示。图5.1-3定时器0的16位不可重装载模式5.1.2.定时器的工作模式3.模式2——8位自动重装:图5.1-4是定时器0的8位自动重装结构图,定时器只有TLx参与计数,当TLx计数溢出后,单片机自动把THx中的值装进TLx,从初值开始加1计数。图5.1-4定时器0的8位自动重装载模式4.模式3——不可屏蔽中断的16位自动装载:内部结构同模式0的图5.1-2完全一致,但是该模式中断处理特殊,只要中断开启,中断请求将不可屏蔽,既无法禁止该中断,此功能可作为系统节拍器或系统监控使用。任务1.理解定时器工作原理任务要求:理解定时器的核心部件——计数器寄存器TH、TL,其记录输入脉冲的过程。要求①设置定时器0的工作模式是8位自动重装(模式2);要求②读出计数寄存器的值;要求③当它溢出后蜂鸣器鸣叫。1.任务分析:(1)图5.1-4是定时器T0模式2工作原理图,根据任务要求,定时器工作在计数器模式。(2)设置T0管脚(P3.4)是计数器输入管脚,按键每按下一次,计数寄存器TL0值就增加1。(3)当TL0溢出后,TF0值会被置1。(4)令TL0值显示在数码管,TF0使得蜂鸣器响。(5)按键电路参考图5.1-6,电路没有上拉电阻,因此需要设置P34、P35是内部上拉。(6)蜂鸣器电路参考图5.1-7,P5.4管脚是可编程管脚,当它低电平时,三极管T2导通,蜂鸣器上电开始鸣叫。(7)查询TF0的状态,根据TF0的状态控制P5.4管脚电平。任务1.理解定时器工作原理图5.1-5定时器0、定时器1外部管脚连接按键图5.1-6蜂鸣器电路任务1.理解定时器工作原理2.任务参考代码:/*************功能说明******************************************读计数寄存器内容,了解定时器工作原理由于按键是机械按键,按下有抖动,本例程没有去抖动处理,所以按一次可能连续计数./*---------------------------------------------------------------------*/ #include<STC8.H>#defineMAIN_Fosc12000000UL//定义主时钟typedefunsignedcharu8;typedefunsignedintu16;typedefunsignedlongu32;/***********本地常量声明段码共阴数码管显示字形编码*************/任务1.理解定时器工作原理 //0123456789u8codetab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, //ABCDEFblack 0x77,0x7C,0x39,0x5E,0x79,0x71, 0x00};/************位码,8位数码管com7~com0独立选中****************/u8codedspcom[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};u8dspbuf[8]={16,16,16,16,16,16,16,16};//显示缓冲,初始化黑屏u8display_index=0;//显示位索引voiddelay_ms(u8ms);//声明延时函数voidDisplayScan(void);//数码管显示扫描/***********端口设置的初始化函数***********************/voidGPIO_PxMxSet()任务1.理解定时器工作原理{ P0M1=0x00;P0M0=0x00;//设置为准双向口P1M1=0x00;P1M0=0x00;//设置为准双向口P2M1=0x00;P2M0=0x00;//设置为准双向口//P3M1=0x00;P3M0=0x00;//设置为准双向口P4M1=0x00;P4M0=0x00;//设置为准双向口P5M1=0x00;P5M0=0x00;//设置为准双向口P6M1=0x00;P6M0=0x00;//设置为准双向口P7M1=0x00;P7M0=0x00;//设置为准双向口P40=0;}voidTimer0Init(void) //计数10次@12.000MHz任务1.理解定时器工作原理{ AUXR&=0x7F; //定时器时钟12T模式 TMOD&=0xF0; //设置定时器模式 TMOD|=0x06; //设置定时器模式 TL0=0xF5; //设置定时初始值,为了减少按键次数,从245开始计数 TH0=0xF5; //设置定时重载值 TF0=0; //清除TF0标志 TR0=1; //定时器0开始计数}voidmain(){GPIO_PxMxSet()任务1.理解定时器工作原理P3M1=0x30;P3M0=0x00;//P3.4,P3.5设置为输入口 P_SW2|=0x80; //使能扩展RAMP3PU=0x30;//P3.4,P3.5使能内部4.1K上拉电阻P_SW2&=0x7f;Timer0Init(); while(1){ if(TF0)//查询定时器是否溢出 { P54=0; delay_ms(200);//鸣叫一段时间 P54=1; TF0=0;

任务1.理解定时器工作原理 } DisplayScan(); }}//========================================================================//函数:voiddelay_ms(u8ms)//描述:延时函数。//参数:ms,要延时的ms数,这里只支持1~255ms.自动适应主时钟.//返回:none.//========================================================================任务1.理解定时器工作原理voiddelay_ms(u8ms){u16i;do{i=MAIN_Fosc/10000;while(--i);//10Tperloop}while(--ms);}/**********************数码管动态显示扫描函数************************/voidDisplayScan(void){ //显示内容 dspbuf[6]=TL0>>4;//显示高四位任务1.理解定时器工作原理 dspbuf[7]=TL0&0x0f;//显示低四位 //位选 P7=~dspcom[display_index];//从最左边开始 //段选 P6=~tab[dspbuf[display_index]]; //延时,稳定显示 delay_ms(2); //动态数码管扫描if(++display_index>=8)//与静态显示相比,数码管显示位是变化的{display_index=0;//8位结束回0}}任务1.理解定时器工作原理总结:P34,T0按键每按下一次,TL0计数值就增加1,当TL0=0xff,再次按下按键,定时器溢出,并将TH0的值自动重装给TL0。任务17操作视频见二维码5.1-1。二维码5.1-1任务17的程序实现5.2.定时器配置现代单片机有多个定时器,其中定时器0、1和传统8051完全兼容,定时器2及以上都是扩展定时器,这两类定时器的功能及使用稍有不同,因此分别讲述其配置方法。5.2.1.定时器0、1配置单片机的定时器0有4种工作模式,定时器1有3种工作模式。定时器模块是单片机重要资源,要开启定时器,首先要给它权限,允许定时器工作,即将允许标志位置“1”;其次要设置定时器的工作模式,即设定单片机工作在16位还是8位,是自动重装还是非重装模式。定时器配置,既给特殊功能寄存器赋值。有两个寄存器非常重要:控制寄存器(TCON)——允许标志位所在的寄存器;工作模式寄存器(TMOD)——设置定时器工作模式的寄存器。除了TCON、TMOD,其它与定时器0和1有关的寄存器一并说明如下。(1)TCON:定时器控制寄存器,可位寻址寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0TCON88HTF1TR1TF0TR0IE1IT1IE0IT05.2.1.定时器0、1配置TF1:定时器T1的溢出中断标志,当计数寄存器从初值加1计数,到0xffff(16位计数器)或0xff(8位计数器)后,进位产生溢出,硬件将TF1置“1”,向CPU发出中断请求,一直保持到CPU响应中断时,由硬件清“0”,如果单片机没有开启定时器中断,要软件清“0”TR1:定时器T1的运行控制位(TimerRunning),TR1=1,允许Timer1开始计数,TR1=0时停止Timer1计数。TF0:定时器T0的溢出中断编址,功能及使用同TF1。TR0:定时器T0的运行控制位,功能及使用同TR1。IE1:外部中断1(管脚INT1/P33)请求标志,当IE1=1,意味着有外部中断源信号向CPU发出请求,当CPU响应该中断时单片机自动清除该标志位。IT1:外部中断1触发控制位,当IT1=0,上升沿或下降沿都可触发外部中断1,当IT1=1,外部中断源的下降沿触发中断。IE0:外部中断0(管脚INT0/P32)请求标志,功能及使用同IE1。IT0:外部中断0触发控制位,功能及使用同IT1。5.2.1.定时器0、1配置(2)TMOD:定时器工作模式寄存器,可位寻址寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0TMOD89HGATEC/TM1M0GATEC/TM1M0for:定时器1定时器0TMOD可以控制Timer0和Timer1两个定时器的工作模式。高四位控制Timer1,低四位控制Timer0。GATE:当Gate=1,硬件开启定时器;Gate=0,定时器开启与外部管脚无关。C/T:定时器的作用域,当C/T=1,此时定时器的功能是个计数器,对外部中断的管脚脉冲进行计数。当C/T=0,是定时器,可以实现us、ms定时。5.2.1.定时器0、1配置M1M0:定时器工作模式选择。定时器0、1都有四个工作模式,这两个定时器的模式0~2完全一致,模式3不一样。如表5.2-1所示。M1M0定时器0定时器100模式0:16位自动重装定时器,当溢出时将RL_TH1/RL_TH0、RL_TL1/RL_TL0存放的值自动重装入TH1/TH0和TL1/TL001模式1:16位不可重装载模式,TH1/TH0、TL1/TL0溢出归零后要手动装入初值10模式2:8位自动重装载模式,当溢出时将TH1/TH0存放的值自动重装入TL1/TL011模式3:不可屏蔽中断的16位自动重载模式。与模式0相同,但是中断要无条件相应,是最高优先级,可用作操作系统的节拍定时器或者系统监控定时器。定时器无效,停止计数。表5.2-1定时器0和1的工作模式5.2.1.定时器0、1配置(3)TH0、TL0、TH1、TL1:计数寄存器,不可位寻址符号地址bit7bit6bit5bit4bit3bit2bit1bit0TL0/TL18AH/8BH--------TH0/TH18CH/8DH--------计数寄存器不可位寻址,只能整个寄存器读和写。当定时器工作在16位模式时,THx和TLx组合成一个16位寄存器,THx是高8位,TLx是低8位;若为8位模式,THx和TLx是两个独立的8位寄存器。5.2.1.定时器0、1配置(4)AUXR:辅助寄存器1,可位寻址”符号地址bit7bit6bit5bit4bit3bit2bit1bit0AUXR8EHT0x12T1x12UART_M0x6T2RT2_C/TT2x12EXTRAMSIST2T0x12:定时器0速度控制位。T0x12=0,12T模式,定时器时钟是晶振的1/12(FOSC/12);T0x12=1,1T模式,定时器时钟不分频(FOSC/1)。T1x12:定时器1速度控制位,功能及使用同T0x12,当复位后,T0x12、T1x12的值都为0,定时器时钟是12T模式,与传统8051兼容。UART_M0x6:串口1模式0的通讯速度控制。T2R:定时器2的运行控制位,T2R=0,定时器2停止计数;T2R=1,定时器2开始计数。T2_C/T:控制定时器2用作定时器或计数器,清“0”用作定时器(对内部系统时钟进行计数),置“1”用作计数器(对管脚T2/P1.2外部脉冲进行计数)。T2x12:定时器2速度控制位,T2x12=0,12T模式,系统时钟12分频;T2x12=1,1T模式,系统时钟不分频。EXTRAM:扩展RAM访问控制,EXTRAM=0,访问内部扩展RAM;EXTRAM=1,内部扩展RAM被禁用。5.2.2.定时器计算公式定时器0、1的计算公式见表5.2-2。定时器计数器定时器速度周期时间计算公式16位1T

12T

8位1T

12T表5.2-2定时器0、1定时时间计算公式:从在上面的计算公式可以看到,定时器的计数寄存器其实是个向上计数器。所谓“向上”就是从THx、TL初值开始,每来一个时钟源脉冲,就自动+1,直到计数满为止。定时器的定时时间和THx、TLx的初值有关系,初值越大,定时时间就越短。另外,系统时钟频率越快,最大定时时间越短。设单片机晶振12MHz,定时器设置在12T,那么定时器最大定时时间65.536ms。定时器设置在1T,最大定时时间只有5.46ms。5.2.2.定时器计算公式在单片机应用开发中通常已知定时时间,定时器初值是未知数,即需要计算定时器从何值开始计数,初值计算公式如表5.2-3所示。定时器位数定时器速度计数寄存器初值计算公式16位1T12T

8位1T

12T

表5.2-3定时器0、1的计数寄存器初值计算公式:5.2.2.定时器计算公式例1:已知STC8H8K单片机时钟电路频率是12MHz,单片机定时T0工作在12T,16位自动重装模式,现在要定时50ms,请问T0的TH0、TL0初值装载多少合适?思路1:按照表5.2-3的公式计算,可以得到TH0和TL0的初值,注意计算的时候数量单位要统一,时间如果用秒,频率就要用Hz。256=(65536-50000)/256=60=(65536-50000)%256=176思路2:单片机的SYSclk是12MHz,定时器12T,因此定时器输入时钟周期是1us,现在定时50ms即50000us,要经过50000个时钟周期达到定时时间,因此从65536-50000=15536开始计数。15536转换成16进制为0x3CB0,因此TH0=0x3C,TL0=0xB0,与思路1的计算结果一致。5.2.2.定时器计算公式例2:例1的定时器T0如果设定在1T,定时还是50ms,TH0、TL0初值又该如何设定?思路:12MHz单片机的定时器如果在1T工作模式,50ms已经超过了它的最大定时时间,可以将50ms分解为10个5ms,或者50个1ms,定时器先设定为5ms或1ms溢出,然后记录溢出次数,达到次数后说明定时时间到。令T0的定时时间1ms,得到:256=(65536-12000)/256=209=(65536-12000)%256=32当定时器溢出50次后,达到定时时间50ms。5.2.2.定时器计算公式下面介绍使用辅助工具STC-ISP获得定时器初值的方法,图5.2-1示意了工具使用方法。图5.2-1STC-ISP软件定时器初始化5.2.2.定时器计算公式步骤如下:(1)选择系统时钟(2)选择定时器(3)设置定时长度(4)选择定时器模式(5)定时器时钟选择1T(6)点击生成C代码,得到THx、TLx。(7)复制代码,粘贴到Keil程序书写框。任务3.定时器1定时1s任务要求:设置1秒定时器。通过LED灯的闪烁彰显定时器效果。1.任务资讯及分析:(1)LED电路原理图如图5.2-2所示。(2)单片机晶振选择12MHz。单片机工作在1T方式下。(3)由任务要求可知,定时器周期是1秒,根据表5.2-2定时器周期的计算公式,对于16位定时器1T工作方式,当THx和TLx是最小值0的时候,定时器的定时时间最多只有5个毫秒,现在要定时1秒,让定时器只溢出一次肯定是不够的。解决办法是定时器先定时1毫秒,然后记录定时器溢出次数,当定时器溢出1000次后,就是1秒定时。(4)开启定时器1,利用STC-ISP软件获得定时器的设置语句,过程如图5.2-1所示。(5)开启单片机中断工作模式,当定时器1溢出后,CPU执行中断。(6)书写定时器中断函数,在中断里记录定时器时间,控制led状态。任务3.定时器1定时1s图5.2-2LED电路任务3.定时器1定时1s2.任务参考代码:#include<STC8.H>//包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义/********************************************************定时器初始化函数*********************************************************/voidTimer1Init(void) //1毫秒@12.000MHz1T模式{ AUXR|=0x40; //定时器时钟1T模式 TMOD&=0x0F; //设置定时器模式 TL1=0x20; //设置定时初始值 TH1=0xD1; //设置定时初始值任务3.定时器1定时1s TF1=0; //清除TF1标志 TR1=1; //定时器1开始计时 ET1=1;//打开定时器1中断EA=1;//打开总中断}/********************************************************主函数*********************************************************/ voidmain(void){GPIO_PxMxSet();//见任务15Timer1Init();任务3.定时器1定时1s{ ;}}//========================================================================//函数:voidTimer1_Isr(void)interruptTIMER1_VECTOR//描述:timer1中断函数.//参数:none.//返回:none.//========================================================================任务3.定时器1定时1svoidTimer1_Isr(void)interrupt3{staticintcnt=0;cnt++;//记录定时器中断溢出的次数if(cnt==1000)//1s时间到{ cnt=0; P60=~P60;}}任务18操作视频见二维码5.2-1。二维码5.2-1任务18的程序实现5.2.3.定时器2~4的配置现代单片机都提供多个定时器,与定时器0和1不同,定时器2、3、4的工作模式只有一种既16位自动重载模式。定时器可以定时、计数复用,可以设置为串口波特率发生器或可编程时钟输出。以定时器2为例其内部结构如图5.2-3所示。图5.2-3定时器2内部结构5.2.3.定时器2~4的配置(1)T2H、T2L:定时器2计数寄存器,是定时器工作的核心寄存器,T2H、T2L合成为一个16位寄存器,T2H是高字节,T2L是低字节。(2)RL_T2H、RL_T2L是T2H和T2L的影子寄存器。(3)只要T2R=1,T2H、T2L就开始计数。(4)当T2_C/T=0时,多路开关连接到系统内部系统时钟,是定时器的方式。当T2_C/T=1时,多路开关连接到芯片外部的T2管脚,是计数器的方式,对管脚脉冲计数。(5)增加了8位预分频寄存器TM2PS,定时器2的时钟=系统时钟SYSclk÷(TM2PS+1)。所以系统时钟是可以编程的。(6)AUXR.2决定是否对定时器2的时钟再次12分频或不分频。5.2.3.定时器2~4的配置(7)TM2PS:定时器2的8位预分频寄存器,不可位寻址。TM2PS、TM3PS、TM4PS的寄存器地址和内部位结构如表5.2-4所示。寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0TM2PSFEA2H--------TM3PSFEA3H--------TM4PSFEA4H--------表5.2-4预分频寄存器内部不可位寻址结构示意(8)定时器2~4的定时器周期计算公式列于表5.2-5中。定时器速度周期计算公式1T

12T表5.2-5定时器2~4的计算公式:注:上式中x=2,3,4,对应定时器2、3、4。SYSclk是系统时钟,如果芯片连接外部时钟,则为外部晶振频率,如果是内部时钟,则为内部晶振频率。任务4.定时器2扫描数码管动态显示任务要求:使8位数码管显示时间。显示格式如下:小时(十位)小时(个位)-分(十位)分(个位)-秒(十位)秒(个位)1.任务资讯:(1)数码管电路参考第3章任务8图3.4-1。数码管的段选连接P6端口,位选连接P7端口。(2)数码管动态扫描原理:人眼有视觉停留效应。光信号进入人眼后,在视网膜上产生影像,光信号消失后,影像并不会立即消失,这个过程就称为视觉暂留效应,暂留时间约为0.05~0.2秒。动画片、电影的播放都是利用这个原理将静止的画面变换为连续画面。(3)图3.4-1中八位数码管的显示段都连接在一起,要让每位数码管显示不同的字型,必须利用人眼视觉停留效应。方法是轮流向各位数码管送出要显示的字型,每次只有一个数码管显示。每位数码管独立显示的时间都很短,因为视觉停留效应,看上去这些数码管同时在显示不同字型。如果把数码管当做“靶子”,这些靶子每隔一段时间就要扫射一遍,所以称为动态扫描,也称动态刷新。任务4.定时器2扫描数码管动态显示3.任务参考代码:#include<STC8.H>//包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义typedefunsignedcharu8;typedefunsignedintu16;typedefunsignedlongu32;#defineDIS_0x11//显示“-”/*********************本地常量声明段码共阴数码管显示字形编码*************/u8codetab[]={//0123456789ABCDEF0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,//black-HJKLNoPUtGQrMy0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,任务4.定时器2扫描数码管动态显示//0.1.2.3.4.5.6.7.8.9.-10xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};/***********************位码,8位数码管com7~com0独立选中****************/u8codedspcom[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};/*************本地变量声明**************/u8dspbuf[8];//显示缓冲u8display_index=0;//显示位索引u8second_cnt,minute_cnt,hour_cnt;/*******************************显示函数****************************************/voidDisplayScan(void);/********************************************************定时器初始化函数任务4.定时器2扫描数码管动态显示*********************************************************/voidTimer0Init(void) //1毫秒@12.000MHz1T模式,定时器0{ AUXR|=0x80; //定时器时钟1T模式 TMOD&=0xF0; //设置定时器模式 TL0=0x20; //设置定时初始值 TH0=0xD1; //设置定时初始值 TF0=0; //清除TF0标志 TR0=1; //定时器0开始计时}voidTimer2Init(void) //2毫秒@12.000MHz{任务4.定时器2扫描数码管动态显示 AUXR|=0x04; //定时器时钟1T模式 T2L=0x40; //设置定时初始值 T2H=0xA2; //设置定时初始值 AUXR|=0x10; //定时器2开始计时}/********************************************************主函数*********************************************************/ voidmain(void){GPIO_PxMxSet(); ET0=1;//打开定时器0中断任务4.定时器2扫描数码管动态显示IE2=IE2|0x04;//打开定时器2中断,ET2=1,IE2不可位寻址EA=1;//打开总中断 Timer0Init();Timer2Init();while(1){ ;}}///========================================================================任务4.定时器2扫描数码管动态显示//函数:voidtimer0_int(void)interruptTIMER0_VECTOR//描述:timer0中断函数.//参数:none.//返回:none.//========================================================================voidtimer0_int(void)interrupt1{staticintcnt=0;cnt++;//记录定时器中断溢出的次数if(cnt==1000)//1s时间到{任务4.定时器2扫描数码管动态显示 cnt=0; P60=~P60; second_cnt++;//秒 if(second_cnt==60) {second_cnt=0; minute_cnt++;//分 if(minute_cnt==60) { minute_cnt=0; hour_cnt++; if(hour_cnt==24) hour_cnt=0;任务4.定时器2扫描数码管动态显示 hour_cnt=0; } }}}//========================================================================//函数:voidtimer2_int(void)interruptTIMER2_VECTOR//描述:timer2中断函数.数码管定时扫描//参数:none.//返回:none.//=======================================================任务4.定时器2扫描数码管动态显示voidtimer2_int(void)interrupt12{DisplayScan();}/**********************显示扫描函数************************/voidDisplayScan(void){//显示内容dspbuf[7]=second_cnt%10;//最左边秒dspbuf[6]=second_cnt/10;dspbuf[5]=DIS_;dspbuf[4]=minute_cnt%10;

dspbuf[3]=minute_cnt/10;任务4.定时器2扫描数码管动态显示dspbuf[2]=DIS_;dspbuf[1]=hour_cnt%10;dspbuf[0]=hour_cnt/10; //位选 P7=~dspcom[display_index];//从com7开始//段选 P6=~tab[dspbuf[display_index]]; //delay_ms(2);//延时,因为定时扫描,所以无需延时。if(++display_index>=8){display_index=0;//8位结束回0}}任务4.定时器2扫描数码管动态显示任务19操作视频见二维码5.2-2。二维码5.2-2任务19的程序实现在上面的程序中,注意每次只能有一个管子工作,当该管工作时,其他管子都要熄灭。任务5.定时器3扫描按键矩阵任务要求:检测按键矩阵,如果有按键按下,就返回按键值。1.任务资讯:按键矩阵工作原理(1)矩阵式键盘由行线和列线组成,按键的两端分别连接一个行线、一个列线。矩阵按键中的每个按键都是二端口器件。在单片机上电复位后,GPIO口是弱上拉状态,检测到的按键行列线都是高电平。图5.2-4中为了增强可靠性,行线通过10K电阻强制拉到了高电平。图5.2-4按键矩阵电路图任务5.定时器3扫描按键矩阵(2)检测按键键值的方法有逐列扫描法、行列反转法。逐列(行)扫描法:首先判断键盘是否有键按下,方法是向所有的列线上输出低电平,再读入所有的行信号,只要有一个按键按下,那么读入的行电平就不全为高。第二步,判断具体的键值。方法是往列线上逐列送低电平,在送出列线电平后,就要读行线的状态,当其中一个行线是低电平,那么就能判断出该行列对应的按键按下。行列反转法:分别给行、列端口输出两次相反的值,再将读入的行值和列值进行运算,得到每个键的键值。首先向所有的列线输出低电平,行线输出高电平,然后读行线,只要有一个按键按下,对应的行线就是低电平,记录该行线的值;其次和上面步骤相反,向所有的列线上输出高电平,行线输出低电平,读入列线,如果有按键按下,对应的列线就是低电平,记录该列线的值。(3)根据键值的定义情况,得出键值计算公式。图5.2-4中键值从左到右、从上往下1~8编号。键值=行号×4+列号,行号在0~1之间,列号在0~3之间。任务5.定时器3扫描按键矩阵2.任务分析(1)本例程采用逐行扫描法检测按键。(2)本例程开启定时器3,定时逐行扫描按键。(3)开启定时器3中断,减轻主函数的任务量。定时器3的中断编号是19。(4)利用STC-ISP软件获得定时器3的配置代码。任务5.定时器3扫描按键矩阵3.任务参考程序:#include<stc8h.h>//包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义#include"intrins.h"#defineMAIN_Fosc24000000L//定义主时钟typedefunsignedcharu8;typedefunsignedintu16;typedefunsignedlongu32;#defineDIS_0x11//显示“-”u8codetab[]={//标准字库//0123456789ABCDEF0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,任务5.定时器3扫描按键矩阵//black-HJKLNoPUtGQrMy0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};//0.1.2.3.4.5.6.7.8.9.-1u8codedspcom[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位码u8dspbuff[8];//显示缓冲u8display_index;//显示位索引u8KeyCode;//给用户使用的键码,1~16有效/********************************************************定时器初始化函数*********************************************************/voidTimer3Init(void) //2毫秒@24.000MHz任务5.定时器3扫描按键矩阵{ T4T3M|=0x02; //定时器时钟1T模式 T3L=0x80; //设置定时初始值 T3H=0x44; //设置定时初始值 T4T3M|=0x08; //定时器3开始计时}voidIO_KeyScan(void);//按键扫描函数unsignedcharcol_scan();/**********************************************/voidmain(void){u8i;任务5.定时器3扫描按键矩阵GPIO_PxMxSet(); P40=1;//关闭led灯 IE2|=0x20;//开启定时器3中断,IE2.5是ET3,IE2不能位寻址。EA=1;//打开总中断Timer3Init(); display_index=0;for(i=0;i<8;i++)dspbuff[i]=DIS_;//上电显示“-”KeyCode=0;//给用户使用的键码,1~16有效cnt50ms=0;while(1){;//定时器里完成按键扫描和数码管显示任务5.定时器3扫描按键矩阵}}/***************逐行扫描程序**********************/voidIO_KeyScan(void)//50mscall{u8i;//循环次数 u8col,row; //列、行的编号 for(i=0;i<2;i++) {P0=0xff;//P0全部拉高 if(i==0) {P06=0;//拉低第一行 col=col_scan();//扫描列,记录按键的列值 任务5.定时器3扫描按键矩阵} elseif(i==1) {P07=0;//拉低第二行 col=col_scan();//扫描列,记录按键的列值 } elsecol=0x0f; if(col<0x0f) {row=i; KeyCode=row*4+col+1;//从1开始 } }}任务5.定时器3扫描按键矩阵unsignedcharcol_scan() { unsignedcharcol; if(P00==0) col=0; elseif(P01==0) col=1; elseif(P02==0) col=2; elseif(P03==0) col=3; else col=0x0f;任务5.定时器3扫描按键矩阵 return(col); }/**********************显示扫描函数************************/voidDisplayScan(void){ if(KeyCode>0)//有键按下,按键显示内容改变 { dspbuff[6]=KeyCode/10;//显示键码,十位数 dspbuff[7]=KeyCode%10;//显示键码,个位数 最右边数码管 } //位选,从右往左任务5.定时器3扫描按键矩阵P7=~dspcom[7-display_index]; //段选 P6=~tab[dspbuff[display_index]];if(++display_index>=8) display_index=0;//8位结束回0}///========================================================================//函数:voidtimer3_int(void)interruptTIMER3_VECTOR//描述:timer3中断函数.//参数:none.//返回:none.任务5.定时器3扫描按键矩阵//=======================================================voidtimer3_isr(void)interrupt19{staticu8cnt50ms; DisplayScan();//2ms数码管就显示一次if(++cnt50ms>=25)//50ms扫描一次行列键盘 { cnt50ms=0; IO_KeyScan(); }}任务5.定时器3扫描按键矩阵任务20操作视频见二维码5.2-3。二维码5.2-3任务20的程序实现5.3.PWM定时器PWM(PulseWidthModulation)简称脉宽调制,是利用微处理器的数字输出对模拟电路进行控制的一种非常有效地技术,广泛应用在测量、通信、工业控制等方面。图5.3-1是PWM波形示意图,高电平(通电)经历的时间称为脉宽,T1是波形周期。在一个脉冲的循环中,高电平(通电时间)相对于总时间所占的比例称为占空比。图5.3-1PWM波形示意图5.3.PWM定时器STC8H/STC32G系列单片机提供16位高级PWM定时器,可对外输出任意频率以及任意占空比的PWM波形,输出互补/对称/带死区的PWM波形。可以捕获外部输入信号并测量其周期值和占空比值。有正交编码功能、外部异常检测功能以及实时触发ADC转换功能。16位高级PWM定时器有8通道,分成了PWMA和PWMB两组PWM,每组周期可不同,每组都可配置成4路PWM输出或捕捉外部信号,第一组PWMA的4个通道分别是PWM1P/PWM1N、PWM2P/PWM2N、PWM3P/PWM3N、PWM4P/PWM4N,第二组PWMB的4个通道分别是PWM5、PWM6、PWM7、PWM8,两组每个通道都可独立实现PWM输出、捕获和比较功能。PWMA的输出功能更强大,4个通道有正负两端,可输出带死区的互补对称PWM,每个通道都可独立实现PWM输出,或者两两互补对称输出。PWMB只能输出单端PWM。若需要使用第一组PWM定时器进行捕获或者测量脉宽,输入信号只能从每路的正端输入。PWM定时器的预分频系数可在1~65535之间变化。PWM定时器在电机驱动领域应用广泛,本节主要介绍PWM定时器输出比较功能的使用方法。5.3.1.PWM定时器的时基单元PWM定时器的时基单元和普通定时器内部结构相似,但PWM定时器的计数器,不仅可以向上计数,还能向下计数、中央计数。以PWMA为例,它的时基单元包含:16位向上/向下计数器、16位自动重载寄存器、重复计数器、预分频器。它的工作过程如图5.3-2所示,定时器时钟CK_PSC除以预分频器PWM_PSCR里的数值,得到分频后的时钟信号,16位计数器PWM_CNTR对该时钟向上或向下计数,每当16位计数器溢出一次,重复计数器的值就递减一次,当重复计数器里的值减到0,此时PWM定时器向CPU发出中断请求。图5.3-2表明16位计数器的初值保存在自动重载寄存器PWM_ARR里,当CNTR溢出,ARR值重新载入CNTR;同理,重复计数器里的值减到0后,由重复计数寄存器PWM_RCR里的值重新载入。图5.3-2PWM定时器的时基单元5.3.1.PWM定时器的时基单元重复计数器的好处是,可以令16位计数器溢出多次后才发出定时器中断请求,延长定时器中断时间。预分频器令定时器输入时钟频率可调,分频系数在0~65535之间设置。16位计数器的频率计算公式:1.向上计数模式在向上计数模式中,计数器从0开始计数到用户定义的比较值(ARR),然后重新从0开始计数,并产生一个计数器溢出事件,如图5.3-3所示。图5.3-3向上计数模式5.3.1.PWM定时器的时基单元2.向下计数模式在向下模式中,计数器从自动装载(ARR)的值开始向下计数到0,然后再从ARR里的值重新开始计数,并产生一个计数器向下溢出事件,如图5.3-4所示。图5.3-4向下计数模式5.3.1.PWM定时器的时基单元3.中间对齐模式在中央对齐模式,计数器从0开始计数到ARR寄存器的值,产生一个计数器上溢事件,然后从ARR的值向下计数到0并且产生一个计数器下溢事件,如图5.3-5所示。图5.3-5中央对齐模式5.3.1.PWM定时器的时基单元图5.3-6图展示了重复计数寄存器RCR等于0、1、2、3的定时器中断请求(更新事件UEV)情况。当RCR=0,计数器溢出和UEV一致;当RCR=1,计数器溢出2次发出UEV请求;当RCR=2,计数器溢出3次发出UEV请求;当RCR=3,计数器溢出4次发出UEV请求。图5.3-6重复寄存器设置和中断请求对应情况5.3.2.PWM定时器输出比较功能PWM定时器中的“比较”是指PWM模块(图5.3-2)中计数器(CNT)的值和预装载(ARR)的值进行比较,输出一个矩形波。假定PWM定时器工作在向上计数模式,如图5.3-7所示。坐标纵轴是CNT的值,黄色线条表示ARR值,红色线条是输出比较寄存器(CCRx)值。锯齿波表明随着时间的推进,CNT值在增加,当CNT值达到CCRx的值,输出从低电平跳转成高电平;当CNT值继续增加到预装载值,CNT回复到0,输出从高电平恢复成低电平。用逻辑表达式表述:当CNT<CCRx时,输出0;当CNT>=CCRx时,输出1。5.3.2.PWM定时器输出比较功能图5.3-7中还表明,PWM计数器会反复计数,当CNT增长到ARR值的时候,计数器归零,然后重新向上计数。如此重复,就得到一个PWM矩形波。改变CCRx的值,就改变了PWM输出的占空比;改变ARR的值,就改变了PWM输出的频率。图5.3-7

PWM输出比较波形5.3.3.PWM定时器寄存器开启PWM定时器需要设置相关寄存器,主要有功能脚切换寄存器、使能寄存器、控制寄存器、中断使能寄存器、模式寄存器等。1.PWM功能脚切换寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0PWMA_PSFEB2HC4PS[1:0]C3PS[1:0]C2PS[1:0]C1PS[1:0]PWMB_PSFEB6HC8PS[1:0]C7PS[1:0]C6PS[1:0]C5PS[1:0]CxPS[1:0]是PWM第x通道的输出脚选择位,以通道1为例:C1PS[1:0]PWM1PPWM1N00P1.0P1.101P2.0P2.110P6.0P6.15.3.3.PWM定时器寄存器2.输出使能寄存器1.PWM功能脚切换ENOxP是PWM定时器第x通道的正极输出控制位,ENOxN是PWM定时器第x通道的负极输出控制位,0——禁止输出;1——使能输出。PWMB是单端输出,只有1个管脚输出使能。3.控制寄存器寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0PWMA_ENOFEB1HENO4NENO4PENO3NENO3PENO2NENO2PENO1NENO1PPWMB_ENOFEB5H-ENO8P-ENO7P-ENO6P-ENO5P寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0PWMA_CR1FEC0HARPEACMSA[1:0]DIRAOPMAURSAUDISACENAPWMB_CR1FEE0HARPEBCMSB[1:0]DIRBOPMBURSBUDISBCENB5.3.3.PWM定时器寄存器控制寄存器1规定了PWM定时器的计数模式。ARPEn:自动预装载允许位,0表示ARR寄存器没有缓冲,直接写入;1表示ARR寄存器由预装载缓冲器缓冲。CMSn[1:0]选择对齐模式:CMSn[1:0]对齐模式说明00边沿对齐模式计数器依据方向位(DIR)向上或向下计数01中央对齐模式1计数器向下计数时输出比较中断标志位置110中央对齐模式2计数器向上计数时输出比较中断标志位置111中央对齐模式3计数器向上和向下计数时输出比较中断标志均被置1.5.3.3.PWM定时器寄存器DIRn:计数器的计数方向,0——计数器向上计数;1——计数器向下计数。CENn:允许计数器,0——禁止计数器;1——使能计数器。OPMn:单脉冲模式,0——在发生更新事件时,计数器不停止;1——在发生下一次更新事件时,清楚CEN位,计数器停止。URSn:更新请求源,0——如果UDIS允许产生更新事件,则任一事件(寄存器更新、软件设置UG位、时钟/触发控制器产生更新)都会产生一个更新中断;1——如果UDIS允许产生更新事件,则只有当寄存器被更新(计数器上溢/下溢)才产生更新中断,并UIF置1。UDISn:禁止更新,0——产生更新事件;1——不产生更新事件。5.3.3.PWM定时器寄存器4.

温馨提示

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

评论

0/150

提交评论