程序源码如下(如需相关扩展源码私聊即可!)
/*======================================================================
利 用 定 时 器 实 现 精 准 延 时 的 调 用 函 数
========================================================================*/
#include <STC12C5A60S2.h>
typedef unsigned char u8;
typedef unsigned int u16;
u16 count; //中断次数变量
bit flag = 0; //标志时间结束
//======================================================================
// 定 时 器 0 中 断
//======================================================================
void T0()interrupt 1
{
TH0 = (65536 - 1000) >> 8; //定时1ms中断一次
TL0 = (65536 - 1000);
if(flag)
{
if(--count == 0) //计数器自减1,并判断时间是否截止
flag = 0; //标志位置0, 延时结束
}
}
//======================================================================
// 精准延时函数-单位ms
//======================================================================
void delay_ms(u16 ms)
{
count = ms; //设定计数器值
flag = 1; //启动倒计时
while(flag);//等待时间结束,标志位则变成0跳出while语句
}
//======================================================================
// 主 函 数
//======================================================================
void main()
{
u8 i;
TMOD = 0x01;
TR0 = 1;
ET0 = 1;
EA = 1;
while(1)
{
P1 = 0xFF;
for(i = 0; i < 8; i++)
{
P1 = P1 >> 1; //8个LED逐渐点亮
delay_ms(1000); //延时1秒
}
}
}
//======================================================================
//
//======================================================================