/*程序说明*/
//按键K1 k2控制LED1输出,K1按键一次灯短亮几秒灭,K2按键一次灯长亮几秒灭,仿真的单片机是STC15W404AS
#include"STC15W4K.H"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED1=P1^0; //LED输出口
sbit k1=P3^2; //LED控制
sbit k2= P3^3;
void timer_inti();
void key1();
void key2();
//------------延时函数,大约延时2.----------------
void Delay20us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 52;
while (--i);
}
//--------按键K1开始定时器0----------------------
void key1()
{ //timer_inti(); 初始函数至此时, 灯常亮
if(k1==0)
{Delay20us();
if(k1==0) //
{
while(!k1); //按键松开否?
LED1=0;
timer_inti(); //必须有初始化,否则仅开始一次而不能连续第2次以后按键开启
TR0=1; //开启T0
}
}
}
//----------按键K2开始定时器1----------------------
void key2()
{ //timer_inti(); 初始函数至此时, 灯常亮
if(k2==0)
{Delay20us();
if(k2==0) //
{
while(!k2); //按键松开否?
LED1=0; //点亮LED灯
timer_inti(); //必须有初始化,否则仅开始一次而不能连续第2次以后按键开启
TR1=1; //开启T1
}
}
}
//------- T0\ T1初始化 但是保持不开启定时器 ,仅让K1\K2按键启动定时器---------------
void timer_inti()
{
TMOD=0x11; //设置T0 T1工作模式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA = 1; //打开总中断
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
}
//---------定时器T0 中断函数--------------
void Timer0() interrupt 1 using 0 //
{
static num1=0,second1=0;
num1++;
if(num1>=16)
{ second1++;
num1=0;
}
if(second1==10)
{
second1=0; //必须有此清零,否则仅开始一次而不能连续第2次以后按键开启
TR0=0; // 关断T0
LED1=1; //关断LED灯
ET0=0; // 关断T0中断
EA=0; //关断总中断
}
}
//------ ---定时器T1 中断函数--------------
void Timer1() interrupt 3 using 1 //
{
static num2=0,second2=0;
num2++;
if(num2>=16)
{ second2++;
num2=0;
}
if(second2==20)
{
second2=0; //必须有此清零,否则仅开始一次而不能连续第2次以后按键开启
TR1=0; // 关断T1
LED1=1; //关断LED灯
ET1=0; // 关断T1中断
EA=0; //关断总中断
}
}
//-----------主函数-----------------------
void main()
{
timer_inti(); //初始函数
while(1)
{
key1();
key2();
}
} |