哪位大神帮我看下代码啊 我是想做一个红外报警系统 蜂鸣器不响还有红灯不亮。。。
采用了一个人体热释传感器 连接在P1^0
功能描述:无人时:正常工作灯绿灯亮 连接的是P1^2
有人时:红灯闪烁 蜂鸣器报警 时间均为10s 10s报警结束后 关闭红灯 蜂鸣器 正常工作红灯亮
红灯连接的是P3^0 蜂鸣器是P3^1
#include
#define uint unsigned int
#define uchar unsigned char
sbit hw = P1^0; //定义红外模块端
sbit LED_green = P1^2; //定义正常工作LED端
sbit LED_red = P3^0; //定义报警LED端
sbit beep = P3^1; //定义蜂鸣器端
sbit e = P3^2; //定义外部中断
void delay(uint zms) //延时函数
{
uint i,j;
for(i=zms;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
//初始化函数
EA = 1; //打开总中断
EX0 = 0; //开外部中断0
IT0 = 1; //外部外部中断为边沿触发方式
LED_red = 1; //关闭报警红灯
beep = 0; //关闭蜂鸣器
}
void alarm() //报警函数
{
LED_green = 1; //开始报警使运行正常绿指示灯熄灭
while(1)
{
LED_red = 0; //红灯和声报警启动
delay(500ms);
LED_red = 1;
delay(500ms);
beep = 1;
}
}
void main()
{
init(); //初始化
P1 = 0xff; //P1口全部置1
P2 = 0x00; //P2口清零
TMOD = 0x01; //设置定时器0工作模式1
TH0 = (65536-50000)/256; //定时器装初值
TL0 = (65536-50000)%256; // 定时50ms
EA = 1; //打开总中断
ET0 = 1; // 开定时器0中断
TR0 = 1; //启动定时器0
while(1)
{
LED_green = 0; //打开正常工作灯
}
}
void T0_time() interrupt 1
{
uchar num = 0;
TH0 = (65536-50000)/256; //定时器重装初值
TL0 = (65536-50000)%256;
num++; //num每加1次判断一次是否到200次
if(200 == num) //如果到了200次,说明10S时间到
{
num = 0; //把num清0 重新再计200次
}
}
void INT_0() interrupt 0
{
EX0=0; //外部中断0服务程序开始,屏蔽外部中断
if(0 == hw) //监测输入信号,是否有输入信号
{
delay(10ms); //延时消抖
if(0 == hw) //再次监测输入信号,若有输入信号转入报警子程序
{
alarm(); //报警程序
if(1 == TF0)
{
TF0 = 0; //清除定时器0溢出中断
LED_red = 1; //关闭报警红灯显示
beep = 0; //关闭报警蜂鸣器
LED_green = 0; //使报警结束,正常工作指示绿灯亮
EX0 = 1; //报警结束 开启外部中断
}
}
}
}
哪位大神帮我看下代码啊 我是想做一个红外报警系统 蜂鸣器不响还有红灯不亮。。。
采用了一个人体热释传感器 连接在P1^0
功能描述:无人时:正常工作灯绿灯亮 连接的是P1^2
有人时:红灯闪烁 蜂鸣器报警 时间均为10s 10s报警结束后 关闭红灯 蜂鸣器 正常工作红灯亮
红灯连接的是P3^0 蜂鸣器是P3^1
#include
#define uint unsigned int
#define uchar unsigned char
sbit hw = P1^0; //定义红外模块端
sbit LED_green = P1^2; //定义正常工作LED端
sbit LED_red = P3^0; //定义报警LED端
sbit beep = P3^1; //定义蜂鸣器端
sbit e = P3^2; //定义外部中断
void delay(uint zms) //延时函数
{
uint i,j;
for(i=zms;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
//初始化函数
EA = 1; //打开总中断
EX0 = 0; //开外部中断0
IT0 = 1; //外部外部中断为边沿触发方式
LED_red = 1; //关闭报警红灯
beep = 0; //关闭蜂鸣器
}
void alarm() //报警函数
{
LED_green = 1; //开始报警使运行正常绿指示灯熄灭
while(1)
{
LED_red = 0; //红灯和声报警启动
delay(500ms);
LED_red = 1;
delay(500ms);
beep = 1;
}
}
void main()
{
init(); //初始化
P1 = 0xff; //P1口全部置1
P2 = 0x00; //P2口清零
TMOD = 0x01; //设置定时器0工作模式1
TH0 = (65536-50000)/256; //定时器装初值
TL0 = (65536-50000)%256; // 定时50ms
EA = 1; //打开总中断
ET0 = 1; // 开定时器0中断
TR0 = 1; //启动定时器0
while(1)
{
LED_green = 0; //打开正常工作灯
}
}
void T0_time() interrupt 1
{
uchar num = 0;
TH0 = (65536-50000)/256; //定时器重装初值
TL0 = (65536-50000)%256;
num++; //num每加1次判断一次是否到200次
if(200 == num) //如果到了200次,说明10S时间到
{
num = 0; //把num清0 重新再计200次
}
}
void INT_0() interrupt 0
{
EX0=0; //外部中断0服务程序开始,屏蔽外部中断
if(0 == hw) //监测输入信号,是否有输入信号
{
delay(10ms); //延时消抖
if(0 == hw) //再次监测输入信号,若有输入信号转入报警子程序
{
alarm(); //报警程序
if(1 == TF0)
{
TF0 = 0; //清除定时器0溢出中断
LED_red = 1; //关闭报警红灯显示
beep = 0; //关闭报警蜂鸣器
LED_green = 0; //使报警结束,正常工作指示绿灯亮
EX0 = 1; //报警结束 开启外部中断
}
}
}
}
首先你硬件确认了有没有什么问题?确认硬件没问题后再查程序……
这种程序很简单啊,关键是你先把红外热释电传感器信号调试出来,这个网上有卖现成的模块,采用了信号调理,可以输出稳定的信号,你单买个传感器,需要自己搭建调制电路才行,不知道你图上画的电路工作正常么?
这种传感器用好像是台湾一家芯片调制的,名称我忘记了,你可以看看,电路信号输出不正常的话,后面的就不好保证。
这个是一个模块图:
没有仔细读代码,给点个人建议
蜂鸣器不响:
1、撸主蜂鸣器类型对了吗?
有源蜂鸣器高电平就能响,无源蜂鸣器要脉冲才能响哈
2、三极管基极4.7K的电阻换个小点的试试,be结压降似乎不够
LED_red不亮:
硬件上有问题吗?建议仔细排查一下。
另:
中断函数10ms的延时,很少见啊
一般中断只做简单处理,长时间的延时一般不会出现
要不然很容易跑飞或者出现其他不可控的问题