智能小夜灯(基于PIC16F887)


摘要

本文介绍了利用数字温度传感器DS18B20、光敏电阻LDR、人体红外传感器HC-SR501等作为识别传感器,基于PIC16F887的智能小夜灯装置。该系统通过通过时间模块判断是否是晚上(22:00~7:00),LDR判断光照强度是否足够,通过人体红外传感器判断是否有人经过,若以上三条件同时满足,点亮LED灯30秒,若不满足,则不动作。在LCD上显示日期及时间和DS18B20获取的温度值,通过按键可以设定闹钟,闹钟时间到,蜂鸣器间断响3秒。系统可以通过串口通信实现远端调试。该系统实际运行稳定,仿真精度较高,基本全部达到了题目的最高要求。


提示:以下是本篇文章正文内容,下面案例可供参考

一、课程设计任务书

1、课程设计基础内容及要求
(1)通过时钟芯片DS1302,读取当前时间,并将其显示在LCD屏上(年月日时分秒),判断是否是晚上(22:00~7:00)。
(2)通过读取光敏传感器LDR得知当前的光照强度,判断光照强度是否足够(阈值为30)
(3)通过人体红外传感器HC-SR501(仿真时可用按键做输入信号)判断是否有人经过。
(4)(1)(2)(3)都满足,点亮LED灯30秒后自动熄灭,若不满足,则不动作。
(5)通过按键可以设定闹钟,闹钟时间到,蜂鸣器间断响3秒
2.课程设计拓展内容及要求
(1)通过数字温度传感器DS18B20采集温度,并显示在LCD上
(2)可以通过按键进行时间设定
(3)可以通过串口通信实现远端调试
(4)可以通过按键手动开关灯

二、整体路线

在这里插入图片描述

三、电路与程序设计

在这里插入图片描述

  • 串口:
  • 串口发送:加回车换行,不加校验,不用HEX,波特率9600
  • 串口发送命令:(回车)ON 开灯 (回车) OFF 关灯
  • 串口助手打开COM1,COM2为COMPIM,COM1和COM2TX、RX交叉对接,所以COMPIM的RX接RC7/RX,TX借RC6/TX
  • 虚拟终端:两个分别接收TX和RX
  • 按键:
  • 按键HC_SR501:模拟人体红外传感器,按下为有人经过。当晚上有人经过,且光照强度不足可亮灯30s
  • 按键1:设置模式,顺序为时钟模式,时间调整模式,闹钟模式
  • 按键2:数值加
  • 按键3:数值减
  • 按键4:向左移位
  • 按键5:向右移位
  • 按键6:开灯关灯
  • LED:
  • 绿LED:小夜灯
  • DS1302:
  • 时钟初始时间:2020 11-15 00:00:00
  • 闹钟初始时间:00:00:20
  • 闹钟时间到间断蜂鸣3s
  • 通过时间模块判断晚上(22:00~7:00)
  • DS18B20:
  • 采用一线通信接口,读取温度显示在屏幕上(初始上电为85度,因为温度寄存器的初值为85)
  • LDR:
  • 光敏电阻,判断光照强度是否足够,小于等于30时可以亮灯

DS1302代码如下(示例):



//---------------写数据--------------//
void Ds1302Write(uchar addr, uchar dat)
{
	uchar n;
	RST = 0;
	NOP();
	SCLK = 0;//先将SCLK置低电平。
	NOP();
	RST = 1; //然后将RST(CE)置高电平。
	NOP();

	for (n=0; n<8; n++)//开始传送八位地址命令
	{
		DSIO = addr & 0x01;//数据从低位开始传送
		addr >>= 1;
		SCLK = 1;//数据在上升沿时,DS1302读取数据
		NOP();
		SCLK = 0;
		NOP();
	}
	for (n=0; n<8; n++)//写入8位数据
	{
		DSIO = dat & 0x01;
		dat >>= 1;
		SCLK = 1;//数据在上升沿时,DS1302读取数据
		NOP();
		SCLK = 0;
		NOP();	
	}	
		 
	RST = 0;//传送数据结束
	NOP();
}

//------------读数据------------//
uchar Ds1302Read(uchar addr)
{
	uchar n,dat,dat1;
	RST = 0;
	NOP();
	SCLK = 0;//先将SCLK置低电平。
	NOP();
	RST = 1;//然后将RST(CE)置高电平。
	NOP();

	for(n=0; n<8; n++)//开始传送八位地址命令
	{
		DSIO = addr & 0x01;//数据从低位开始传送
		addr >>= 1;
		SCLK = 1;//数据在上升沿时,DS1302读取数据
		NOP();
		SCLK = 0;//DS1302下降沿时,放置数据
		NOP();
	}
	NOP();
    TRISCbits.TRISC5=1;
	for(n=0; n<8; n++)//读取8位数据
	{
		dat1 = DSIO;//从最低位开始接收
		dat = (dat>>1) | (dat1<<7);
		SCLK = 1;
		NOP();
		SCLK = 0;//DS1302下降沿时,放置数据
		NOP();
	}

	RST = 0;
	NOP();
    TRISCbits.TRISC5=0;
	return dat;	
}

//-----------写初始化时间-----------//
void Ds1302Init(void)
{
	uchar n,dat;
    RST = 0;
	SCLK = 0;
    Ds1302Write(0x8E,0);		 //禁止写保护,就是关闭写保护功能
    for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
    {
        Ds1302Write(WRITE_RTC_ADDR[n],SET_TIME[n]);	
    }
	Ds1302Write(0x8E,0x80);		 //打开写保护功能
    Trans_Alarm_bit();
}

DS18B20代码如下(示例):

void ONE_WIRE_RESET(void)//DS18B20复位
{
    DQ_DIR=0;
    DQ=0;
   __delay_us(480);      //延时480us,480-960us之间
    DQ_DIR=1;
    while(DQ==1);
    __delay_us(100);
}

void WRITE_BYTE(char A)
{
    char i,j;
    for(i=0;i<8;i++)
    {
        if((A&0x01)==0x01)
            j=1;
        else
            j=0;
        A=A>>1;
        if(j==1)
        {
            DQ_DIR=0;
            DQ=0;
            __delay_us(4);//1us
            DQ_DIR=1;
            __delay_us(30);
        }
        else
        {
            DQ_DIR=0;
            DQ=0;
            __delay_us(35);
            DQ_DIR=1;
        }
    }
}

char READ_BYTE(void)
{
    char i,A;
    A=0;
    for(i=0;i<8;i++)
    {
        A=A>>1;
        DQ_DIR=0;
        DQ=0;
        __delay_us(4);
        DQ_DIR=1;
        __delay_us(4);
            if(DQ==1)
                A+=0x80;
                __delay_us(20);
    }
    return(A);
}

总结

这就是目前单片机课设题目,代码和实验报告全部开源,代码可能会跟描述有一些出入,是增加了老师现场布置的三题补充,兼容没有调好就先注释了


  • 2
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值