打印
[AVR单片机]

关于使用定时器做延时函数的使用方法

[复制链接]
2102|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SD10A|  楼主 | 2015-2-10 18:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


看了大师关于定时器的使用方法,感觉有很多不明白的地方向大家请教。
原帖,https://bbs.21ic.com/forum.php?mo ... p;page=1#pid1984243
原来的程序
void Time0Isr(void) interrupt 1

{
    TH0  =    0xfc ;            //定时器重新赋初值
    TL0  =  0x66 ;
    g_bSystemTime1Ms = 1 ;    //1MS时标标志位置位
}


void LedStateChange(void)
{
    if(g_bSystemTime1Ms)            //系统1MS时标到
    {
        g_bSystemTime1Ms = 0 ;
        g_u16LedTimeCount++ ;      //LED计数器加一
        if(g_u16LedTimeCount >= 500) //计数达到500,即500MS到了,改变LED的状态。
        {
            g_u16LedTimeCount = 0 ;
            g_u8LedState  = ! g_u8LedState    ;
        }
    }
}


如果我现在要用1602液晶,其中有延时程序
{    XXXXXXXXX    //执行X动作
//加延时2MS
  if(g_bSystemTime1Ms)            //系统1MS时标到             //假如g_bSystemTime1Ms系统1MS没到,是不是中间就没延时了,执行X动作就直接执行Y了,为了保证有2MS的延时函数应该怎么修改呢?
    {
        g_bSystemTime1Ms = 0 ;
        g_u16LedTimeCount++ ;      //LED计数器加一
        if(g_u16LedTimeCount >= 2) //计数达到2,即2MS到了
        {
            g_u16LedTimeCount = 0 ;
       //  g_u8LedState  = ! g_u8LedState    ; //这句不要
        }
    }
YYYYYYYYYYYYYYY  //执行Y动作
}
1怎样把定时器延时函数写成一个类以前delay(2)的形式使之可以方便调用呢?
2如果使用的定时器溢出中断来形成的定时函数,那么在使用其他中断(比如ADC中断)在时间上应该注意什么,防止两个中断抢时间(比如在执行ADC中断的时候,定时器中断又到了,又去执行定时器了)?




相关帖子

来自 2楼
airwill| | 2015-2-10 21:33 | 只看该作者
这个很简单啊, 可以直接以此方式写个延时函数
void delay(ms) {
    do {
        while(g_bSystemTime1Ms==0);            //系统1MS时标到
        g_bSystemTime1Ms = 0 ;
    } while(--ms !=0);                  //计数减1, 判断达到
}

使用特权

评论回复
板凳
一颗心的思考| | 2015-2-10 20:03 | 只看该作者
有这么用的吗/?bushib

使用特权

评论回复
地板
一颗心的思考| | 2015-2-10 23:07 | 只看该作者
airwill 发表于 2015-2-10 21:33
这个很简单啊, 可以直接以此方式写个延时函数
void delay(ms) {
    do {

好棒的思维。但是这么用好么

使用特权

评论回复
5
SD10A|  楼主 | 2015-2-11 22:01 | 只看该作者
本帖最后由 SD10A 于 2015-2-11 22:13 编辑
airwill 发表于 2015-2-10 21:33
这个很简单啊, 可以直接以此方式写个延时函数
void delay(ms) {
    do {


  

刚才用流水灯试验了下    成功了 完全可行!非常感谢


使用特权

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

本版积分规则

29

主题

169

帖子

4

粉丝