snifer

[原创]ADuC847间隔计数器编程

0
阅读(5572)

最近在论坛里很多朋友给我交流ADI程序的编写,调试,感觉受益匪浅,互相学习,才能共同进步嘛,昨天晚上一直和一个朋友在讨论ADUc847的计数实现,我觉得这个程序有一定的代表性,贴出来供大家参考:

该程序重要利用ADuC847实现,上电时,LED工作在6HZ频率下,通过按下INT0外部中断按钮。释放时,时间只到最接近的单位正确(1/128s,秒,分钟或小时)。

如果按钮被按下0.91000s光将补充每0.90625s(小于1秒因此它的措施,1/128s和最接近的单位比0.91000s0.90625s)。但是如果光1.6s的补充,最近的每1秒单位现在是第二。按下的INT0按钮,将记录一个新的时间间隔将在同光方式。

程序如下:

#include <stdio.h>
#include <ADuC847.h>

sbit LED = 0x0B4;
void int_0 () interrupt 0
{
 //LED ^= 1;
    TIMECON &= 0xFE;
    TIMECON |= 0x01;
 while (INT0 == 0);
 TIMECON &= 0xFD;
    if (SEC ==0 && MIN == 0 && HOUR ==0)
 {
  INTVAL = SEC;
  TIMECON = 0x00;
  TIMECON = 0x03;
 }
 if (SEC !=0 && MIN == 0 && HOUR ==0)
 {
  INTVAL = SEC;
  TIMECON = 0x00;
  TIMECON = 0x13;
 }
 if (MIN !=0 && HOUR ==0)
 {
  INTVAL = MIN;
  TIMECON = 0x00;
  TIMECON = 0x23;
 }
 if (HOUR !=0)
 {
  INTVAL = HOUR;
  TIMECON = 0x00;
  TIMECON = 0x33;
 }
}
void TIC_int () interrupt 10
{
  LED ^= 1;
}
void main (void)
{
 int i;
//配置时间间隔计数器
 TIMECON = 0x03;
    INTVAL = 0x0A;
//配置外部中断
 IT0 = 1;  //  int0边缘触发
    EX0 = 1;  // 启用外部中断(int0)
 IEIP2 = 0x04;   // 中断TIC
    EA = 1;   //开始中断
 while (1)
 {
  LED^=0;
  for (i = 0; i < 10000; i++) {}
 }
}
程序比较小,但是很具有典型性,只有对ADuC847的计时特性深入的掌握才能编写程序,这也是我最近研究硬件特征的原动力,谢谢大家!!