非常时期,孩子不能上学,大人没在家,每天早上都睡得十几点,有点过份,所以作个简易定时报警器作闹钟用,主要是配合小米智能插座的网络定时功能用,只是自己的小制作,供有需求的人参考用;
制作出来的实物图如下:
功能:
1.上电时即启动报警;
2.定时30S后自动停止;
3.报警过程中如有按键按下即停止报警;
硬件:
1.P32按一个按键,作为取消报警用;
2.P35接蜂鸣器,作为报警声;
/*/******************************************************************************
-------------------------STC15F104E定时报警器-----------------------------------
功能:
1.上电时即启动报警;
2.定时30S后自动停止;
3.报警过程中如有按键按下即停止报警;
硬件:
1.P32按一个按键,作为取消报警用;
2.P35接蜂鸣器,作为报警声;
说明:此报警器是配合智能插座(例小米智能插座,带USB那种)用的,主要作用是当闹钟用
//******************************************************************************/
#include <STC15F104E.H>
// #include <RTX51TNY.H>
#include "intrins.h"
#include "stdio.h"
/*/******************************************************************************/
/*/******************************************************************************/
sbit KEY1 = P3^2; //根据原理图,KEY1对应的IO口
sbit BUZZ = P3^5; //根据原理图,CLOCKOUT0
/*/******************************************************************************/
bit time0out_flag = 0; //定时器0超时标志位
bit time1out_flag = 0; //定时器0超时标志位
unsigned char t1_jishu = 0; //定时1计数变量
unsigned int t1_jishu2 = 0; //定时1计数变量2
/*/******************************************************************************/
void Timer1Init(void) //50毫秒@11.0592MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0x4C; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
/*/******************************************************************************/
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
//-----------------------------------------
void delayms(unsigned int t)
{
while(--t) Delay1ms();
}
/*/******************************************************************************/
/*/*********************************************************************************
/***********************************************************************************
//--------------------------------------初始化------------------------------------*/
void START(void)
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
Timer1Init(); //50毫秒@11.0592MHz
ET1 = 1; //使能定时器1中断
IT0 = 1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0 = 1; //使能INT0中断
EA = 1;
}
/**********************************************************************************/
/******************************主函数**********************************************/
/**********************************************************************************/
void main(void)
{
START(); //初始化
while(1)
{
WDT_CONTR = 0x37; //看门狗定时器
delayms(1000);
}
}
//-----------------------------------------
//中断0服务程序
void exint0() interrupt 0 //INT0中断入口
{
delayms(20); //中断按键防抖
if(!KEY1)
{
TR1 = 0; //定时器1
t1_jishu = 0;
t1_jishu2 = 0;
BUZZ = 1; //关闭报警
}
}
/* Timer1 interrupt routine */
void tm1_isr() interrupt 3 //using 1
{
t1_jishu ++;
t1_jishu2 ++;
if(t1_jishu == 5)
{
t1_jishu = 0;
BUZZ = ~BUZZ;
}
if(t1_jishu2 == 20*30)
{
BUZZ = 1; //关闭报警
TR1 = 0; //定时器1
t1_jishu = 0;
t1_jishu2 = 0;
}
}