标题: 51单片机人体红外感应 照明控制系统主程序设计 [打印本页]
作者: miaoyamin 时间: 2017-5-23 00:54
标题: 51单片机人体红外感应 照明控制系统主程序设计
#include<reg52.h>
#include<intrins.h>
#defineuint unsigned int
#defineuchar unsigned char
sbitIR=P1^0; //人体红外信号输入
sbitLAMP=P2^0; //照明灯控制接口
bitfIR=0; //人体红外信号标志位
unsignedint times=0;
unsignedchar SetSecond=10;
unsignedint SetTime=0;
voiddelayms(uint ms) //延时xx毫秒
{
uchari;
while(ms--)
{
for(i=0;i<123;i++);
}
}
voidTimer0() interrupt 1 //定时器0中断,开启定时器中断后,每50ms中断1次。
{
TH0 = (65535-50000)/256;
TL0 =(65535-50000)%256; //定时器重新加载初始值
if(fIR==0) //人体红外信号标志位为0,人体已经离开房间
{
if(++times==SetTime) //倒计时时间累计,每次中断50ms,20次为1秒,200次为10秒
{
times = 0; ////倒计时时间累计清0
TR0=0; //停止计时
LAMP=1; //照明灯熄灭
}
}
}
voidmain(void) //主程序
{
P2=0xff;P3=0xff;P1=0xff;
SetTime=SetSecond*20; //计算倒计时时间,每次中断50ms,20次为1秒,200次为10秒
TMOD = 0x01; //设置定时器0模式
TH0 =(65535-50000)/256;
TL0 =(65535-50000)%256; //定时器加载初始值
EA=1; //允许中断触发
ET0=1; //允许定时器0中断
TR0=0; //停止定时器0计时
while(1)
{
if(IR==0) //有人体信号
{
delayms(20); //延时,防止误触发
if(IR==0) //有人体信号
{
fIR=1;TR0=1; //启动定时器0,设置人体红外信号标志位为1
LAMP=0; //照明灯点亮
}
}
else fIR=0; //没有人体红外信号,设置人体红外信号标志位为0
}
}
作者: 笑点滴 时间: 2017-5-23 18:10
请问一下 这个模块是不是不太稳定,我试了一下 有时候靠近了没反应
作者: HUANGHFS 时间: 2017-5-23 21:28
你有一些地方写错了,只是缺少空格或多了一些:例如IR,你写成fIR。#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit IR=P1^0; //人体红外信号输入 sbit LAMP=P2^0; //照明灯控制接口 bitfIR=0; //人体红外信号标志位 unsigned int times=0; unsigned char SetSecond=10; unsigned int SetTime=0; void delayms(uint ms) //延时xx毫秒 { uchar i; while(ms--) { for(i=0;i<123;i++); } } voidTimer0() interrupt 1 //定时器0中断,开启定时器中断后,每50ms中断1次。 { TH0 = (65535-50000)/256; TL0 =(65535-50000)%256; //定时器重新加载初始值 if(IR==0) //人体红外信号标志位为0,人体已经离开房间 { if(++times==SetTime) //倒计时时间累计,每次中断50ms,20次为1秒,200次为10秒 { times = 0; ////倒计时时间累计清0 TR0=0; //停止计时 LAMP=1; //照明灯熄灭 } } } void main(void) //主程序 { P2=0xff; P3=0xff; P1=0xff; SetTime=SetSecond*20; //计算倒计时时间,每次中断50ms,20次为1秒,200次为10秒 TMOD = 0x01; //设置定时器0模式 TH0 =(65535-50000)/256; TL0 =(65535-50000)%256; //定时器加载初始值 EA=1; //允许中断触发 ET0=1; //允许定时器0中断 TR0=0; //停止定时器0计时 while(1) { if(IR==0) //有人体信号 { delayms(20); //延时,防止误触发 if(IR==0) //有人体信号 { IR=1; TR0=1; //启动定时器0,设置人体红外信号标志位为1 LAMP=0; //照明灯点亮 } } else IR=0; //没有人体红外信号,设置人体红外信号标志位为0 } }
作者: xhz 时间: 2017-5-24 14:47
谢谢,正是需要楼主就发来了,请问有电路图吗?
作者: 立致T5T8厨柜灯 时间: 2018-1-25 17:57
楼主你好!我是做感应灯的,可以微信沟通?我的微信18022012218
作者: 陈张浩 时间: 2018-3-20 18:18
你好,我想问下,为什么我的LED灯一直亮呢
作者: 1656997475 时间: 2018-4-17 09:10
能详细点微信 1656997475
作者: 1656997475 时间: 2018-4-17 09:11
这很多错误能搞好一点吗 谢谢 微信 1656997475
作者: 小白帆 时间: 2018-5-1 14:10
我感觉你帮楼主改错了吧,main函数中在确定IR==0时,楼主的目的是为了给出一个标志标明IR==0,即感应到有人(FIR=1),这没有写错,是你写错了
作者: 2239789937 时间: 2018-6-5 23:13
楼主我的也是一直亮着 你解决了吗
作者: zfys6868 时间: 2018-12-9 22:35
楼主我这个也是再亮,不知道怎么修改,您能否指点一下呢
作者: 1234566W 时间: 2019-1-31 18:45
像这种毕业设计的实物材料可以在哪里买
作者: 2026076977 时间: 2020-6-3 21:16
人体感应控制 舵机 程序是怎样的呢
作者: aking991 时间: 2020-6-4 08:16
有时候看你们的程序可点醒我一些想法,谢谢分享
作者: oooppj 时间: 2020-6-13 03:54
大佬 有电路图吗
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |