单片机设计0~99.99秒的计时器

该博客介绍了使用51单片机通过定时器实现毫秒和秒的计数系统,包括开始、停止和复位功能。代码展示了如何配置定时器、中断服务程序以及根据按键状态更新显示。此外,还特别提到当学号后四位4104时,特定秒数和毫秒数会触发LED状态变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述
在这里插入图片描述

我的学号后四位是4104对应 秒为41 毫秒为04

电路图如下:

在这里插入图片描述

代码如下:

#include <REGX51.H>
unsigned char seg []={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char ms,s,key_mod;
unsigned int cp,cp1;
sbit key_begin = P1^4;
sbit key_stop = P1^5;
sbit key_reset = P1^6;
sbit led = P1^3;
void time0_init(void){
	 TMOD =0x01;   //计时器模式的控制寄存器,Time0工作在方式1
	 TL0 = (65536 - 5000)%256;  // TL0预制,60536的低八位
	 TH0 = (65536 - 5000)/256;  // TH0预制,60536的高八位
	 EA = 1;                    //打开开关总中断
	 ET0 = 1;   //设置中断允许寄存器IE中ET0的   开启中断开关
	 TR0 = 1;    //开始计数
}

//每次中断,都会不间断的实行这个中断服务程序
void time0_isr(void) interrupt 1{
	TMOD = 0x01;
	TL0 = (65536-2000)%256;
	TH0 = (65536-2000)/256;
	cp++;
	//设置时间的范围,然后选择工作方式

	if(cp >=250){
	  cp = 0 ;
	  //key_stop =0的时候让ms停止计数
	  if(key_mod!=2){
	  ms ++;		  
	  }
	}
	if(ms >= 99){
	  ms = 0;
	  s++;
	}
	if(s >= 99){
	s =0;
	}
	//需要有一个程序进行不断的刷新

	//刚开始定义key_mod的时候是没有赋值的,没有赋值默认为0
	if(key_mod==0){
	   //需要给所有的表进行一个重置的操作
	   ms,s=0;cp=0;
	   cp1++;
	   switch(cp1){
	   //这个是控制灯管闪烁的
	   //毫秒有两位,秒有两位
	   //case 0 显示毫秒最后一位
	   case	1: P3 = 0x01; P2 = seg[ms%10]; break;
	   case	2: P3 = 0x02; P2 = seg[ms/10];	break;
	   case	3: P3 = 0x04; P2 = seg[s%10];	break;
	   case	4: P3 = 0x08; P2 = seg[s/10];	 break;
	   }
	    if(cp1>=5){
	 	  cp1 = 0;
	   }
	}

	if(key_mod==1){
	   cp1++;
	  	   switch(cp1){
		   //应该加break语句
	   case	1: P3 = 0x01; P2 = seg[ms%10]; break;
	   case	2: P3 = 0x02; P2 = seg[ms/10];	break;
	   case	3: P3 = 0x04; P2 = seg[s%10];	break;
	   case	4: P3 = 0x08; P2 = seg[s/10];	 break;
	   }
	    if(cp1>=5){
	 	  cp1 = 0;
	   }
	   if(ms==4&&s==41){
	    led = 1;
	   }else{
	   led = 0;
	   }

	}

	if(key_mod==2){
	   cp1++;
	  	   switch(cp1){
	   case	1: P3 = 0x01; P2 = seg[ms%10]; break;
	   case	2: P3 = 0x02; P2 = seg[ms/10];	break;
	   case	3: P3 = 0x04; P2 = seg[s%10];	break;
	   case	4: P3 = 0x08; P2 = seg[s/10];	 break;
	   }
	    if(cp1>=5){
	 	  cp1 = 0;
	   }
	}
	if(key_mod==3){
		ms=4; s= 41;
	   cp1++;
	  	   switch(cp1){
	   case	1: P3 = 0x01; P2 = seg[ms%10]; break;
	   case	2: P3 = 0x02; P2 = seg[ms/10];	break;
	   case	3: P3 = 0x04; P2 = seg[s%10];	break;
	   case	4: P3 = 0x08; P2 = seg[s/10];	 break;
	   }
	    if(cp1>=5){
	 	  cp1 = 0;
	   }
	}

}
void key(void){
//key_start =0 表示key_start按下去了
  if(key_begin == 0){
    key_mod = 1;
  }
  if(key_stop == 0){
    key_mod = 2;
  }
  if(key_reset == 0){
    key_mod = 3;
  }
}

void main(void){
  time0_init();

  while(1)
  key();
}

运行图如下:

开始计数

在这里插入图片描述

停止计数

在这里插入图片描述

复位

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值