我是靠谱客的博主 淡定舞蹈,这篇文章主要介绍智能小夜灯(基于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代码如下(示例):

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//---------------写数据--------------// 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代码如下(示例):

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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); }

总结

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


最后

以上就是淡定舞蹈最近收集整理的关于智能小夜灯(基于PIC16F887)摘要一、课程设计任务书二、整体路线三、电路与程序设计总结的全部内容,更多相关智能小夜灯(基于PIC16F887)摘要一、课程设计任务书二、整体路线三、电路与程序设计总结内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部