搜索
bottom↓
回复: 5

单片机倒计时程序修改,懂的给个思路!

[复制链接]

出0入0汤圆

发表于 2013-2-18 01:20:54 | 显示全部楼层 |阅读模式
我用网上的程序修改了一个倒计时程序,但是我的单位是秒倒计时的,假如倒计时5分钟时间,我的程序是从300秒开始慢慢倒计时下来的,我现在想把程序修改为“时”“分”“秒”,就像秒表那种,请懂的人给个思路,指点一二,谢谢!


void Timer0(void)     //定时器定时50毫秒
        {
         if(TF0==1)
                 {
                          t++;
                          TH0=0x3C;
                          TL0=0xB0;
                          TF0=0;
                 }                
        }

void data_tim(void)
        {
                Timer0();
                if (t==20)    // 计数20次为1秒
                        {
                                 a--;
                                t=0;
                                if(a==0)
                                {
                                        a=300;
                                }
                        }
        }
void data_in(void)     //  分离各位数据
        {
         HG=a/10;
         data_G =a%10;
         HS=HG/10;
              data_S =HG%10;
         HB=HS/10;
         data_B =HS%10;
         HQ=HB/10;
         data_Q =HB%10;
void display(void)     // 显示
        {
                 P2=0x20;
                 P0=tab[data_G];
                 delay(1);
                 P2=0x10;
                 P0=tab[data_S];
                 delay(1);
                 P2=0x08;
                 P0=tab[data_B];
                 delay(1);
                 P2=0x04;
                 P0=tab[data_Q];
void main(void)
   {
         while(1)
                 {      
                                         T0_init();
                       data_tim();
                       data_in();
                       display();
                }
        }

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2013-2-18 01:36:41 | 显示全部楼层
有点思路了,刚百度了下,借鉴一下别人的程序,由于复制粘贴有问题,就截图一点看看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-2-18 16:25:56 | 显示全部楼层
定时器还是用中断 比较好

出0入0汤圆

 楼主| 发表于 2013-2-18 19:01:18 | 显示全部楼层
william_rain 发表于 2013-2-18 16:25
定时器还是用中断 比较好

这位大哥帮忙看看,还是不行,我想把“时”“分”“秒”分开,秒表那种,现在还是一秒一秒倒计时的



#include <reg52.h>
#include <intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long int uint32;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;

uint8 tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                         0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

uint32  key,HG,HS,HB,HQ,HW,HSW,HC,counter,hour,min,sec,
            hour_H,hour_L,min_H,min_L,sec_H,sec_L,b,c,t;
                                                      
void delay(uint8 k)
        {
         uint8 m,n;
         for(m=0;m<k;m++)
          
           {
             for(n=0;n<120;n++);
           }
        }

void display_init(void)
        {
                 P2=0xFF;
                 P0=tab[0];
                 delay(1);
        }

void display(void)
        {
                 P2=0x10;
                 P0=tab[sec_H];
                 delay(1);
                 P2=0x20;
                 P0=tab[sec_L];
                 delay(1);
                 P2=0x04;
                 P0=tab[min_H];
                 delay(1);
                 P2=0x08;
                 P0=tab[min_L];
                 delay(1);
                 P2=0x01;
                 P0=tab[hour_H];
                 delay(1);
                 P2=0x02;
                 P0=tab[hour_L];
                 delay(1);
        }

void Timer0(void)
        {
         if(TF0==1)
                 {
                          t++;
                          TH0=0x3C;
                          TL0=0xB0;
                          TF0=0;
                 }                
        }

void data_init(void)
        {
                hour=counter/10000;
                HC = counter%10000;
                min=HC/100;
                sec=HC%100;
                hour_H=hour/10;
            hour_L=hour%10;
                min_H = min/10;
                min_L = min%10;
                sec_H = sec/10;
                sec_L = sec%10;
        }
void data_tim(void)
        {
                Timer0();
                if (t==20)
                        {
                                 counter--;

                                t=0;
                                if(counter==0)
                                {
                                        counter=b;   
                                }                                  
                        }
        }

///////////////////////////////////////////////////////////////////////////////////////////////

void data_in(void)                //有问题部分,好像没起作用
        {
          sec--;
          if(sec==0)
                {
                   sec=59;
                   min--;
                   if(min==0)
                        {
                            min=59;
                            hour--;
                            if(hour==0)
                                {
                                     hour=26;////先随便写了个数字         
                                }
                        }
                }
        }

/////////////////////////////////////////////////////////////////////////////////////////
void T0_init(void)
        {
         TMOD=0x01;
         TH0=0x3C;
         TL0=0xB0;
         ET0=0;
         TR0=1;
         EA=0;
        }

void main(void)
   {
         F0:
                 counter=b=0;
       
                display_init();
                 
                if(key1 == 0)            
                 {
                     delay(20) ;         
                     if(key1 == 0)      
                             {
                         key = 1 ;         
                             }
                     else
                                        {
                             key = 0;        
                                         }
                     while(key1 == 0) ;   
             }
                 
                         if(key2 == 0)            
                 {
                     delay(20) ;  
                                
                     if(key2 == 0)      
                             {
                         key = 2;         
                             }
                     else
                                        {
                             key = 0;      
                                         }
                     while(key2 == 0) ;   
             }

                 if(key3 == 0)            
                 {
                     delay(20) ;
                                  
                     if(key3 == 0)     
                             {
                         key = 3;         
                             }
                     else
                                        {
                             key = 0;        
                                         }
                     while(key3 == 0) ;   
             }

          switch (key)
                  {
                        case 1:counter=b=16;break;

                        case 2:counter=b=120;break;

                        case 3:counter=b=654321;break;

                        default:goto F0;
                }

         T0_init();

         while(1)
                 {
                    data_init();
                        data_tim();
                        data_in();
                        display();
                }
        }       

//////////////////END////////////////////

出0入0汤圆

 楼主| 发表于 2013-2-18 19:41:32 | 显示全部楼层
william_rain 发表于 2013-2-18 16:25
定时器还是用中断 比较好

好了,刚把秒只是位分开了,没有换算成分钟和小时,改成这样就好了
hour=counter/3600;
HC = counter%3600;

出0入0汤圆

发表于 2013-2-19 00:57:28 | 显示全部楼层
用%和/号啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 12:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表