51单片机及红外热释电传感器仿真

描述

1.51单片机+LCD1602显示屏+红外热释电传感器仿真

功能:

(1)红外热释电传感器采用按键模拟输入信号,由于传感器检测人体时输出高电平,按键需要下拉电阻作为无信号时的电平状态。

(2)当热释电检测到人体时,LED灯亮以及蜂鸣器响起。

仿真

2.程序设计(采用keil5进行编程)

#include < reg52.h >
#include < intrins.h > 
#include < math.h >
#define uchar  unsigned char
#define uint   unsigned int   
//延时函数ms
void _delay_ms(uint t)
{
   uint i,j;
   for(i=0;i< t;i++)
     for(j=0;j< 120;j++);
}
//延时函数us
void _delay_us(uchar t)
{
   while(t >0)t--;
}


sbit  RS=P3^2;  //写信号
sbit  RWW=P3^3;  //读信号
sbit  E=P3^4;  //使能信号
#define e1   E=1 
#define rd1  RWW=1  
#define rs1  RS=1  
#define e0   E=0 
#define rd0  RWW=0 
#define rs0  RS=0 
#define PP P1
//写1602控制字
void  lcd1602_writecrtl(uchar  dat)
{
  rd0;//读信号置0
  rs0;//写信号置0
  _delay_us(5);
  PP=dat;
  e1;//使能信号置1
  _delay_us(5);
  e0;//使能信号置0
}
//写1602数据
void  lcd1602_writenumber(uchar dat)
{
  rd0;//读信号置0
  rs1;//写信号置1
  _delay_us(5);
  PP=dat;
  e1;//使能信号置1
  _delay_us(5);
  e0;//使能信号置0
}
//1602初始化
void  lcd1602_init()  
{
  lcd1602_writecrtl(0x38); //显示模式
  lcd1602_writecrtl(0x06); //显示光标移动位置
  lcd1602_writecrtl(0x0c); //显示开及光标设置
  lcd1602_writecrtl(0x01); //显示清屏
}
//显示地址
void  lcd1602_adr(uchar dat)  
{
  lcd1602_writecrtl(0x80 | dat);
}
//行显示-
void LCD1602_string(uchar hang,uchar lie,uchar const *p)
{
  uchar a;
  if(hang == 1) a = 0x00;
  if(hang == 2) a = 0x40;
  a = a + lie - 1;
  lcd1602_adr(a);
  while(1)
  {
    if(*p == '�') break;
    lcd1602_writenumber(*p);
    p++;
  }
}
uchar code zifux[]="0123456789abcdef";
uchar code zifu0[]="Pyroelectric    ";
uchar code zifu2[]="   Alarm       ";
uchar code zifu1[]="   Normal      ";
sbit  key_sr= P2^1;//传感器
sbit led= P0^0; //报警
sbit  beer= P2^7;//报警
uint jishu1=0;
uint jishubeer=0;
uchar bz=0;
//---------------
void ct()                                                              
{  
   //显示
  if(bz==0)  LCD1602_string(2,1,zifu1); 
  if(bz==1)  LCD1602_string(2,1,zifu2);
  //判断
  if((key_sr==1)&&(bz==0)) {bz=1;jishu1=0;}
  //报警
  if(bz==1)
  {
     jishubeer=(jishubeer+1)%100;
     if(jishubeer >50){beer=led=0;} 
   else {beer=led=1;}
   //延时
   jishu1=jishu1+1;if(jishu1 >500) {jishu1=0;bz=0;}
  }
  else {beer=led=1;}
}
//主函数
void main()
{ 
  _delay_ms(1);
  key_sr=0;
  //初始化
  lcd1602_init();
  LCD1602_string(1,1,zifu0);
  LCD1602_string(1,1,zifu0);
  LCD1602_string(2,1,zifu1);
  while(1)
   {
    ct();


  } 
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
jf_02471012 2023-12-26
0 回复 举报
程序中 行显示那一块有个*p== 中间应该是什么符号啊 看着是个乱码 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分