写了一个,用定时器的,程序中有具体注释。
//STC89C52
//时钟12M
#include
#include
typedef unsigned char UINT8;
typedef unsigned int UINT16;
#define TIMER_PERIOD 10000 //10毫秒
//定义LED端口,低电平点亮
#define LED_PORT P0
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sbit LED4 = P0^3;
sbit LED5 = P0^4;
sbit LED6 = P0^5;
sbit LED7 = P0^6;
sbit LED8 = P0^7;
bit bLedOn; //控制是否显示
char cGroup; //组计数
int nTimerCount; //定时器计数
int nGroupCount; //控制组的定时器计数
//定时器中断子程序
void Timer0_isr(void) interrupt 1 using 1
{
//重新赋值
TH0 = (65536-TIMER_PERIOD)/256; //设置定时初值
TL0 = (65536-TIMER_PERIOD)%256; //设置定时初值
nTimerCount++; //定时器计数加
nGroupCount++; //组计数加
if(cGroup >= 5) //如果4组都显示完了,则等待8分钟后重新开始
{
if(nGroupCount >= 48000) //480秒,8分钟
{
nGroupCount = 0;
cGroup = 1;
bLedOn = 1;
nTimerCount = 0;
}
else
{
return; //在8分钟等待时间内,直接返回
}
}
//
if(bLedOn)
{
if(nTimerCount <= 600) //每组的第一个LED显示
{
if(cGroup == 1) LED1 = 0;
else if(cGroup == 2) LED3 = 0;
else if(cGroup == 3) LED5 = 0;
else if(cGroup == 4) LED7 = 0;
}
if(nTimerCount >= 300 && nTimerCount <= 600) //每组的第二个LED显示
{
if(cGroup == 1) LED2 = 0;
else if(cGroup == 2) LED4 = 0;
else if(cGroup == 3) LED6 = 0;
else if(cGroup == 4) LED8 = 0;
}
}
//
if(nTimerCount > 600 && nTimerCount <= 2100) //每组显示完后,所有LED熄灭15秒
{
LED_PORT = 0xFF;
bLedOn = 0;
}
if(nTimerCount > 2100) //间隔15秒后,进行下一组显示
{
cGroup++;
bLedOn = 1;
nTimerCount = 0;
}
//
if(cGroup >= 5) //如果4组都显示完
{
nGroupCount = 0;
bLedOn = 0;
}
}
//定时器设置
void Timer0_Init(void) //@12.000MHz
{
TMOD |= 0x01; //设置定时器模式1, 16位定时器
TH0 = (65536-TIMER_PERIOD)/256; //设置定时初值
TL0 = (65536-TIMER_PERIOD)%256; //设置定时初值
TR0 = 1; //定时器0开始计时
ET0 = 1; //定时器中断打开
EA = 1; //总中断打开
}
//主程序
void main()
{
//变量初始化
bLedOn = 1;
cGroup = 1;
nTimerCount = 0;
nGroupCount = 0;
//定时器设置
Timer0_Init();
while(1)
{
//无限循环
}
}
[attachment=4806685]