红外报警系统的c语言程序

Python012

红外报警系统的c语言程序,第1张

//获取有几对红外对管被阻碍

char get_hinder_num()

{

    ......

}

//获取倒计时的时间,立即报警返回0

char get_count_down(char hinder_num)

{

    ......

}

//报警函数

void beep()

{

    ......

}

flag_delay = 1 //等待标志

void main()

{

    char hinder_num = 0

    char count_down = 0

    while(1)

    {

        while(hinder_num == 0){ hinder_num = get_hinder_num()} //发生阻碍跳出

        count_down = get_count_down() //获取倒计时

        if (count_down == 0){beep()} //倒计时为0,立即报警

        else

        {

            flag_delay = 1

            ......//使用定时器开始倒计时,根据count_down确定倒计时间

                  //时间到把flag_delay置为0

            while(flag_delay) //等待

            {

                   if (hinder_num != get_hinder_num()) //如果阻碍数量发生变化,退出等待

                   {

                       ......//关闭定时器

                       break

                   }

            }        

        }

     }   

}

void main()

{

unsigned char i=0x0a

P3=0x00

P1=0X00

TMOD=0X01

TH0=0X3C//设置定时100ms初值

TL0=0XB0

EA =1// ;CPU开中断

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

while(1){

if (P3!=0x00){

TR0=1

while(1)

}

}

}

***** interrupt()//定时器0中断自己查一下怎么写

{

TH0=0X3C

TL0=0XB0

if(I!=0X00)

{

return

}else

{

i=0X0A

P3.7^=p3.7

}

}

下面是一个用C写的遥控器程序.能在数码管上显示键码.

#include <reg52.h>

#define c(x) (x*110592/120000)

sbit Ir_Pin=P3^3

unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,

0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E} //共阳极数码显示码0-F.

unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7}

unsigned char Led_Buf[4]//显示缓冲区

char Led_Index //位选

unsigned char Ir_Buf[4]//用于保存解码结果

//==============================================================

//数码管扫描

timer0() interrupt 1 using 1

{

TL0=65536-1000

TH0=(65536-1000)/256//定时器0设定约1000us中断一次,用于数码管扫描

P0=0xff

P2=Led_Sel[Led_Index] //位选

P0=Led_Tab[Led_Buf[Led_Index]] //段选

if(++Led_Index>3) Led_Index=0 //四个扫描完了,到第一个数码管

}

//==============================================================

unsigned int Ir_Get_Low()

{

TL1=0

TH1=0

TR1=1

while(!Ir_Pin &&(TH1&0x80)==0)

TR1=0

return TH1*256+TL1

}

//=============================================================

unsigned int Ir_Get_High()

{

TL1=0

TH1=0

TR1=1

while(Ir_Pin &&(TH1&0x80)==0)

TR1=0

return TH1*256+TL1

}

//==============================================================

main()

{

unsigned int temp

char i,j

Led_Index=1

TMOD=0x11

TL0=65536-1000

TH0=(65536-1000)/256//定时器0设定约1000us中断一次,用于数码管扫描

EA=1

ET0=1

TR0=1

Led_Buf[0]=0

Led_Buf[1]=0

Led_Buf[2]=0

Led_Buf[3]=0//显示区设成0

do{

restart:

while(Ir_Pin)

temp=Ir_Get_Low()

if(temp<c(8500) || temp>c(9500)) continue//引导脉冲低电平9000

temp=Ir_Get_High()

if(temp<c(4000) || temp>c(5000)) continue//引导脉冲高电平4500

for(i=0i<4i++) //4个字节

for(j=0j<8j++) //每个字节8位

{

temp=Ir_Get_Low()

if(temp<c(200) || temp>c(800)) goto restart

temp=Ir_Get_High()

if(temp<c(200) || temp>c(2000)) goto restart

Ir_Buf[i]>>=1

if(temp>c(1120)) Ir_Buf[i]|=0x80

}

Led_Buf[0]=Ir_Buf[2]&0xf

Led_Buf[1]=(Ir_Buf[2]/16)&0xf

Led_Buf[2]=Ir_Buf[3]&0xf

Led_Buf[3]=(Ir_Buf[3]/16)&0xf//显示结果

}while(1)

}