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



//按下键盘中的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
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!要实现51个单片机的管理和计时功能,您可以考虑使用C语言编写代码。 首先,您需要定义一个结构体来存储每个单片机的信息,包括单片机编号、名称、状态等信息。然后,您可以使用数组来存储所有单片机的信息。 接下来,您可以编写代码来实现计时功能。您可以使用系统时钟来记录时间,并使用定时器来触发计时器中断。当计时器中断发生时,您可以更新相应单片机的计时器值。 另外,您还需要编写代码来处理单片机的状态变化。您可以使用按键、串口通信等方式来与单片机进行交互,然后根据相应的操作来更新单片机的状态。 最后,您可以编写代码来实现单片机信息的显示和管理。您可以使用LCD屏幕或者LED灯来显示单片机的状态和计时器值,并可以使用按键来选择相应的单片机进行操作。 希望这些信息能对您有所帮助! ### 回答2: 要用C语言在51单片机上实现数码管倒计时功能,可以按照以下步骤进行编程。 首先,需要在程序中定义一个变量用于存储倒计时的时间,比如定义一个整型变量time,用于存储剩余的秒数。 接着,在主函数中初始化51单片机的端口,将数码管的管脚接到对应的IO口上。 然后,利用定时器中断来实现倒计时功能。选择一个定时器,如定时器0,并设置其预分频系数,以控制中断的频率。比如设置为1ms产生一次中断。 在中断服务程序中,先将时间time减1,然后将time的值转换为显示在数码管上的数码格式,比如将time的十位数存储在一个变量ten中,个位数存储在一个变量unit中。 接着,编写将ten和unit的值分别显示在数码管的代码。将ten和unit的值作为参数传递给函数,函数根据传入的参数分别在对应的数码管上显示相应的数字。 最后,在主函数中启用定时器中断,并利用循环不断检测time的值是否为0。如果time等于0,则在数码管上显示倒计时结束的提示信息,并停止定时器中断。 通过以上步骤,就可以在51单片机上实现数码管倒计时功能了。编译、烧录并运行程序后,数码管将会不断显示倒计时的时间,并按照设定的频率进行更新,直到倒计时结束。 ### 回答3: 要用C语言写一个51单片机数码管倒计时,首先需要了解51单片机的基本原理和功能。 51单片机是一种常用的8位微处理器,主要用于嵌入式系统和电子产品中。在编程上,可以使用C语言来进行开发。数码管倒计时是一种常见的应用,用于显示倒计时时间。 首先,需要在51单片机上连接数码管,并且了解数码管的显示原理和控制方式。51单片机可以通过IO口控制数码管的每个段显示。可以根据需要选择不同的数码管显示方式,如阴极阳极。 接下来,需要编写C语言程序来实现倒计时功能。首先需要定义倒计时的时间长度,并进行初始化设置。然后使用定时器来生成中断信号,每次中断时更新计时器的值。在中断服务程序中,将计时器的值转换为数码管的控制信号,并发送到数码管上进行显示。 在倒计时过程中,程序需要不断更新计时器的值,并将其转换为数码管显示的格式。当倒计时达到0时,可以发出提示音或其他操作来提醒倒计时结束。 最后,需要对程序进行调试和测试,确保倒计时功能的正常运行。可以通过连接调试器、使用仿真器或在实际硬件上进行测试来验证程序的正确性。 总结起来,使用C语言编写51单片机数码管倒计时的过程主要包括硬件连接、了解数码管原理、编写C语言程序、调试和测试等步骤。通过这些步骤,可以实现一个简单而实用的数码管倒计时功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值