基于单片机的视力保护器电路的设计 下载本文

sbit GetLight=P2^0; //光照输入 sbit GetDis=P3^2; //测距中断

sbit Set40=P3^0;//555超声波发射使能端 //全局变量定义

uchar minutes,seconds,counter; //分、秒、时计数 uchar timeflag=0; //45分钟到标志 uchar time5sflag=0;//光照太弱 uint time=0;//超声波传播的距离 uchar backwaveflag=0;//检测到回波标志 uint distance=0;//计算的距离

uchar countwave=0;//接收到的超声波个数 忽略几个 减少干扰 void main(void) {

//变量定义

uint countlight=0,counttime=0,countdis=0; uint i=0; //端口初始化

Set40=0;//发送超声波禁止 ASoundTime=1; P1=0XFF;//关LED P2=0XFF;//准备输入 Init(); while(1) {

//光照太弱 进行报警 if(GetLight==0) {

countlight++;

if(countlight==15000){ALight=~ALight;countlight=0;}

26

} else {ALight=1;}

}

//45分钟时间到 if(timeflag==1) { }

//1s中到发射测距

for(i=0;i<10;i++)

{ASoundTime=~ASoundTime;ATime=~ATime;delayms(400);} timeflag=0;

if(time5sflag==1 ) { }

if(backwaveflag==1)//检测到回波 { }

time=TH1;

time=(time<<8)|TL1;

distance=(int)((time*170)/1000); if(distance

else if(distance>DISBOUND) ADistance=1; backwaveflag=0;

SendSound(8); time5sflag=0;

27

}

/*********************初始化子程序*************************/ void Init(void) {

TMOD=0x11;//定时器0 定时器1 16位定时模式

IT0=1;//INT0下降沿触发中断

TH0=(65536-46075)/256;

TL0=(65536-46075)%6;

ET0=1; //定时器0中断允许位 TR0=1;//启动定时器0

counter=0;minutes=0;seconds=0; }

/**********************发射超声波***************************/ void SendSound(uchar nums) {

uint i=0; Set40=0; nums=nums; Set40=1;

for(i=0;i

ET1=1; //定时器1中断允许位 TR1=1;//启动定时器1

EX0=1; //开启中断0

28

}

/********************外部中断0计算距离***********************/ void int0srv(void) interrupt 0 {

//distance=SOUNDSPEED*time/1000000/2; countwave++; if(countwave==2)

{ }

/*****************T0计时子程序 计算是否超过45分钟******************/ void timer0() interrupt 1 using 2 //45分钟到则标志位置1报警 {

TH0=(65536-46075)/256;

TL0=(65536-46075)%6;

ET1=0; //定时器1中断允许位

TR1=0;//启动定时器1

EX0=0;//INT0允许中断 backwaveflag=1; countwave=0;

}

counter++;

if(counter==20) {

seconds++;

// if(seconds==5)

{time5sflag=1;}

counter=0;

if(seconds==60) {

29