从头学玩单片机STC15F104W《四》模拟楼道延迟开关
编辑时间:2022-05-26 作者:金满斗 浏览量:2837 来源:原创

模拟楼道延迟开关,如果灯是开着的不关的话延迟10秒钟关闭,如果是开着的话再按马上关闭    芯片型号STC15F104W

还是把那个最小开发板功效最大化

图纸如下

直接上代码吧。

没什么技术含量,这里主要是熟悉下时钟的写法。

/********************************************************************
日    期:2022/05/26
功    能: 模拟楼道延迟开关,如果灯是开着的不关的话延迟10秒钟关闭,如果是开着的话再按马上关闭    芯片型号STC15F104W	  
编    写:劲松电脑通讯	 www.jvbaopeng.com
*********************************************************************/
#include <stc15.h> 	       //引入库文件,这个直接下载器里复制保存为stc15.h
typedef unsigned char BYTE;      //为无符号字符取别名为BYTE

#define FOSC  18432000L 	//定义主时钟
#define TIMS (65536-FOSC/1000)    //1T模式,18.432MHz晶振
#define uint unsigned int  //宏定义无符号整型,16位的unsigned int允许的取值范围是0~65535。
/********************************************************************
                            I/O定义
*********************************************************************/
sbit LED1=P3^3;	 //定义单片机P3口的第3位 (即P3.3)//为输出	  这是8脚,配合开发板图玩玩,接的灯电路,高电平灯亮
sbit key1=P3^2;	 //定义单片机P3口的第2位 (即P3.2)//为输入	   这里是7脚
//========================================================================
// 函数: void  KEYS1()
// 描述: 按键扫码函数,定时器启动后每隔1毫秒扫描
// 参数: 无.
// 返回: none.
//========================================================================
void KEYS1() // 按键 1 扫描函数
{
static uint num = 0; // 局部静态变量
//简单的判断按键,按上20毫秒才算
	if(key1==0){
		 num++;
		 if(num>=5 && key1==0){	 //按上了5毫秒以上且还是按着的
		 	while(!key1);		 //按键松手了
			LED1 = ~LED1;	  //简单的灯开关
			num = 0;	
		 }
	}
}

//========================================================================
// 函数: void tm0_isr  (void) interrupt TIMER0_VECTOR
// 描述:  timer0中断函数. 相当于于时间周期,大约1毫秒一个周期
// 参数: none.
// 返回: none.
//========================================================================
void tm0_isr (void) interrupt 1 using 1
{
   static uint  key_time_s1 = 0;   //局部计时
   KEYS1();    //扫码键盘,看按键是否按了
   //判断灯亮,灯是亮的才延迟记时间,10秒钟自动熄灭
   if(LED1 ==1){
   		 key_time_s1++;
		 if(key_time_s1>=(1000*10)){
		   	  LED1 = 0;
			  key_time_s1 =0 ;
		   }
   }
}
//========================================================================
// 函数: TIME_INIT
// 描述: 定时器初始
// 参数: none.
// 返回: none.
//========================================================================
void TIME_INIT(){
	AUXR |=0x80;      //定时器0设置为1t模式
	TMOD = 0x00;         //设置定时器为模式0(16位自动装载)
	TL0 = TIMS;         //计时器初始化开始计时
	TH0 = TIMS >> 8 ;      //向右移动8位搞什么
	TR0 = 1;
	ET0 = 1;
	EA = 1;
}

/***************************主函数*****************************************/
void main()
{
	LED1 = 0;
	TIME_INIT();
	while(1){
	}
}		
/***************************程序完成*****************************************/

来说两句吧