新手求助 51

[复制链接]
801|7
手机看帖
扫描二维码
随时随地手机跟帖
javachen|  楼主 | 2019-12-5 17:22 | 显示全部楼层 |阅读模式
1  长时间延时  20S 在20S内i/o输出 根据条件判断,输出高 低 以及脉冲  
2 pwm周期 为500us  
那么问题来了  要是用一个定时器来做的话  65535 以内根本就无法延时到20S

void Timer0Init()
{     //T1设置
        TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

        TH0=0XFF;        //给定时器赋初值,定时250US
        TL0=0X06;
        ET0=1;//打开定时器0中断允许
        TR0=1;//打开定时器       
        EA=1;//打开总中断
}
用32位计数的话时间感觉相差好大  ,初学者 求大神解答

使用特权

评论回复

相关帖子

dirtwillfly| | 2019-12-5 20:41 | 显示全部楼层
没看懂,你的定时器代码是给pwm定时的。
20s是用的变量记录pwm定时器的数量吗?如果是,用int型的变量就可以

使用特权

评论回复
hobbye501| | 2019-12-6 08:44 | 显示全部楼层
不是还有长整型嘛  long int

使用特权

评论回复
javachen|  楼主 | 2019-12-6 10:17 | 显示全部楼层
hobbye501 发表于 2019-12-6 08:44
不是还有长整型嘛  long int

void Timer0() interrupt 1
{
        static u32 m;
        TH0=0XFF;        //给定时器赋初值,定时250Us
        TL0=0X06;
        if(m>=24000)
        {  
                m++;                        //继续计时
                if(m>=68000)
                {
                        m=68001;        //给i赋值,防止溢出变0
                        if(FK==1)                //15s后判断P2.1输入
                        {
                           LED=~LED;        //高电平脉冲保持        
                        }else{
                           LED = 0;        //低电平脉冲停止
                             }
                }else{

                        LED=~LED;        //6-15s,脉冲保持
                     }     
        }else{  
                m++;
                if(m<=12000)
                {
                        LED=0;        
                }        
        
                if(m>12000&&m<24000)
                {   
                        LED=1;        
                }
             }
                        
}
这个m到68000时为什么是20S 而不是17s

使用特权

评论回复
yueguang3048| | 2019-12-20 13:38 | 显示全部楼层
68000*250=1700 0000
猜测程序运行时间,累积出来的3S吧。定时器+多标志位多好

使用特权

评论回复
tianxj01| | 2019-12-20 15:05 | 显示全部楼层
不想猜测你输入是什么,目的是什么,仅就定时器而言,如果你65535最大计数达不到要求,最简单的办法就是再设置一个计数变量。每当到定时器溢出,该计数变量+1,直到你需要的值,启动定时动作,用一个16位变量,你可以把定时器最大定时时间延长65536倍。

使用特权

评论回复
XZL| | 2019-12-20 16:04 | 显示全部楼层
定时器内部嵌套计数器。定时器最大定时65535,嵌套一个8位的计数器,就是255*65536;
同理,嵌套16bit的,就是0XFFFF*65536

使用特权

评论回复
叶春勇| | 2019-12-26 09:33 | 显示全部楼层
先产生10ms的信号,然后产生秒信号。
m=(m<4000)?m+1:0;
if(m==0) second_acc++;  //产生秒信号
if((m%400)==0) 100ms_acc++; //产生100ms信号
有了这些时基,就可以去产生长延时的程序了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

19

帖子

0

粉丝