关于许多电子爱好者来说,自己制造一款LED的电子钟,是很有意思的一件工作,LED的
电子钟尽管耗电一点,但在夜间也不必翻开照明就能够看得清清楚楚,仍是很便利的了.
PIC16C54内部有512字节(精确的说是能够放512条指令)的指令空间,关于电子钟的
使用项目来说,资源现已足够了.它具有12个I/O口,刚好能够用来做一个四个数码管的电
子钟.其间PORTA口用作位码输出,PORTB用作段码输出和按键输入.
54内部有一个8位的守时器,但没有中止溢出功用,关于用惯了中止的人来说,或许觉
得守时基准不好做,比方51系列的,只需设定好中止溢出时刻,一般取整数指令周期,如每
次溢出时刻为50mS,每次溢出时累加器加一,当加到20次时就有1S了,很便利进行体系时钟
的处理.但PIC16C54没有中止功用,只能用判别守时器溢出的办法来确认守时器的守时.判
判定量器溢出能够选用比较的办法,当收集到TMR0的计数值为0-5时,能够以为守时器溢出
了,另一种办法是测验TMR0的最高位是否为1,也便是把TMR0当作7位守时器来用,这样,就
不会呈现前一种办法由于程序错失捕获到TMR0的值为0-5的机遇而使守时呈现差错了.比
较好的办法是用一个存储器X0盯梢TMR0的计数值,在正常情况下,X0总是会小于TMR0的计
数值,由于在读取TMR0的值并把这个值赋值给X0之后,TMR0的计数值又在累加了,但TMR0是
一个循环计数器,当加到255后,其值将会变为零,这样就为判别TMR0供给了根据,即只需测
试到X0>=TMR0,即可以为TMR0现已溢出,这样就能够进行相应的处理了.如时钟频率为
4MHz,则一条指令的履行时刻为1uS,TMR0溢出对应于256uS,当测验到TMR0溢出之后,不对
TMR0进行任何赋值操作,由于对TMR0进行写入,会使TMR0推迟三个指令周期,而每次往
TMR0写入的时分,不或许它的计数值都是同一个值,所以只能选用加一个预订值的办法,如
果TMR0不选用分频器,则对TMR0履行 TMR0=TMR0+9的操作,将使每次TMR0的计数溢出周期
等效为250个指令周期,也便是250uS,需求留意的是,每次读入TMR0的值与X0进行比较时的
时刻距离必定不能大于TMR0的溢出时刻,不然错失溢出时刻.判别TMR0溢出的最短指令为:
MOVF TMR0,W
SUBWF X0,F
MOVWF X0
SKPC
GOTO 没有溢出…
溢出处理…
对应的C言句子子为:
i=TMR0;
x0=x0-i;
x0=i;
if(CARRY)
{TMR0+=9;
}
这儿借用了一个暂时存储器i,假如没有它,则句子编译不会最短,程序履行会了犯错
,不能确保每次溢出为250uS.
假如选用32768晶振的话,程序的规划上,不需求再对TMR0作任何写入,只需用上述程
序判别TMR0溢出就能够了.由于TMR0每次溢出的时刻为0.03125秒,再对其进行32分频即可
得到秒信号了.
这样,整个程序的中心部分就完成了,剩余的应该不难写出来.