延时程序

[复制链接]
98|11
 楼主 | 2018-7-10 18:24 | 显示全部楼层 |阅读模式
一个小时 十个小时 一天甚至更长
| 2018-7-10 18:28 | 显示全部楼层
用定时器编写就能实现。
| 2018-7-10 18:30 | 显示全部楼层
中断里边定义个变量

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;
         }
}
| 2018-7-10 18:33 | 显示全部楼层

这个比较简单,就是在计时器中断里定义几个全局变量
| 2018-7-10 18:35 | 显示全部楼层
每次中断加一,一直到你想要的时间就跳出来
 楼主 | 2018-7-10 18:37 | 显示全部楼层
越看越晕
| 2018-7-10 18:39 | 显示全部楼层
;***************************************
;*******定时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
| 2018-7-10 18:42 | 显示全部楼层
看看这个
| 2018-7-10 18:44 | 显示全部楼层
时间程序要么是定时器,要么是延时程序
| 2018-7-10 18:47 | 显示全部楼层
但是时间太长,使用延时不太好
| 2018-7-10 18:49 | 显示全部楼层
硬件定是中断加软件计数变量即可,C还是汇编都一样
 楼主 | 2018-7-10 18:51 | 显示全部楼层
好的,我明天去单位试一下,多谢各位大侠了哈,结贴了先
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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