51基础——数码管四位倒计时

本文详细介绍了使用单片机实现四位数码管倒计时的程序,包括定时器配置、数码管显示函数、中断服务函数等关键部分。通过变量更新和数码管位操作,实现实时显示倒计时数值,并设有蜂鸣器提示和LED闪烁功能。程序逻辑清晰,适合作为单片机初学者的实践案例。

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

#include <reg52.h>
#define wu P0  //显示数字
#define wei  P2  //4个显示屏
#define uchar unsigned char
#define uint  unsigned int
 sbit led1=P1^0;
uchar num;
uint m=0,s=1598;//四位数要用int型
uchar a,b,c,d,k=0,j,k;
sbit fm=P2^3;//定义蜂鸣器
unsigned char code weiyu[]={0x1f,0x2f,0x4f,0x8f}; //代码与P2对应做位处理,显示相应的位
/*可改成sbit wei1=P2^4
        sbit wei2=P2^5
        sbit wei3=P2^6
        sbit wei4=P2^7
*/

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
           			 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极数码管码表
 
void delay(unsigned char xms)//延迟方法
{
  for(j=xms;j>0;j--)
     for(k=125;k>0;k--);
}
 
void display1(uchar wei1,uchar shu)    //数码管显示
{
  wei=0xff;//关掉所有:1111 1111
  P0=table[shu];
  wei=wei&weiyu[wei1];	//1000 1111 & 1111 1111
  delay(5);
}
 
void display(uchar a,uchar b,uchar c,uchar d)	//  一次显示三位数码管方法
{
 display1(3,a);		//显示个位数字
 display1(2,b);		//显示十位数字
 display1(1,c);		//显示百位数字
 display1(0,d);		//显示千位
}
 
void time_init()
{
	TMOD=0x01;//定时器T0选择工作方式1
	ET0=1;//打开定时器T0中断
	TR0=1;//启动定时器T0
	EA=1;//全局中断打开
	TH0=0x4c;//设置初始值,定时50ms
	TL0=0x00;
}


void main()
 {
  time_init();//调用定时器方法
	 
 while(1)//无限循环
 {
//数字一秒间隔 递减:
  if(m==20)       	 //20*50ms=1000ms=1s
  {
   m=0;		//m计数等于20次(1秒)后重新计零
   s--;		//一秒后数字倒数一位
  }

    a=s%1000%100%10;      	//个位,
    b=s%1000%100/10; 		//十分位
    c=s%1000/100 ;			//百分位
    d=s/1000;				//千分位

  display(a,b,c,d);//显示三位数

  if(s==0)//如果倒计时结束
  {
  TR0=0;//关闭定时器T0
  fm=0;//蜂鸣器响起
  }
  
  if(num==40)//小灯间隔40*50ms=2000ms=2s闪
	{	
		num=0;
		
		led1=~led1;
	}
  
  } 
 }										 
void TO_TIMER () interrupt 1//定时器中断,处理定时器函数
 {
  /*TH0=(65536-45872)/256;     //晶振为11.052Hz
  TL0=(65536-45872)%256;   */
	 TH0=0x4c;//设置初始值,定时50ms
	 TL0=0x00;
  	m++; 	//数字计时
	 
	num++;	//小灯计时
	
 }

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值