注:1.硬件应使用12MHz晶振;
2.程序使用定时器0,溢出周期50ms,计90次溢出为
4分半,其它以此类推,15分到时IC4脚(P1.3)输
出低电平,然后关闭定时器,停止计数。
-------------------------------------------------*/
#include<reg52.h>
sbit P10=P1^0
sbit P11=P1^1
sbit P12=P1^2
sbit P13=P1^3
unsigned char Count=0
unsigned char Half_Min=0
void main()
{
TMOD=0x01
TH0=0x3C
TL0=0xB0
ET0=1
EA=1
TR0=1
while(1)
}
void timer_0() interrupt 1
{
TH0=0x3C
TL0=0xB0
Count++
if(Count>10) //大于10则为500ms
{Half_Min++
Count=0
switch(Half_Min)
{
case 9:P10=0break//4分半
case 10:P11=0break //5分
case 20:P12=0break //10分
case 30:P13=0TR0=0break//15分
default:break
}
}
}
/* 刚写好的,绝非复制,有问题加QQ447212829 */
晶振频率Fosc=12MHz,则机械周期 T=12/Fosc=1us;程序中 的 自加(++)、自减(--) 的执行周期为1个机械周期,即1us;若为 理想状态,则delay(500000)的时间应该是:500000×1us=500ms;
但是,编译软件 要把 函数调用、for 语句转换成 机器指令,这是需要一定周期的,周期长短 视不同的编译软件 而有所不同,目前也没人对这个 转换差别 做过 专业的考量,故LZ 的问题,没有确切 的答案,只能 是告诉 你,大于某个时间;如例子 的答案是 大于 500ms,但大到什么程度,不知道,不过可以从 软件中 单步调试 中 得到。
精确计算如下:DELAY:
MOV R5,#20 ---1T
D1: MOV R6,#20--1T
D2: MOV R7,#248 -1T
DJNZ R7,$ ----2T,(2) * 248 = 496
DJNZ R6,D2----2T,(1 + 496 + 2) * 20 = 9980
DJNZ R5,D1----2T,(1 + 9980 + 2) * 20 = 199660
RET-------2T, 1 + 199660 + 2 = 1996603
总共,耗用199660 T。
时间,关键是要取决于晶振频率。
当晶振频率=12MHz,则有 T = 1us。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)