普中51单片机定时器数码管实现9999到0的倒计时C语言

51单片机定时器中断数码管实现9999到0的倒计时

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

#include "reg51.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//设置38译码器的输入端
u16 flag=9999,num=0;//设置数码管初值以及中断次数变量
void DelayMS(u8 i);
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void Timer0Init(void)		//中断初始化
{
	TMOD =0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值 1ms
	TF0 = 0;		//清除TF0标志
	ET0 = 1;      //定时/计数器T0中断允许开启
	EA  = 1;       //开启总中断
	TR0 = 1;		//定时器0开始计时
}
void   DIGdisplay()
{
	 u8 i;
	 for (i=0;i<4;i++){
	 	switch(i){
	 	    case(0): LSA = 0 ;LSB = 0 ; LSC = 0 ;P0 = smgduan[flag%10]      ;DelayMS(1);  break;	//第一位数码管		
			case(1): LSA = 1 ;LSB = 0 ; LSC = 0 ;P0 = smgduan[flag/10%10]   ;DelayMS(1);break; //第二位数码管
			case(2): LSA = 0 ;LSB = 1 ; LSC = 0 ;P0 = smgduan[flag/100%10]  ; DelayMS(1);break; //第三位数码管
			case(3): LSA = 1 ;LSB = 1 ; LSC = 0 ;P0 = smgduan[flag/1000]    ; DelayMS(1);break; // 第四位数码管  这里延时是为了提高数码管亮度
		}															 
		P0 =0X00;//消隐
	 }
}
 void time() interrupt 1//中断函数
	{
		TL0 = 0x18;		//设置定时初值
	   TH0 = 0xFC;		//设置定时初值  1ms
		num++;
		if(num==20)        /20ms则跳数字
		{
    		num=0;
    		flag--;
		}
  }
void main()
{	 
	Timer0Init();
	P0 = 0x00;
	while(1)
	{	
	  	DIGdisplay();
    }
}
void DelayMS(u8 i)
{
	//大约 1ms
	u8 j=100;
	while(i--)
	{
		while(j--);  
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值