论坛风格切换切换到宽版
  • 4336阅读
  • 10回复

C语言定时问题 [复制链接]

上一主题 下一主题
离线ba2ba
 
发帖
961
只看楼主 倒序阅读 0楼 发表于: 2013-08-07
最近发现用C语言写的定时器程序同样的定时设置初值,C语言程序运行起来比汇编语言相同的功能程序时间要短的多,2分钟的定时输出仅仅在15秒左右就完成了,不知什么原因,有碰到这种情况的吗?
地址:黑龙江省伊春市伊美区美溪镇新兴小区12号楼一单元201室
姓名:陈铁石/BA2BA
邮编:153021
电话:18804585572
QQ:464826156
离线BG4FQD
发帖
3406
只看该作者 1楼 发表于: 2013-08-07
相信和语言没关系,还是哪个地方逻辑错了。
别人吃饭我看着,别人睡觉我站着。
离线BD8BT
发帖
276
只看该作者 2楼 发表于: 2013-08-08
      我也发现C语言写的延时程序很难准确计算延时值,要在实验时调整。相比之下用汇编语言计算的延时值就比较准确,没搞明白是什么道理。
离线BG4FQD
发帖
3406
只看该作者 3楼 发表于: 2013-08-08
你是利用定时器做的,还是利用空循环做的延迟?利用定时器的和会编写的不会有区别。

如果是利用的空循环做的,编译器可能给你优化掉的。你可以编译后查看一下编译出来的代码。
别人吃饭我看着,别人睡觉我站着。
离线ba2ba
发帖
961
只看该作者 4楼 发表于: 2013-08-08
请各位看程序,功能一样,延时1分钟LED翻转:
一、 C语言
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar ta,tb;
sbit ysq=P3^7;                //声明P3.7脚控制蜂鸣器
sbit led=P2^7;                //声明P2.7脚控制LED灯
void Ti_init(void)
{
TMOD=0x00;                   //定时器0工作方式0
TH0=0xe0;                    //定时时间1ms
TL0=0x18;
TR0=1;                       //启动定时器
}
void main(void)               //主程序开始
{
  led=0;
  ysq=0;               //P3.7低电平
  P0=0xf0;
  Ti_init();          //调用定时器设置
  for(;;)
  {
   while(!TF0)
  TF0=0;
    TH0=0xe0;                    //定时时间1ms
    TL0=0x18;
  if(++ta>=100)
  {
   ta=0;
   tb++;
  }
  if(tb>=10)
  {
   tb=0;
     led=!led;
   P0=!P0;
  }
  }
}
二、汇编
          org 0000h
    ajmp main
    org 0030h
main:     mov 50h,#064h     ;定时次数1
          mov 51h,#00ah     ;定时次数2
          mov tmod,#000h    ;定时器0,方式0状态设置,定时1ms
    mov th0,#0e0h     ;定时器高位置数
    mov tl0,#018h     ;定时器低位置数
    mov P0,#0f0h
          clr P3.7
    setb P2.7
          setb tr0          ;启动定时器0
loop:     jbc tf0,loop1     ;定时器溢出转移至LOOP2    
          ajmp loop
loop1:    mov th0,#0e0h     ;定时器高位重新置数
          mov tl0,#018h     ;定时器低位重新置数
    djnz 50h,loop     ;定时达到100ms向下执行
    mov 50h,#064h     ;重新置数
    djnz 51h,loop     ;定时达到1000ms向下执行
    mov 51h,#00ah     ;
    cpl P2.7
    mov a,P0
    cpl a
    mov P0,a
    ajmp loop         ;返回
          end

[ 此帖被ba2ba在2013-08-08 18:38重新编辑 ]
地址:黑龙江省伊春市伊美区美溪镇新兴小区12号楼一单元201室
姓名:陈铁石/BA2BA
邮编:153021
电话:18804585572
QQ:464826156
离线BD8BT
发帖
276
只看该作者 5楼 发表于: 2013-08-08
回 BG4FQD 的帖子
BG4FQD:你是利用定时器做的,还是利用空循环做的延迟?利用定时器的和会编写的不会有区别。
如果是利用的空循环做的,编译器可能给你优化掉的。你可以编译后查看一下编译出来的代码。 (2013-08-08 09:28) 

谢谢指点,我是用空循环实现的。
离线okstar
发帖
4734
只看该作者 6楼 发表于: 2013-08-08
编译开关中有一个宏是主频,要与实际主频一致

内容来自Android手机客户端

离线ba2ba
发帖
961
只看该作者 7楼 发表于: 2013-08-08
问题已解决。
修改后得程序:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar ta,tb;
sbit ysq=P3^7;                //声明P3.7脚控制LED灯
sbit led=P2^7;                //声明P2.7脚控制蜂鸣器
void Ti_init(void)
{
TMOD=0x00;                   //定时器0工作方式0
TH0=0xe0;                    //定时时间1ms
TL0=0x18;
TR0=1;                       //启动定时器
}
void main(void)               //主程序开始
{
  led=0;
  ysq=0;               //P3.7低电平
  P0=0xf0;
  Ti_init();          //调用定时器设置
  for(;;)
  {
   while(TF0)
    {
     TF0=0;
    TH0=0xe0;                    //定时时间1ms
    TL0=0x18;
    if(++ta>=100)
     {
      ta=0;
      tb++;
      }
      if(tb>=10)
     {
      tb=0;
     led=!led;
      P0=~P0;
     }
  }
}
}
[ 此帖被ba2ba在2013-08-08 22:14重新编辑 ]
地址:黑龙江省伊春市伊美区美溪镇新兴小区12号楼一单元201室
姓名:陈铁石/BA2BA
邮编:153021
电话:18804585572
QQ:464826156
离线BG7FW
发帖
487
只看该作者 8楼 发表于: 2013-08-09
为什么不用定时器在后台做?
BD7FW     BD7FW/4
bg7fw@163.com;
oicq:34399287
QTH:山东.青岛
设备: IC-756  IC-7000  mcHF
天线: 三波段带陷波器的倒V
离线hui1011
发帖
18
只看该作者 9楼 发表于: 2013-08-26
定时器最好使用异步  这样不浪费cpu资源
离线XLDZZ
发帖
443
只看该作者 10楼 发表于: 2013-12-09
这个肯定和语言没关系的
c最后还是要转成汇编
新手 请多指教
E-mail:xldzz@163.com