STC89C52单片机定时器1实现计数器

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

 实现功能:  配置定时器1的相关寄存器,使其实现定时器中断功能,然后通过在数码
 实验板型号:BS-XYD-C52
 实验名称:  定时器1实现计数器
 编写人:  谢应东
 编写日期:  2012-4-26      
 ///////////////////////////////////////////////////////////////////////////
#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[2];    //显示缓冲区,存放要显示的2个字符的段码值
uchar cTime;     //秒计数单元

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

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[]=  //定义数码管位选的数组
{0x3e,0x3d,0x3b,0x37,0x1f,0x2f};
 ///////////////////////////////////////////////////////////////////////////
函数名称:毫秒延时函数
函数功能:实现毫秒级的延时
参数介绍: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
参数介绍:uData:要显示的数字的BCD码数组
          uNumber:选择哪个数码管显示,即让某个特定数码管显示
返回值: 
注意事项:实验板上的数码管是共阴极的数码管,如果使用共阳极的数码管,请注意不
          要弄反了
 ///////////////////////////////////////////////////////////////////////////
void One_DigitalTube_display(uchar uData,uchar uNumber)

  Digital_tube_Duan_Enable;      //使能数码管的段选
  Digital_tube_Duan=Dis_table[uData];//输入所要显示的数值
  Digital_tube_Duan_Disable;      //关闭数码管的段选

  Digital_tube_Duan=Dis_Position[uNumber]; //点亮特定的数码管 
  Digital_tube_Wei_Enable;      //使能数码管的位选
  Digital_tube_Wei_Disable;      //关闭数码管的位选
  DelayMs(5);         //调整时序,以实现稳定显示
}
 ///////////////////////////////////////////////////////////////////////////
函数名称:Time_to_disbuffer
函数功能:把要在数码管上显示的数值,进行取余、取整,即对数值进行分割,这样以
          便显示在分离的数码管
参数介绍:无
返回值: 
注意事项:无
 ///////////////////////////////////////////////////////////////////////////
void Time_to_disbuffer()
{
 uDis_buff[1]=cTime;   //对cTime的数值取余,即就是取cTime的个位
 uDis_buff[0]=cTime/10;   //对cTime的数值取整,即就是取cTime的十位
}
 ///////////////////////////////////////////////////////////////////////////
函数名称:Init_time1
函数功能:配置定时器1,配置的模式是定时器1采用16位定时器模式,在定时器1的输入
          数值寄存器输入特定的数值,使其每次中断的周期为10ms,同时允许定时器1
          中断,并打开总中断
参数介绍:无
返回值: 
注意事项:无
 ///////////////////////////////////////////////////////////////////////////
void Init_time1(void)
{
 TMOD |= 0x10;         
  TH1=(65535-10000)/256;  
  TL1=(65535-10000)%6;  //定时器0的,写入数值寄存器的低8位
    EA=1;             //总中断打开
  ET1=1;            //定时器T0允许中断
  TR1=1;            //定时器T0开始工作
}
 ///////////////////////////////////////////////////////////////////////////
函数名称:Timer_Display
函数功能:把显示缓冲区的数值显示在数码管上
参数介绍:cNumber:记录for语句的循环次数
返回值: 
注意事项:无
 ///////////////////////////////////////////////////////////////////////////
void Timer_Display()
{
   uchar cNumber;
   for(cNumber=0;cNumber<2;cNumber++)
   {
     One_DigitalTube_display(uDis_buff[cNumber],cNumber);
  DelayMs(2);
   }
}
 ///////////////////////////////////////////////////////////////////////////
函数名称:main
函数功能:利用定时器1中断,在数码管上实现以一分钟为周期的计数器
参数介绍:无
返回值: 
注意事项:无
 ///////////////////////////////////////////////////////////////////////////
void main()
{
    Init_time1();     //初始化定时器1
    cTime=0;    
 while(1)
 {
  if(cTime_1s_ok)
  {
   cTime_1s_ok=0;
   if(++cTime>=60)     //每次自加一,同时判断是否到1分钟
   {
    cTime=0;
   }
   Time_to_disbuffer();   //新调整好的时间送入显示缓冲区
  }
  Timer_Display();      //更新显示内容
 }
}
 ///////////////////////////////////////////////////////////////////////////
函数名称:Interrupt_handler_time1
函数功能:重新给寄存器TH1和TL1赋值,判断是否到达一秒,如果到一秒了,把相应的
          变量赋予正值,以方便其他的程序编写
参数介绍:无
返回值: 
注意事项:无
 ///////////////////////////////////////////////////////////////////////////
void Interrupt_handler_time1(void) interrupt 3
{
 uchar i;
  TH1=(65535-10000)/256;//定时10毫秒
 TL1=(65535-10000)%6;
 cTime_10ms_counter++;
 if(cTime_10ms_counter==Time_1s_Sign) //判断是否到达一秒
 {
  cTime_10ms_counter=0;
  cTime_1s_ok=1; 
 }
}

关键字:STC89C52  单片机  定时器  计数器 引用地址:STC89C52单片机定时器1实现计数器

上一篇:STC89C52单片机蜂鸣器唱歌实验
下一篇:STC89C52单片机定时器0的中断实验

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

单片机轮询模式多任务并行处理
时间片轮询思路介绍: 时间片轮询法,在很多书籍中有提到,而且有很多时候都是与操作系统一起出现,也就是说很多时候是操作系统中使用了这一方法。不过我们这里要说的这个时间片轮询法并不是挂在操作系统下,而是在前后台程序中使用此法。也是本贴要详细说明和介绍的方法。 对于时间片轮询法,虽然有不少书籍都有介绍,但大多说得并不系统,只是提提概念而已。下面本人将详细介绍本人模式,并参考别人的代码建立的一个时间片轮询架构程序的方法,我想将给初学者有一定的借鉴性。 使用1个定时器,可以是任意的定时器,这里不做特殊说明,下面假设有3个任务,那么我们应该做如下工作: 1. 初始化定时器,这里假设定时器的定时中断为1ms(当然你可以改成10ms,
[单片机]
51单片机的8x8点阵贪吃蛇
如今用8x8LED点阵制作的贪吃蛇游戏在网上的源码已经多不胜数了,由于闲得蛋疼,也搞了搞,不过因为Me很懒,又穷,所以硬件就木有搞,只是用proteus仿真了一下。。。 源码工程及仿真在这:https://pan.baidu.com/s/1i5tyOtv 顺便也唠叨一下这个贪吃蛇的源码吧,有图有真相,上图 画面简单清晰明了,perfect! 贪吃蛇游戏主要包含几个程式:画蛇、画食物、蛇行走、蛇吃食物、蛇长身体、蛇撞墙dead、蛇自杀dead。 简约流程:界面初始化(画蛇、画食物)—- 蛇行走—- 蛇吃食物—- 蛇长身体—- 刷新显示页面 Let’s see the program。 在initSnake()这个函
[单片机]
51<font color='red'>单片机</font>的8x8点阵贪吃蛇
基于单片机的发动机尾气参数采集系统的设计
0 引言 为满足日趋严厉的排放法规,在车辆出厂或检测时需要对其发动机进行尾气温度、压力等参数进行检测,尾气参数也是反应发动机是否正常运行的一个重要指标,所以对柴油机车定期进行尾气温度的检测是非常必要的。本文开发了一套数据采集系统自动完成对尾气参数的采集与存储,对发动机尾气温度、压力参数进行采集、存储,由于性能以及所使用柴油品质的不同,不同型号的柴油机排气温度也不尽相同,所以我们采用在上位机存储不同型号柴油发动机正常运行时的尾气温度参数,实时采集到的温度与存储温度进行比较,当有较大的差别时,就需要对发动机进行性能的检修。 1 系统设计 本系统由上位机和下位机两部分组成,下位机进行尾气温度、压力的实时采集,并把采集到的数据传
[单片机]
基于<font color='red'>单片机</font>的发动机尾气参数采集系统的设计
51单片机程序——数码管动起来
#include reg52.h unsigned char code table ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};// 显示数值表0-9 void Delay(unsigned int t); void main (void) { unsigned char i; P1 = 0x01; while (1) { for(i=0;i 10;i++) //加入 for循环,表明for循环大括号中的程序循环执行10次 { P0=table ; //循环调用表中的数值
[单片机]
51单片机按键双击
//hnrain 改 //适用于CEPARK 51开发板 /***************************************************************************************************************** www.cepark.com 电子园 按键高阶攻略设计大赛 名称: 2*4矩阵键盘扫描 (状态机) 功能: 按键0单击时,点亮P0口的第1357个LED,按键1双击时,点亮P0口的2468个LED,按键2三击时,点亮P0口的所有的LED 按键按下的时间间隔小于200ms。 其他键按下时,LED状态不变 作者:
[单片机]
智能照明平台解决方案
  本文主要介绍了世强电讯基于瑞萨( Renesas )电子为照明应用贴身打造的的高性能78K0/Ix2系列 MCU 开发的 智能照明 平台解决方案,该方案在硬件、软件方面满足中高端照明产品智能化调光控制和组网的需求,具有高性能、低成本的优势。   一、 照明技术现状   随着照明工业的迅速发展,出现了越来越多的照明控制方案,电源的设计、灯的驱动电路、安全保护、管理接口等各方面都变得愈加灵活。目前,照明技术主要包括主流的荧光灯、LED灯和HID技术等,其广泛应用使电源驱动的拓扑结构差异非常大,从常见的Flyback、Buck、Boost以及延伸出来的其他结构都在被大量使用,产品设计是否采用先进的数字节能控制设计,是否支持fly
[单片机]
智能照明平台解决方案
ARM7单片机(学习ing)—(二)、中断控制编程—02
进行了MDK中断设置之后~~ 马上中断就可以用了~~ 要想了解的话,找EDA软件板块~~ 今天赶紧写完就哦了~~ 二、中断控制编程 二—(01)、计数器(通过三个外部中断来控制计数的加减或者清零~~) MDK2_1.c //------------------------------------------------------------------------------ //通过外部中断0、外部中断1、外部中断2实现加减计数器,并输出数码管显示 #include lpc210x.h #include delay.h #include bit.h #include macroandconst.h //-------
[单片机]
ARM7<font color='red'>单片机</font>(学习ing)—(二)、中断控制编程—02
使用STM32单片机点亮LED
有一人,登场于金庸先生的《神雕侠侣》,以大理段氏“一阳指”自成一派,武学修为登峰造极,“天下五绝”之一,号称“南帝”,他就是“一灯大师”。如今,武林中逐渐被遗忘的“一灯大师”,却活跃在另一个行业——嵌入式开发中。 传说,每一个成功的MCU(俗称单片机)开发组中,都有一名“一灯大师”,他精通所有开发板的点灯方法,对于企业引入的新开发板,总是勤学苦练,从点灯开始,快速掌握新开发板的编程要点,带领团队走向胜利。 成为“一灯大师”,离不开持续的修行,离不开对一招一式的勤学苦练。本文将讲解如何通过编程来控制STM32点亮一个LED。 学习环境: 1.软件:Keil5 2.硬件:STM32开发板(笔者使用信盈达公司的M4开发板,芯片型
[单片机]
使用STM32<font color='red'>单片机</font>点亮LED
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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