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