STC89C52单片机的定时器使用

发布者:huijiazi5210最新更新时间:2016-04-15 来源: eefocus关键字:STC89C52  单片机  定时器 手机看文章 扫描二维码
随时随地手机看文章
////////////////////////////////////////////////////////////////////////

 实现功能:  配置定时器2的相关寄存器,使其实现定时器中断功能,然后根据中断
             的周期频率实现准确的时钟系统,在数码管上显示实现
 实验板型号:BS-XYD-C52
 实验名称:  定时器2实现时钟系统
 编写人:  谢应东
 编写日期:  2012-4-28     
/////////////////////////////////////////////////////////////////////////
#include  
#define uchar unsigned char  //定义unsigned char 为 uchar
#define uint  unsigned int  //定义unsigned int 为 uint

uchar cTime_10ms_counter;  //中断次数计数单元
uchar cTime_1s_ok;    //判断是否为1s的变量
uchar uDis_buff[6];    //显示缓冲区,存放要显示的6个字符的段码值
uchar cTime[3];     //时、分、秒计数单元

#define Time_1s_Sign 100  //根据中断周期,判断是否到一秒的标志

sbit led=P1^0;
sbit Duan=P2^6;     //定义数码管的段选使能端
sbit Wei =P2^7;        //定义数码管的位选使能端

#define Digital_tube_Wei_Enable Wei=1;  //开启控制数码管的位选使能端
#define Digital_tube_Wei_Disable Wei=0;     //关闭控制数码管的位选使能端

#define Digital_tube_Duan_Enable Duan=1; //开启控制数码管的段选使能端
#define Digital_tube_Duan_Disable Duan=0; //关闭控制数码管的段选使能端

#define Digital_tube_Duan P0    //定义数码管数据端口

uchar code Dis_table[]=      //将BCD码转换成数码管扫描码的数组
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
uchar code Dis_Position[]=  //定义数码管位选的数组
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
/////////////////////////////////////////////////////////////////////////

函数名称:毫秒延时函数
函数功能:实现毫秒级的延时
参数介绍:Delay_MS: 定义需要延时的毫秒的数值
          iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
    iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得
返回值: 
注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
          式完成,所以如果改变了晶振的频率,请做相应的改变
/////////////////////////////////////////////////////////////////////////

void DelayMs(uint Delay_MS)
{
 uint iNumber,iValue;
 for(iNumber=0;iNumber   //用for语句实现单片机的延时
 {
     iValue=107;      //107这个数值是通过测定而得
     while(iValue--);
 }
}
/////////////////////////////////////////////////////////////////////////
函数名称:One_DigitalTube_display
函数功能:完成在实验板上数码管指定显示,即在特定的数码管上显示特定的数字,比
          在第一个数码管上显示0
参数介绍:cData:要显示的数字的BCD码数组
          cNumber:选择哪个数码管显示,即让某个特定数码管显示
返回值: 
注意事项:实验板上的数码管是共阴极的数码管,如果使用共阳极的数码管,请注意不
          要弄反了
/////////////////////////////////////////////////////////////////////////

void One_DigitalTube_display(uchar cData,uchar cNumber)

  Digital_tube_Duan_Enable;      //使能数码管的段选
  Digital_tube_Duan=Dis_table[cData];//输入所要显示的数值
  Digital_tube_Duan_Disable;      //关闭数码管的段选
 
  Digital_tube_Wei_Enable;      //使能数码管的位选
  Digital_tube_Duan=Dis_Position[cNumber]; //点亮特定的数码管的公共端
  Digital_tube_Wei_Disable;      //关闭数码管的位选
  DelayMs(1);         //调整时序,以实现稳定显示
}
/////////////////////////////////////////////////////////////////////////
函数名称:Time_to_disbuffer
函数功能:把要在数码管上显示的数值,进行取余、取整,即对数值进行分割,这样以
          便显示在分离的数码管
参数介绍:cNumber1: 记录时、分、秒计数单元数组的变量
    cNumber2:记录显示缓冲区数组的变量
返回值: 
注意事项:无
/////////////////////////////////////////////////////////////////////////
void Time_to_disbuffer()
{
 uchar cNumber1,cNumber2=0;
 for(cNumber1=0;cNumber1<=2;cNumber1++)
 {
  uDis_buff[cNumber2++]=cTime[cNumber1]/10;   //对cTime的数值取整,即
                                              //就是取cTime的十位
  uDis_buff[cNumber2++]=cTime[cNumber1]; //对cTime的数值取余,即
                                              //就是取cTime的个位
 }
}
/////////////////////////////////////////////////////////////////////////
函数名称:Init_time2
函数功能:配置定时器2,配置的模式是定时器1采用16位定时器模式,在定时器1的输入
          数值寄存器输入特定的数值,使其每次中断的周期为10ms,同时允许定时器1
          中断,并打开总中断
