使用C的PIC单片机

时间:2015-04-14 01:13:33

标签: c pic

我试图让这段代码在MM中运行:SS:FFFFFF,其中MM是分钟,SS秒和FFFFFF微秒,但我的分钟是机器人正常工作。而不是像01:05:873098那样得到00:65_873098。谢谢你的任何提示。

#include <prototype.h>
int16 overflow_count;
#int_timer1
void timer1_isr(){
overflow_count++;
}

void main(){
int32 time;

setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts(int_timer1);
while(TRUE){
  enable_interrupts(global);

  while(input(PUSH_BUTTON)); //Wait for press
  set_timer1(0);
  overflow_count=0;

  while(!input(PUSH_BUTTON)); //WAIT FOR RELEASE
  disable_interrupts(global);
  time=get_timer1();
  time=time+((int32)overflow_count<<16);
  time-=15; //substract overhead
  printf("Time is %02lu:%02lu.%06lu minutes.\r\n",
  time/1000000000, (time/6000000), (time/5)%1000000);
   }
}

2 个答案:

答案 0 :(得分:0)

我建议你引入一些中间变量,如“ticks”,“microsecs”,“secs”和“mins”。逐步进行计算,从最小单位到最大单位,记住在转换下一个较大的部分之前减去每个部分。确保单位在转换的每个步骤都能正常运行(例如,不要添加或减去具有不同单位的值)。想想你是如何用铅笔和纸做的:可能不是你写的方式!当你这样分解它时,更容易让逻辑正确。

答案 1 :(得分:0)

你并没有减去整个部分

如果time是微观时间......就像:

time = time % (24 * 60 * 60 * 1000); //mod out any extra days
int hours = time / (60 * 60 * 1000);
time = time %  (60 * 60 * 1000); // or time -= hours*(60 * 60 * 1000)
int min = time / (60 * 1000);
time = time % (60 * 1000); // or time-= min*(60*1000)
...