单片机制作倒计时(共阴极)



//按下键盘中的S2键,暂停计时;按下S3键,继续计时
//晶振为11.0592MHz
#include<reg52.h>
#define  uchar  unsigned  char
  
sbit  du=P2^6;
sbit  we=P2^7;
sbit  S2=P3^0;
sbit  S3=P3^1;
  
//halt表示是否暂停,pp是50毫秒计时,m是1秒计时
unsigned  char  halt,j,k,pp,m,n;
//数码管段选表
uchar  code  leddata[]=  {  
                                0x3F,    //"0"
                                0x06,    //"1"
                                0x5B,    //"2"
                                0x4F,    //"3"
                                0x66,    //"4"
                                0x6D,    //"5"
                                0x7D,    //"6"
                                0x07,    //"7"
                                0x7F,    //"8"
                                0x6F,    //"9"
                                0x77,    //"A"
                                0x7C,    //"B"
                                0x39,    //"C"
                                0x5E,    //"D"
                                0x79,    //"E"
                                0x71,    //"F"
                                0x76,    //"H"
                                0x38,    //"L"
                                0x37,    //"n"
                                0x3E,    //"u"
                                0x73,    //"P"
                                0x5C,    //"o"
                                0x40,    //"-"
                                0x00,    //熄灭
                                0x80      //"."
};
  
void  Delay_Ms(unsigned  char  i)
{
    for(j=i;j>0;j--)
        for(k=125;k>0;k--);
}
  
void  display_m(uchar  Value_m)    //十分位,百分位显示函数
{
du  =  1;
P0  =  leddata[Value_m/10];    //显示十分位
du  =  0;
  
P0  =  0xff;  //清除段码
  
we  =  1;
P0  =  0xbf;  //第三位数码管
we  =  0;
Delay_Ms(5);
  
du  =  1;
P0  =  leddata[Value_m%10];    //显示百分位
du  =  0;
  
P0  =  0xff;  //清除段码
  
we  =  1;
P0  =  0x7f;  //第四位数码管  如果将P0=0xf6即从左至右让第四个数码管亮,则会引起第一个数码管一起闪亮,影响显示
we  =  0;  //这里显示为第五位数码管
Delay_Ms(5);
  
  
}
  
void    display_n(uchar  Value_n)    //十位,个位显示函数
{
du  =  1;
P0  =  leddata[Value_n/10];  //显示十位
du  =  0;
  
P0  =  0xff;  //清除段码
  
we  =  1;
P0  =  0xef;          //第一位数码管
we  =  0;
Delay_Ms(5);
  
  
du  =  1;
P0  =  leddata[Value_n%10]|0x80;    //显示个位和小数点
du  =  0;
  
P0  =  0xff;  //清除段码
  
we  =  1;
P0  =  0xdf;  //第二位数码管
we  =  0;
Delay_Ms(5);
  
}
  
void  keyscan()
{
if(S2==0)
Delay_Ms(10);
if(S2==0)  //暂停键按下
{
halt=1;
}
if(S3==0)
halt=0;
}
  
void  main()
{
TMOD=0x01;      //  方式1,为16位定时器/计数器
TH0=(65536-12902)/256;      //定时器T0初值计算
TL0=(65536-12902)%256;
ET0=1;      //允许T0溢出中断
        TR0=1;      //启动计数器计数的必要条件
EA=1;      //所有的中断请求被开放
pp  =  0;
m  =  0;
while(1)
{  
keyscan();      //执行按键扫描函数,是否有按键按下
if(halt==0)  //如果没有暂停
{
TR0=1;    //启动计数器进入中断
if(pp==1)  //10ms时间到    1*14ms=10ms,中断程序中pp++
{  pp=0;    //pp清0,等待下一次循环计数
m++;  //m是秒计时
                      if(m>99)      //计数10000后,m清0
{
m=0;
n++;
if(n>99)
{
n=0;
}        
}
}      
display_m(m);  display_n(n);  //输出m,n的值,然后再做十位个位数字的运算
}
else    //如果暂停了
TR0=0;    //则停止计数器计数,即停止计数器工作
display_m(m);display_n(n);      //仍然输出m,n的值,但数码管显示数字不变化
}
}
  
void  time0()  interrupt  1  //进入中断服务程序进行约14ms计时
{  //定时精度<14ms时,数码管无法正常显示,为显示结果,本程序取14ms近似于10ms
TH0=(65536-12902)/256;
TL0=(65536-12902)%256;
pp++;
}


方法2

#include<reg52.h>            //没有小灯
#include<math.h>                //其中调用了数学函数
sbit    duan=P2^6;
sbit    wei=P2^7;
unsigned    char   smg[]={                //数码管
                0x3F,    //"0"
                0x06,    //"1"
            0x5B,    //"2"
                0x4F,    //"3"
                0x66,    //"4"
                0x6D,    //"5"
                0x7D,    //"6"
                0x07,    //"7"
                0x7F,    //"8"
                0x6F,    //"9"
                0x77,    //"A"
                0x7C,    //"B"
                0x39,    //"C"
                0x5E,    //"D"
                0x79,    //"E"
                0x71,    //"F"
                0x76,    //"H"
                0x38,    //"L"
                0x37,    //"n"
                0x3E,    //"u"
                0x73,    //"P"
                0x5C,    //"o"
                0x40,    //"-"
                0x00,    //熄灭
                0x00    //自定义
};         //数组后面有分号!!!!别忘记了
delay(unsigned    int    xms){           //设置一个delay函数(延时)
        unsigned    int    i,j;       
    for(i=xms;i>0;i--)
        for(j=112;j>0;j--);
}
void    main(){      //void是没有返回值的作用  可有可无  
        while(1){        //死循环 让其一直运行
                unsigned    int    i;
                unsigned    int    j;
unsigned    int    z=-1;
                for(j=0;j<6;j++){                
                for(i=0;i<2500;i++){            
        P0=smg[j];        //这边是在判断十位数
        duan=1;              //段选
        duan=0;
        P0=0xbf;			//	1011 1111
        wei=1;
        wei=0;
        delay(2);
        P0=smg[i/250];    //这边是在判断个位数	  
        duan=1;
        duan=0;
        P0=0x7f;			    //0111  1111		
        wei=1;
        wei=0;
        if(i%250==0){
                z++;
                P1=255-z;    //控制流水灯,可直接用十进制来控制流水灯
        }
        delay(2);            //少于3秒的延时 几乎看不见
                }
                }
        }
}

备注:这个文章是在我看了别人的代码之后做的归纳(不是原创)

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值