参数介绍:无
返回值: 
注意事项:无
/////////////////////////////////////////////////////////////////////////
void Init_time1(void)
    
  TH2=(65535-10000)/256;  
  TL2=(65535-10000)%6;  //定时器0的,写入数值寄存器的低8位
    EA=1;             //总中断打开
  ET2=1;            //定时器T0允许中断
  TR2=1;            //定时器T0开始工作
}
/////////////////////////////////////////////////////////////////////////

函数名称:Timer_Display
函数功能:把显示缓冲区的数值显示在数码管上
参数介绍:cNumber:记录for语句的循环次数
返回值: 
注意事项:无
/////////////////////////////////////////////////////////////////////////
void Timer_Display()
{
   uchar cNumber;
   for(cNumber=0;cNumber<6;cNumber++)
   {
     One_DigitalTube_display(uDis_buff[cNumber],cNumber);
  if(cNumber==1|cNumber==3)
  {
   Digital_tube_Duan_Enable;      //使能数码管的段选
         Digital_tube_Duan=0x80;             //输入所要显示的数值
         Digital_tube_Duan_Disable;      //关闭数码管的段选
 
         Digital_tube_Wei_Enable;     //使能数码管的位选
         Digital_tube_Duan=Dis_Position[cNumber]; //点亮特定的数码管的公共端
         Digital_tube_Wei_Disable;     //关闭数码管的位选
   DelayMs(1);
  }
   }
}
/////////////////////////////////////////////////////////////////////////

函数名称:main
函数功能:利用定时器2中断,实现准确的时钟系统,然后在数码管上显示实现
参数介绍:无
返回值: 
注意事项:无
/////////////////////////////////////////////////////////////////////////
void main()
{
    Init_time1();     //初始化定时器1
    cTime[0]=23,cTime[1]=58,cTime[2]=58;    
 Time_to_disbuffer();        //把预设时间送入显示缓冲区    
 while(1)
 {
  if(cTime_1s_ok)       //判断是否到1秒了
  {
   cTime_1s_ok=0;
   if(++cTime[2]>=60)     //每次自加一,同时判断是否到1分钟
   {
    cTime[2]=0;
    if(++cTime[1]>=60)    //每次自加一,同时判断是否到1小时了
    {
     cTime[1]=0;
     if(++cTime[0]>=24) //每次自加一,同时判断是否到24点了
     {
      cTime[0]=0;
     }
    }
   }
   Time_to_disbuffer();   //新调整好的时间送入显示缓冲区
  }
  Timer_Display();      //更新显示内容
 }
}
/////////////////////////////////////////////////////////////////////////

函数名称:Interrupt_handler_time2
函数功能:重新给寄存器TH2和TL2赋值,判断是否到达一秒,如果到一秒了,把相应的
          变量赋予正值,以方便其他的程序编写
参数介绍:无
返回值: 
注意事项:无
/////////////////////////////////////////////////////////////////////////
void Interrupt_handler_time2(void) interrupt 5
{
 TF2=0;
  TH2=(65535-10000)/256;//定时10毫秒
 TL2=(65535-10000)%6;
 cTime_10ms_counter++;
 if(cTime_10ms_counter==Time_1s_Sign) //判断是否到达一秒
 {
  cTime_10ms_counter=0;
  cTime_1s_ok=1; 
 }
}

关键字:STC89C52  单片机  定时器 引用地址:STC89C52单片机的定时器使用

上一篇:STC89C52单片机驱动数码管动态显示
下一篇:单片机LCD实验2

推荐阅读最新更新时间:2024-03-16 14:50

