snifer

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

0
阅读(4327)

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

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

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

程序如下:

#include
#include

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的计时特性深入的掌握才能编写程序,这也是我最近研究硬件特征的原动力,谢谢大家!!
Baidu
map