帮人帮到底 目前这个原因闲得蛋疼 给你写好了,我也是菜鸡,见笑了,我用STC给你写的 用的定时器实现你的功能
#include "STC15F104E.H" //单片机头文件
#define u16 unsigned int //宏定义无符号整型数据
#define u8 unsigned char //宏定义无符号字符型数据
sbit key_sr = P3 ^ 4;
sbit LED_1 = P3 ^ 5;
sbit LED_2 = P3 ^ 0;
sbit LED_3 = P3 ^ 1;
sbit LED_4 = P3 ^ 2;
u8 key_flag = 0;
void SYSTEM_INIT()
{
P3M1 = 0x00;
P3M0 = 0x27; // P3(双双推双双推推推)
LED_1 = 1;
LED_2 = 1;
LED_3 = 1;
LED_4 = 1;
}
void key_scan()
{
static u8 cnt = 0;
if (key_sr)
{
cnt = 0;
key_flag = 0;
}
else if (!key_flag)
{
cnt++;
if (cnt > 200)
{
key_flag = 1;
}
}
}
void LED_serve()
{
static u8 ms50_cnt = 0;
static u8 min_cnt = 0; //分钟计数
static u8 min2_cnt = 0; // 2分钟计时
static u8 blink_flag = 0;
static u8 blink_cnt = 0;
if (!blink_flag)
{
if (!key_flag) //开关断开
{
LED_1 = 0;
LED_4 = 1;
}
if (!LED_1 && LED_2) //两秒后点亮LED2
{
if (++min2_cnt >= 40) //两秒计时到
{
min2_cnt = 0;
LED_2 = 0;
}
}
if (!LED_2)
{
if (++ms50_cnt >= 200) // 10秒
{
ms50_cnt = 0;
min_cnt++;
}
if (min_cnt >= 90) // 900秒=15分
{
blink_flag = 1; //闪灯标志
}
}
}
if (key_flag) //开关接通
{
ms50_cnt = 0;
min_cnt = 0;
blink_flag = 0;
LED_1 = 1;
LED_2 = 1;
LED_4 = 0;
}
if (blink_flag) //闪灯500毫秒一次
{
LED_1 = 1;
LED_2 = 1;
blink_cnt++;
if (blink_cnt <= 10)
{
LED_3 = 0;
}
else
LED_3 = 1;
if (blink_cnt >= 20)
{
blink_cnt = 0;
}
}
else
{
blink_cnt = 0;
LED_3 = 1;
}
}
void Timer0Init(void) // 50毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
/***************主程序****************/
void main()
{
SYSTEM_INIT();
Timer0Init();
while (1)
{
key_scan();
}
}
void timer0() interrupt 1
{
LED_serve();
}
|