一种基于单片机的测温系统研究设计
在农业生产活动中,温度、湿度信息的采集和传递是一项很重要的功能,以前粗放式生产,现在是追求高技术含量的精细化生产。农业上孵化、育种等场合,需要对温度实行控制,许多领域对温以及压力等数据的采集可通过传感器来实现,如何有效地管理棚室温度,是当前蔬菜管理的重点。本文针对由于农作物的不同时期传感器的空间位置不固定,布线不方便,可靠性差的问题,采用无线通信技术进行数据传输。利用微功率RF芯片(nRF24E1)设计了一个体积小、成本低、性能稳定、功耗低、数据传输可靠的点对多点的无线射频数据采集系统,实现了对多个采样点的实时数据无线采集。经过实际使用,DSl8820和单片机AT89S52以及RF芯片组成的测温系统,完全符合用户的需要。 1 系
[单片机]
一种基于<font color='red'>单片机</font>的测温系统研究设计
52单片机IO口输出点亮你的LED
特殊功能寄存器SFR声明 我们想要使用单片机的IO口就要先定义它的地址,我们可以从芯片资料上找到IO口对应的地址(也可以直接网上搜) 单片机C语言SFR声明: sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0;//定义P0~P3 定义好以后,通过控制P0~P1,我们可以同时控制他们对应的8个IO口,当然这次我们只需要点亮一两个LED,只需要用到一两个IO口,所以可以用下面的方法单独定义一个IO口。 sbit LED0 = P1 ^ 0; sbit LED1 = P1 ^ 1; sbit LED2 = P1 ^ 2; sbit LED3 = P1 ^
[单片机]
52<font color='red'>单片机</font>IO口输出点亮你的LED
制作机器人常用的单片机性能特点及使用经验
很多接触机器人或单片机不久的朋友面对种类繁多的单片机常会困惑,到底它们之间有何不同?制作机器人到底用哪种单片机控制比较好?当我们选择了一种单片机后,有何捷径能迅速掌握并应用这种单片机?本文尝试用一种通俗易懂的方法解读上述问题,并设计了一种有深度的单片机控制机器人的实例,希望能起到抛砖引玉的作用。我与大家分享我使用单片机的一些经验,希望能让初学者少些迷茫,让已经入门的朋友思维开阔。 写本文时我仅有3年单片机实践经验,比较了解51系列和AVR系列单片机,因此着重讨论了AVR单片机,我经验有限,有错误在所难免,希望朋友们批评指正! 一 单片机和CPU、个人电脑的区别和联系 这部分内容比较初级,但很多朋友刚接触单片机时或许对下面的问题不
[单片机]
制作机器人常用的<font color='red'>单片机</font>性能特点及使用经验
剖析STM32-定时器3
三、定时器PWM输出实验 1. 通用定时器PWM概述 PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%。PWM的功能有很多种,比如控制呼吸灯、控制直流电机或者舵机等驱动原件等等,是单片机的一个十分重要的功能。 在STM32单片机中,可以使用定时器的输出比较功能来产生PWM波: 即PWM模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx
[单片机]
剖析STM32-<font color='red'>定时器</font>3
STM32的定时器有两种捕获模式
一个定时器最多能同时捕获几路PWM波? 我只需要得到PWM的高电平宽度,PWM的频率是50HZ STM32的定时器有两种捕获模式 PWM输入模式和普通输入模式 在PWM输入模式下,一个定时器只能同时捕获一路PWM波 在普通输入模式下,理论上是可以同时捕获4路PWM波 即,在定时器中断中改变触发模式(上升沿、下降沿) 然后寄存器两次的差值即近似为高电平长度
[单片机]
AVR单片机公交车语音报站系统程序
const char QFDZ ={ {0x10,0x10,0x17,0x15,0x95,0x75,0x57,0x10,0x10,0x13,0x30,0xD0,0x57,0x10,0x10,0x00, 0x00,0x00,0xFE,0x20,0x24,0x22,0xFC,0x00,0x00,0xF8,0x02,0x01,0xFE,0x00,0x00,0x00},//前 {0x10,0x10,0x10,0x10,0x10,0x10,0x9F,0x52,0x32,0x12,0x12,0x13,0x10,0x10,0x10,0x00, 0x02,0x02,0x04,0x08,0x30,0xC0,0x00,0x00,0x04,0x02,0
[单片机]
单片机软件IAP策略
在开发阶段,通常采用ICP或者ISP的方式更新单片机软件,例如在stm32系列MCU上不仅可以更新程序,而且还能够调试实时观测内存数据、外设状态和全局变量以及单步运行、设置断点等。 但是当产品发布以后,这种单片机或者微控系统被嵌入某个对象系统中,很难采用ICP方式进行单片机程序更新;因此需要一种仅通过uart、can、eth等通信接口就可以实现单片机程序更新的技术,IAP便是其中一种; IAP全称In Application programmer即在应用编程。IAP技术将程序存储器分为若干区域,其中一种是IAP+APP区域,APP用来存储正常工作的程序,IAP用来存储通过通信接口修改APP区域的程序; 本文还是以stm32为例,介
[单片机]
车载MCU,又要变天了
要说MCU未来两年还能怎么变?除了加入AI加速器,或者从Cortex-M核心切换到RISC-V核心,就是集成新型存储器。 2月28日,英飞凌宣布新一代MCU AURIX TC4x 即将量产,与传统MCU不同,本代产品引入 RRAM 非易失存储介质(NVM)。无独有偶,ISSCC 2024上,瑞萨宣布已开发出用于嵌入式(包括MCU)的STT-MRAM电路技术的测试芯片。而早在2022年,意法半导体就发布Stellar P6车规MCU,彼时产品中就采用了PCM。 这预示着新型存储的MCU终于要正式和我们见面,这意味着,MCU制程技术要全面朝28nm以下进发,而第一个将要改变的市场,就是车载MCU市场。 车载MCU升级的另
[汽车电子]
车载<font color='red'>MCU</font>,又要变天了
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved