模拟楼道延迟开关,如果灯是开着的不关的话延迟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){
}
}
/***************************程序完成*****************************************/