功能简介: 实现有人坐到座位上时,座位上的灯亮启同时触发计数器。当检测到座位无人时,系统启动计时功能,计时5s后,再次检测座位是否有人。若此时座位无人,则座位灯熄,同时显示屏数字减少(所有座位灯熄的数字)。若此时座位有人,则灯继续亮,显示屏数字不变。显示屏上显示所有座位上有人的数字。
原理图: 仿真图:
程序设计
#include "reg51.h"
#include "74hc595.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit ir_in=P1^7;//红外输入
uchar time=0,mode=0;//系统变量
uchar disp[]="00";
uchar num=0;//数量
uint flag=0;//led控制
uchar miao[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //定时
uchar read1(uchar i)//读取红外
{
P1=0x80+i;
if(P1==i)
return 0;
else
return 1;
}
uchar read2(uchar i)//读取led状态
{
if((flag & (1<<i))>0)
return 1;
else
return 0;
}
void set(uchar i)//点亮led
{
flag=flag | (1<<i);
Hc595SendByte(flag);
}
void clr(uchar i)//熄灭led
{
flag=flag & ~(1<<i);
Hc595SendByte(flag);
}
void all()//统计数量
{
uchar i;
uint j=0;
j=flag;
num=0;
for(i=0;i<16;i++)
{
if((j& 0x0001)>0)
{
num++;
}
j>>=1;
}
}
//主函数
void main()
{
init_1602();
write_string(1,0,"ALL Number:");
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
}
}
//定时器中断
void Timer0() interrupt 1
{
uchar i=0;
if(time<10)//0.5s
time++;
else
{
time=0;
for(i=0;i<16;i++)
{
if(read1(i)>0)//座位有人
{
set(i);
}
else
{
if(read2(i)>0)//座位无人
{
if(miao[i]<10)//倒计时
miao[i]++;
else
{
miao[i]=0;
clr(i); //熄灭led
}
}
}
}
all();//统计亮灯数量
disp[0]=num/10+0x30;//显示
disp[1]=num%10+0x30;
write_string(2,6,disp);
}
TH0=0X3C;
TL0=0XB0;
}
链接:https://pan.baidu.com/s/16Qb5sT-czjhW6aEh9cDv6g 提取码:rxj1
|