📄 ir_detect.c
字号:
/**********************************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++;
SendChar(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 + -