C51--Task06 定时器实验

一、60s倒计时

具体任务:

设计一个60秒倒计时程序。要求:能够在数码管上显示倒计时,并且在倒计时为0时蜂鸣器鸣叫,按下KEY1时能够重新开始计时。

代码:

#include <reg52.h>

//位定义外部硬件
sbit SegmentG3 = P2^1;
sbit SegmentG4 = P2^0;
sbit BEEP = P1^0;

//特殊功能寄存器定义
sfr ISP_CONTR=0xE7;//STC单片机软复位功能步骤1

//宏定义蜂鸣器开关指令
#define BEEP_ON BEEP = 0;
#define BEEP_OFF BEEP = 1;

//定义显示数字0~9
static unsigned char s_arrNumber[] = 
{0x03, 0x9F, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09};


//延迟函数
static void DelayNms(int nms)
{
  unsigned int i,j;
  for(i=0;i<nms;i++)
  {
    for(j=0;j<123;j++)
    {
      
    }
  }
}


//中断配置函数
static void InitInterrupt(void)
{ 
	//(用于按下KEY1归零)
	IT0 = 1; //外部中断0下降沿触发
  EX0 = 1; //外部中断0中断允许
	//用于计时器
  ET0 = 1; //定时器0中断允许
	//总大门
  EA = 1;  //总中断允许
	
	PX0 = 1; //外部中断0优先级高于定时器0

}


//定时器0配置函数
static void InitTimer0()
{
  TMOD = 0x01;//工作模式1
  TH0 = 0xFC; //计数初值高8位(1ms溢出累计1000)
  TL0 = 0x18; //计数初值高8位
  TR0 = 1;    //打开定时器0
}


//主函数
int main(void)
{
  InitInterrupt();
  InitTimer0();
  while(1)
  {
    
  }
}


//外部中断服务函数
void External0_Handler()interrupt 0
{
 ISP_CONTR |=0x20;  //STC单片机软复位功能步骤2
}



//定时器0中断服务函数
void Timer0_Handler()interrupt 1
{
  static unsigned int s_iCounter;//定义计数变量
  static unsigned int i=0;       //显示个位i
  static unsigned int j=6;       //显示十位j
  TH0 = 0xFC;                    //重新设置计数初值高8位
  TL0 = 0x18;                    //重新设置计数初值低8位,1ms后溢出
  
  s_iCounter++;      //每进行一次中断,计数变量+1
  if(s_iCounter>=100)//计数变量到1000即1000ms=1s
   {
    s_iCounter = 0;//计数变量置零
		
		//执行任务
    i--;
    if(-1==i)
    {
      i=9;
      j--;
    }
  }
  
  P0 = s_arrNumber[i];
  SegmentG4 = 0;
  DelayNms(5);
  SegmentG4 = 1;
  P0 = s_arrNumber[j];
  SegmentG3 = 0;
  DelayNms(5);
  SegmentG3 = 1;
  
  while((0==i)&(0==j))
  {
    BEEP_ON;
  }
}


二、按键按下时间测量

具体任务:

能够在数码管上显示KEY1按下的 时间,单位为ms。(任务提示:利用TRO位控制定时器0的运行,当KEY,按下时定时器0开始运行,KEY;弹起时停止,计算其中的时间间隔)

代码:

#include <reg52.h>

//位定义
sbit SegmentG1 = P2^3;
sbit SegmentG2 = P2^2;
sbit SegmentG3 = P2^1;
sbit SegmentG4 = P2^0;
sbit KEY1 = P3^2;

//定义0~9
static unsigned char s_arrNumber[]={0x03, 0x9F, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09};

//延时函数
static void DelayNms(int nms)
{
  unsigned int i,j;
  for(i=0;i<nms;i++)
  {
    for(j=0;j<123;j++)
    {
      
    }
  }
}

//中断配置函数
static void InitInterrupt(void)
{
  ET0 = 1; //定时器0中断允许
  EA = 1;  //总中断允许
}

//定时器0配置函数(1ms溢出)(题中要求以ms计,所以直接ms而且不用计数变量累加)
static void InitTimer0()
{
  TMOD = 0x01;
  TH0 = 0xFC;
  TL0 = 0x18;
  TR0 = 1;
}

//主函数
void main()
{
  if(1==KEY1)//若没有被按下
  {
    TR0 = 0; //不启动定时器
  }
  InitInterrupt();
  InitTimer0();
  while(1)
  {  
  
  }
}

//定时器0中断服务函数
void Timer0_Handler()interrupt 1
{

  static unsigned int a,b,i,j= 0; //进位符(此处必须要加static,定义静态变量!要不然不对)
  TH0 = 0xFC;//重置计数初值
  TL0 = 0x18;
  
   i++;
  if(10==i)
  {
    i=0;
    j++;
  }
  else if(10==j)
  {
    j=0;
    b++;
  }
  else if(10==b)
  {
    b=0;
    a++;
  }
  
		
  while(1==KEY1)
  {
   P0 = s_arrNumber[i];
   SegmentG4 = 0;
   DelayNms(5);
   SegmentG4 = 1;
   P0 = s_arrNumber[j];
   SegmentG3 = 0;
   DelayNms(5);
   SegmentG3 = 1;
   P0 = s_arrNumber[b];
   SegmentG2 = 0;
   DelayNms(5);
   SegmentG2 = 1;
   P0 = s_arrNumber[a];
   SegmentG1 = 0;
   DelayNms(5);
   SegmentG1 = 1;
  }
}

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C51单片机是一种被广泛应用于嵌入式系统中的单片机,它拥有强大的定时器功能和控制能力。定时器的作用是为系统提供准确的时间基准,而数码管则是一种常见的显示器件,可以用来显示数字或其他字符。 在C51单片机上使用定时器驱动数码管的过程分为以下几个步骤: 1. 配置定时器:首先需要配置定时器的工作模式和计数器的初始值。C51单片机通常会提供相关的寄存器用于设置定时器的参数。 2. 中断设置:为了控制定时器的运行以及定时器溢出时数码管的刷新,通常需要使用中断机制。需要设置相关的中断向量、使能中断以及编写中断服务函数。 3. 时钟源选择:C51单片机通常提供多个时钟源,可以选择不同的时钟源作为定时器的输入信号。根据具体情况选择合适的时钟源,以及设置频率分频系数。 4. 数码管驱动:在定时器中断服务函数中,可以通过控制数码管的引脚电平来实现数码管的刷新。根据需要,可以使用四位数码管、七段数码管或其他类型的数码管。 5. 数字显示:通过在定时器中断服务函数中编写相应的逻辑代码,可以将要显示的数字或其他字符通过设置数码管引脚电平实现。 最后,进行编译、烧录等操作,使程序C51单片机上运行,实现定时器驱动数码管显示功能。这样,就可以根据定时器的计时精度和频率要求,实现数码管的准确显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值