找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1309|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机教室人数实时检测系统仿真及源程序

[复制链接]
跳转到指定楼层
楼主
一、系统方案
1、本设计采用51单片机作为主控器。
2、红外传感器检测进出人数,液晶1602显示。
3、按键最多容纳人数,烟雾报警。


二、硬件设计
原理图如下:
三、单片机软件设计
1、首先是系统初始化
void lcd_init()
{
        lcd_write_com(0x38);
        lcd_write_com(0x0c);
        lcd_write_com(0x06);
        lcd_write_com(0x01);

}
2、液晶显示程序
void check_busy()
{  
        P0=0xff;
        do
        {
                rs=0;
                wr=1;
                en=0;
                en=1;
        } while(busy==1);
        en=0;
}
/****
*******1602写数据忙函数
*****/
void lcd_write_date(uchar date)
{
        check_busy();
        en=0;
        LCD_PORT=date;
        rs=1;
        wr=0;
        en=1;
        en=0;
}
/****
*******1602写命令函数
*****/
void lcd_write_com(uchar com)
{
        check_busy();
        en=0;
        LCD_PORT=com;
        rs=0;
        wr=0;
        en=1;
        en=0;
}
/****
*******1602写温度函数
*****/
void lcd_wendu(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        lcd_write_com(add);
        lcd_write_date(shi+'0');
        lcd_write_date(ge+'0');
}
3、按键程序
void keyscan()
{


                if(K1==0)
                {
                    delayms(10);        //消除抖动
                        if(flag1==0)
                        {
                                flag1=1;
                                count++;
                                if(count>=100) count=99;
                        buf_3[0]=count/10+'0';
                        buf_3[1]=count%10+'0';
                        lcd_write_str(0x80+0x40+8,buf_3);

                        }
                }
                else flag1=0;


        if(K2==0)                //检测按键K2(反转)是否按下
        {
                delayms(10);        //消除抖动
                        if(flag2==0)
                        {
                                        flag2=1;
                                if(count>=1)
                        count--;
                        buf_3[0]=count/10+'0';
                        buf_3[1]=count%10+'0';
                        lcd_write_str(0x80+0x40+8,buf_3);

                        }

        }        
        else flag2=0;
if(K3==0)                //检测按键K2(反转)是否按下
        {
                delayms(10);        //消除抖动
                if(K3==0)
                {
                                if(count >= set)
                                        LED = 0;
                                else
                                {
                                        BUZ = 0;
                                        delayms(500);
                                        BUZ = 1;
                                        delayms(500);
                                        BUZ = 0;
                                        delayms(500);
                                        BUZ = 1;
                                        delayms(500);
                                }
                }
                while(!K3) //检测按键是否松开
                {
                        delayms(3000);
                        BUZ = 1;        
                        LED = 1;
                }

        }        
  if(s1==0)                //检测按键K2(反转)是否按下
        {
                delayms(10);        //消除抖动
                if(s1==0)
                {
                                set++;
                          if(set>=100) set=99;
                                                buf_3[0]=set/10+'0';
                        buf_3[1]=set%10+'0';
                        lcd_write_str(0x80+8,buf_3);
                }
                while(!s1) //检测按键是否松开
                {

                }

        }        
          if(s2==0)                //检测按键K2(反转)是否按下
        {
                delayms(10);        //消除抖动
                if(s2==0)
                {
                                if(set>=1) set--;
                                                buf_3[0]=set/10+'0';
                        buf_3[1]=set%10+'0';
                        lcd_write_str(0x80+8,buf_3);
                }
                while(!s2) //检测按键是否松开
                {

                }

        }        
}

4、核心算法程序
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数功能:主函数
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
        uint i;
        count = 0;
  TMOD = 0x01;         //T0 16位工作方式
  IR_1=1;                                   //发射端口常态为高电平

        lcd_init();
        lcd_write_str(0x80,buf_1);
        lcd_write_str(0x80+0x40,buf_2);
        lcd_write_str(0x80+0x40+8,"00");
  while(1)
  {
   keyscan();
                if(yw==0) BUZ=0;
                else BUZ=1;
  }
}

四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表