怎么编写时间延时程序

[复制链接]
1871|13
 楼主| 宋倩2010 发表于 2013-11-10 10:22 | 显示全部楼层 |阅读模式
如一个小时 十个小时  一天甚至更长
kangzj 发表于 2013-11-10 10:23 | 显示全部楼层
用定时器编写就能实现。
houcs 发表于 2013-11-10 10:24 | 显示全部楼层
中断里边定义个变量

ulong Counter = 0,DelayTime;
sbit TimeFlag = 0;
void Timer0(void) interrupt 1
{         
          Counter++;
          if(Counter == DelayTime)TimeFlag = 1;
}

delay(ulong i)
{
         EA = 0;
         TimeFlag = 0;
         DelayTime = Counter+i+1;
         EA = 1;
}

void main(void)
{
        delay(10);
        while(1)
        {
               ..............
               ..............
               if(TimeFlag)break;
        }
}
liuzaiy 发表于 2013-11-10 10:24 | 显示全部楼层
这个比较简单,就是在计时器中断里定义几个全局变量
yinxiangh 发表于 2013-11-10 10:25 | 显示全部楼层
每次中断加一,一直到你想要的时间就跳出来
小小猫咪 发表于 2013-11-10 10:25 | 显示全部楼层
越看越晕
pangb 发表于 2013-11-10 10:26 | 显示全部楼层
;***************************************
;*******定时0中断(0.5秒中断一次)********
t0_isr:   
        mov     acc_bak,a
         mov     a,status
         mov     status_bak,a            
         inc       half_second
         mov     a,half_second
         sub      a,2
         snz      c                      ;到了1秒吗?
         jmp     t0_ret                 ;没到,则退出
         clr       half_second                                   
         set      second_change_b        ;1S时间变化标志位
         inc       rtc_second             ;秒变量加一
         mov    a,60
         xor     a,rtc_second
         snz     z                      ;到了1minute吗?
         jmp    t0_ret
         clr      rtc_second             ;清1秒变量
         set     minute_change_b        ;1minute时间变化标志位
         inc     rtc_minute             ;分钟变量加一
         mov    a,60
         xor    a,rtc_minute
         snz    z                      ;到了1hour吗?               
         jmp    t0_ret
         clr      rtc_minute             ;清分钟变量
         inc      rtc_hour               ;小时变量加一
         mov    a,24
         xor    a,rtc_hour
         snz    z
         jmp    t0_ret
         clr     rtc_hour
         inc     rtc_week              ;星期变量加一
         mov    a,8
         xor    a,rtc_week
         snz    z                     ;到了星期天了没有?
         jmp    RTC_NEXT              ;没到,则跳到RTC_NEXT处检查其它时间变量
         mov    a,1
         mov    rtc_week,a            ;到了,则变为星期一
RTC_NEXT:
        inc     rtc_day               ;日期变量加一
        mov     a,rtc_month           ;查表看当前月份一共有多少天
        mov     disp_ram,a
        dec     rtc_month             ;因为1月~12月,而表中(地址是F00H)是从0~11,故TBLP减一
        mov     a,rtc_month
        add     a,dig_month_tab
        mov     tblp,a
        tabrdl  L_day
        mov     a,disp_ram
        mov     rtc_month,a           ;再保存回到rtc_month
        mov     a,28
        xor     a,L_day
        snz     z                     ;当月是28天的吗?  
        jmp     RTC_NEXT1             ;不是,则跳到RTC_NEXT1处计算,看是否是到了当前月份的最后一天
        mov     a,rtc_year            ;是的,则判断是否是平年还是闰年
        and     a,03h
        snz     z                     ;是闰年吗?
                                      ;闰年:能被4整除,2月为29天,当年为366天
                                      ;平年:3个平年后,就变为闰年,2月为28天,当年为365天
        
       jmp     RTC_NEXT1             ;不是,是平年,则跳到RTC_NEXT1处计算,看是否是到了当前月份的最后一天
        mov     a,29
        mov     L_day,a               ;是闰年的话,则2月为29天
RTC_NEXT1:
        mov     a,L_day
        sub     a,rtc_day
        sz      c                     ;到了当前月份的最后一天吗?
        jmp     t0_ret                ;不是,则直接退出定时中断子程序
        mov     a,1
        mov     rtc_day,a             ;是的话,;就变为1号
        
       inc     rtc_month             ;月变量加一
        mov     a,13
        xor     a,rtc_month
        snz     z                     ;到了12月份吗?
        jmp     t0_ret                ;没到,则直接退出定时中断子程序
        mov     a,1
        mov     rtc_month,a           ;到了,则月份变为1月
        
       inc      rtc_year              ;年变量加一
        mov     a,100               
        xor     a,rtc_year
        snz     z                     ;到了2100年吗?
        jmp     t0_ret                ;没到,则直接退出定时中断子程序
        clr     rtc_year              ;最大计算到2100年
   
t0_ret:      
         mov    a,status_bak
        mov     status,a
       mov     a,acc_bak  
       reti

评分

参与人数 1威望 +3 收起 理由
gcxzhz + 3 很给力!

查看全部评分

pangb 发表于 2013-11-10 10:27 | 显示全部楼层
看看这个
ousj 发表于 2013-11-10 10:28 | 显示全部楼层
时间程序要么是定时器,要么是延时程序
ousj 发表于 2013-11-10 10:28 | 显示全部楼层
但是时间太长,使用延时不太好
小小猫咪 发表于 2013-11-10 10:29 | 显示全部楼层
嗯,我试试~
小小猫咪 发表于 2013-11-10 10:29 | 显示全部楼层
那就结贴了,大家晚安
abbccc308 发表于 2013-11-10 11:25 | 显示全部楼层
LS和LZ是同一个人
liangzhi213 发表于 2013-11-10 15:31 | 显示全部楼层
哪里有LS和LZ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

322

主题

3217

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部