⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir_detect.bak

📁 C51单片机实现红外探测 可以探测是否有障碍物及入侵者 数据通过串口格式化 38 KHZ载波
💻 BAK
字号:
/**********************************Copyright (c)*********************************
;**                            西南科技大学计算机学院
;**                            http://cs.swust.edu.cn
;**          
;**    日期:      2005.5.10
;**    描述:      红外探测实验,本程序也通过调试,仅供参考。
;**    实验内容:   利用红外线设计一个报警器
;**    适用机型:  AT89S52
*********************************************************************************/
#include <at89x52.h>                     //定义芯片特殊功能寄存器的头文件
#include <stdlib.h>                      //函数 srand()与rand()支持头文件
#define uchar unsigned char
uchar count=0x32;                        //随机数计时变量
uchar counter=0x00;                      //警铃计时变量
uchar Check;                             //检测数组
uchar Receive_data;                      //接收缓冲区
bit Alarm_flag;                          //跳变检测标志
/*******************************************************
 名称:   初始化运行环境   
 功能:  初始化各寄存器与端口状态
         设置串口工作方式,波特率 3138
 参数:  无
 返回值:无
*******************************************************/
void DeviceInit(void)                    //初始化系统
{
   TL0=0xC0;                             //置定时器处置,设置中断时间为20ms
   TH0=0x63;
   TMOD=0x01;                             //设定定时器/计数器0工作方式为1
   IE=0x92;                               //允许全局中断,允许定时器/计数器0溢出中断,允许串口接收终端
   T2CON = 0x39;                          //设置定时器2的工作模式为波特率发生器方式,
   RCAP2H = 0xFF;                         //设置波特率为3138Hz
   RCAP2L = 0x11;
   SCON = 0x50;                           //设置串口工作方式为方式1
   TR2 = 0x01;                            //启动定时器2
   TR0=0x01;                              //启动定时器/计数器0
   srand(255+rand());                     //设置随机数的初值
}
/*******************************************************
 名称:   发送模块   
 功能:  利用串口发送1个字符
 参数:  无
 返回值:无
*******************************************************/
void SendChar(uchar dat)  
{
    SBUF=dat;                             //发送数据送发送缓冲区
    while(TI==0);                         //等待发送完成
    TI=0;                                 //置发送完成标志
}
/*******************************************************
 名称:   接收中断模块   
 功能:  接收数据,将接收到的数据保存在接收缓冲区,
         未收到则置缓冲区为0xFF
 参数:  无
 返回值:无
*******************************************************/
void Receive (void) interrupt 4
{
    if(RI)                                //当接收中断标志设立时,开始读取接收到的数据
    {
        RI = 0;                           //清除接收中断标志
		Receive_data=SBUF;                //将接收到的数据送缓冲区保存
    }
	else                                
	    Receive_data=0xFF;                //未接收到数据则置缓冲区为FF
}
/*******************************************************
 名称:   检测模块   
 功能:  检测是否有障碍物
 参数:  无
 返回值:无
*******************************************************/
void Detect(void)
{   
    uchar temp;
	EA=0;                                 //关闭全局终端
	temp=Receive_data;                    //读取接收缓冲区中的数据
    if(temp==Check)                       //如果接受到的信号等于发送的检测信号
    {
       P3_6=0x00;                         //响铃报警
	   Alarm_flag=0x01;                   //设立警报标志
	   counter=0x00;                      //警铃计时开始
	}
    EA=1;
}
/*******************************************************
 名称:   定时器中断模块
 功能:  定时更新随机数 设定警铃报警时间。
 参数:  无
 返回值:无
*******************************************************/
void Timer0Over(void) interrupt 1  
{ 
   if(count==0x32)                        
   { 
      Check=rand();                       //产生一个随机检测信号
	  count=0x00;                         //随机数计时清零
   }
   count++;                               
   send_char(Check);                      //发送检测信号
   Detect();                              //调用检测模块
   counter++;
   if(Alarm_flag==1)                      //如果处于警报状态
   {
      if(counter==0x64)                   //如果警铃报警时间到
	  {
         P3_6=0x01;                       //停止警铃 
		 Alarm_flag=0x00;                 //清除警报标志
	  }
   }
   TL0=0xC0;                              //中断时间20ms
   TH0=0x63;
}
/*******************************************************
 名称:   主函数
 功能:  应用程序入口
 参数:  无
 返回值:无
*******************************************************/
void main(void)                       
{
   DeviceInit();                            //初始化定时器0与串口
   while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -