📄 main.c
字号:
//红外报警系统
#include<REGX52.H>
//#include "1602S51.H"
sbit Alarm_sound=P1^3; //蜂鸣器,低电平有效
sbit LED_Green=P2^5; //正常工作指示 --绿
sbit LED_Test=P2^6; //测试状态指示 --红
sbit Relay_Control=P1^4; //继电器 低电平有效
sbit Red_LED1=P1^0; //红外接收头1
sbit Red_LED2=P1^1; //红外接收头2
sbit Red_LED3=P1^2; //红外接收头3
sbit human=P3^0; //热释电按口
unsigned int Alarm_Number=10; //报警门限值,可通过按键改变
unsigned char Style_bit=0; //类型标志位
unsigned int Count_number=0; //计数
bit Alarm_bit=0; //强制报警开关
bit Test_bit=0; //测试标志
bit Red_recognize_bit1=0; //识别到物体标志
bit Red_recognize_bit2=0; //识别到物体标志
unsigned char delay_count; //灯的开关状态 延迟计数,当到一定次数,就进行开关灯操作,
//这样做的好处时为了使灯的闪烁时间不影响其他子程序,如按键扫描
unsigned char style[6]={"STYLE:"}; //显示 Style 类型
unsigned char raster[6]={"Raster"};//显示 光栅
unsigned char identify[8]={"Identify"}; // 显示 人体识别
unsigned char TestModel[9]={"TestModel"}; //显示 测试模式
unsigned char count[7]={"Count: "}; // 显示 人体识别
unsigned char change[9]={"Alarm_Num"};
unsigned char Clear9[9]={" "}; //用于清屏
unsigned char Clear16[16]={" "}; //用于清屏
unsigned char Warning[16]={" Warning! "};
void Alarm_CLOSE(void);
void Alarm_OPEN(void);
void Key_Scan(void);
void Test(void);
//------------------------------------------------------
//液晶1602相关定义
sbit LCDE=P2^7;
sbit RW=P3^4;
sbit RS=P3^5;
wr_com(unsigned char comm);//********写控制字符程序 E=1 RS=0 RW=0**********//
wr_data(unsigned char dat);//*****当前位置写字符子程序:E=1 RS=1 RW=0
void display(unsigned char addr,unsigned char *a,unsigned char c);
unsigned char rd_bf();//*****忙状态检查*******//
//*************delay_ms********************************
void delay_10us(unsigned char x)
{
while(x--);
}
void delay_ms(unsigned char cnt)
{
unsigned char i;
do {
i = 4;
do {
delay_10us(39);
} while(--i);
} while(--cnt);
}
//====================================================
// 1602液晶相关
wr_com(unsigned char comm)//********写控制字符程序 E=1 RS=0 RW=0**********//
{
LCDE=0;
RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
P0=comm;
RS=0;
RW=0;
LCDE=0;
}
wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;
RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
P0=dat;
LCDE=0;
RS=0;
RW=0;
}
unsigned char rd_bf()//*****忙状态检查*******//
{
unsigned char i;
//P0=0xff;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=P0;
LCDE=0;
// while(i){i=P0_7;}
return(i);
}
void init_LCD()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay_ms(5);
wr_com(0x38);
delay_ms(5);
wr_com(0x38);
delay_ms(5);
//rd_bf();
//delay5ms();
wr_com(0x01); ///***清屏****
delay_ms(5);
rd_bf();
delay_ms(5);
wr_com(0x06); ///****光标移动设置***
delay_ms(5);
rd_bf();
delay_ms(1);
wr_com(0x38); ////***显示模式设置****
delay_ms(1);
rd_bf();
delay_ms(1);
wr_com(0x0f); /////***显示开***
delay_ms(1);
rd_bf();
delay_ms(1);
wr_com(0x40); //set cgram address
delay_ms(1);
// rd_bf();
}
//---------------------------------------
//名称:显示子程序
//功能:在指定地方显示字符
//入口:a 是指向要显示的数组
// addr是要显示的地址
// c 为数组长度
//返回:无
void display(unsigned char addr, unsigned char *a, unsigned char c)
{
unsigned char i;
// if(rd_bf())
wr_com(addr);
for(i=0;i<c;i++)
{
rd_bf();
wr_data(a[i]);
delay_10us(1);
}
}
//---------------------------------------------------------------
//功能:数据输出
//输入:str为要显示的数据,X为坐标
void Printf_Number(unsigned char X,unsigned long Temp)
{
unsigned char i = 8;
char vec[9];
char *ptr=vec;
vec[i] = 0;
do
{
vec[--i] = Temp%10 + '0';
Temp /= 10;
}
while (Temp!=0);
ptr=ptr+i;
wr_com(X);
while((*ptr) != '\0')
{
// wr_lcd (dat, *ptr);
rd_bf();
wr_data(*ptr);
ptr ++;
delay_10us(2);
}
}
void main(void)
{
P0=0;
P1=0xff;
P2=0xFF;
P3=0xff;
Alarm_sound=1; //关蜂鸣器
LED_Green=1;
LED_Test=0;
Relay_Control=1;
init_LCD(); //初始化1602
display(0x80,style,6); //第一行
display(0x88,raster,6); //第二行
display(0xc0,count,7); //第二行
// Print_Number(0xc7,12);
while(1)
{
//Printf_Number(0xc8,Alarm_Number);
Key_Scan();
if(Alarm_bit==1)
{
delay_count++;
delay_ms(10); //延迟10MS
if(delay_count>100) //当延迟100次10毫秒=1S
{
delay_count=0;
Relay_Control=~Relay_Control; //开灯 或 关灯 ---------达到让报警时灯闪烁的效果
}
}
switch(Style_bit)
{
case 0: if(Alarm_bit==0) //光栅模式
{
Test();
if(Count_number>Alarm_Number) //当超过设定的门限值,就报警
{
Count_number=0;
Alarm_OPEN();
Alarm_bit=1;
}
}
break;
case 1: if(human==1&&Alarm_bit==0) //人体识别模式
{
if(Red_recognize_bit1==1) //每一个跳变数一次,为了防止一次多数问题
{
Red_recognize_bit1=0;
LED_Green=1;
Count_number++;
display(0xc7,Clear9,7); //清屏
display(0xc0,count,7);
Printf_Number(0xc8,Count_number);
Red_recognize_bit1=0;
if(Count_number>Alarm_Number) //当超过设定的门限值,就报警
{
Count_number=0;
Alarm_OPEN();
Alarm_bit=1;
}
}
}
else
{
LED_Green=0;
Red_recognize_bit1=1;
}
break;
default:break;
}
}
}
//------------------------------------------
//按键扫描子程序
//------------------------------------------
void Key_Scan(void)
{
unsigned char temp;
P2_0=1;
P2_1=1;
P2_2=1;
P2_3=1;
temp=P2;
temp=temp&0x0f;
if(temp!=0x0f) //改变
{
P2|=0x0f;
delay_ms(10);
temp=P2;
temp=temp&0x0F;
if(temp!=0x0F)
{
switch(temp)
{
case 0x0E: Style_bit++;
if(Style_bit==2)Style_bit=0;
switch(Style_bit) //做界面
{
case 0: Count_number=0;
display(0x87,Clear9,9); //清屏
display(0xc0,Clear16,16); //清屏
display(0xc0,count,7); //
display(0x88,raster,6);break; //光栅模式
case 1: Count_number=0;
display(0x87,Clear9,9); //清屏
display(0xc0,Clear16,16); //清屏
display(0xc0,count,7); //
display(0x88,identify,8); break; //人体识别模式
default:break;
}
break; //改变类型 Test_bit=-Test_bit 调试模式
case 0x0D: Alarm_bit=~Alarm_bit;
if(Alarm_bit==1)
{
Alarm_OPEN();
}
else
{
Alarm_CLOSE();
display(0xc0,Clear16,16); //清屏
display(0xc0,count,7); //第二行
}
break; //强制开报警 1101
case 0x0B: Count_number=0;
Alarm_Number++;
display(0xc0,change,9);
display(0xca,Clear9,5); //清屏
Printf_Number(0xca,Alarm_Number); break; //加加 1011
case 0x07: Count_number=0;
Alarm_Number--;
display(0xc0,change,9);
display(0xca,Clear9,5); //清屏
Printf_Number(0xca,Alarm_Number); break; //减减 // 0111
default:break;
}
while(temp!=0x0f)
{
P2|=0x0f;
temp=P2;
temp=temp&0x0f;
}
}
}
}
//开关警报
void Alarm_OPEN(void)
{
Alarm_sound=0; //开蜂鸣器
Relay_Control=0; //开灯
display(0xc0,Warning,16);
}
void Alarm_CLOSE(void)
{
Alarm_sound=1; //关蜂鸣器
Relay_Control=1; //关灯
display(0xc0,count,7);
Alarm_bit=0; //关了报警的标志
Count_number=0;
}
void Test(void)
{
P3_2=1;
delay_ms(30);
if(((Red_LED1==0)&&(Red_LED2==0))||((Red_LED2==0)&&(Red_LED3==0))||((Red_LED1==0)&&(Red_LED3==0)))
{
LED_Test=1;
Red_recognize_bit1=1;
}
else
{
LED_Test=0;
if(Red_recognize_bit1==1)
{
Count_number++;
display(0xc7,Clear9,7); //清屏
display(0xc0,count,7);
Printf_Number(0xc8,Count_number);
Red_recognize_bit1=0;
}
}
P3_2=0;
delay_ms(30);
//
}
//void Identify_Model(void)
//{
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -