智能家具设计与总结报告.doc

上传人:精*** 文档编号:860777 上传时间:2023-09-24 格式:DOC 页数:28 大小:251.28KB
下载 相关 举报
智能家具设计与总结报告.doc_第1页
第1页 / 共28页
智能家具设计与总结报告.doc_第2页
第2页 / 共28页
智能家具设计与总结报告.doc_第3页
第3页 / 共28页
智能家具设计与总结报告.doc_第4页
第4页 / 共28页
智能家具设计与总结报告.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、 目录一摘要二引言 要求 难点 重点 指导思想三设计方案与论证 单片机芯片的选择方案与论证 显示的选择方案与论证 时钟芯片的选择方案与论证 温度传感器的选择方案与论证四硬件电路设计五系统原理六系统流程七软件测试 测试元件 测试内容八心得体会九参考文献十附录 智能家居设计与总结报告一. 摘要随着社会生产力的不断提高,单片机技术已广泛应用于各种领域,成为一种比较成熟的技术。本设计基于AT89S52单片机设计了集万年历、温度传感器与烟雾传感器为一起的小型小型室内环境检测系统。电路分为LM016 LCD显示、DS1302时钟芯片,DS18B20 温度传感器、湿度传感器和MAX232。该设计主要通过数个

2、按键、一个LCD1602、一个DS1302时钟芯片、一个DS18B20温度模块等器件完成时间、日期的显示、声音提示、液晶显示、灯光警告、复位等功能。关键词:单片机、LCD1602、DS1302、DS18B20、MAX232二引言要求:使用单片机设计一个简易的室内监测环境系统,实现下述功能:(1)自动更新时间与日期及温度,且能够显示在LCD液晶屏上。(2)烟雾报警,并且使用发光二极管、蜂鸣器等进行警告提示、正确提示的声光报警功能。统的主要控制芯片(3)光控开关,通过光敏二极管实现。重点:对各主要模块进行讲解及对程序的论述,了解全局电路原理图及显示原 理。难点:具有万年历功能,能够调节时间及日期;

3、(2)在超过温度范围时,发出温度报警提示。本论文的指导思想 本论文先对系统指定的主要芯片进行选择和论证,确定了选定AT89S52作为系统的主要控制芯片,时钟芯片DS1302提供时钟,数字时温度传感器实现温度显示,显示部分采用LCD显示屏。 三、方案设计与论证(1)单片机芯片的选择方案与论证方案1:采用89S52作为主要的核心芯片,采用flashROM,内部具有4KB的存储空间,能在3V的超低压工作,而且与MCS-51单片机完全兼容。但是运用于电路设计中不具有ISP在线编程功能,当对电路进行调试时,由于程序的错误修改或新增功能需要烧入程序时,对芯片的多次拔插可能对芯片造成一定的损坏。方案2:采用

4、89S52,片内ROM全部采用FlashROM能在3V的超低压下工作,同时也与MCS-51单片机兼容,该芯片内部为8KB ROM的存储空间,也具有89C51的功能,切具有在线编程可擦除技术,当对电路进行调试时,由于程序的错误修改或新增功能需要烧入程序时,不需对芯片的进行多次拔插,所以不会对芯片造成损坏。(2)显示模块选择方案与论证方案1:采用LED数码管进行动态扫描,虽然LED数码管价格适中,对于显示数字也较合适,然而在需要多为狮子与字幕显示时编程较复杂,占用单片机口线多。方案2:采用点阵式数码管显示,点正事数码管由四行四列发光二极管组成,对于显示文字比较适合,但用在显示数字时比较浪费,而且价

5、格也较高,所以不采用此方式作为显示。方案3:采用LCD液晶屏显示,LCD液晶屏显示虽然价格较高,但其显示功能强大,可以显示字符,且需要的接口线少。 所以采用LCD液晶屏作为显示。(3)时钟芯片的选择方案与论证方案1:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒的计数,采用此种方案虽然可以减少芯片的使用,节约成本,但是实现时间误差较大。方案2:采用DS1302作为时钟芯片,DS1302是一种高性能时钟芯片,可自动对时间日期进行计数,且精度高,位的RAM作为数据暂存区,工作电压在2.5V-5.5V,2.5V时耗电小于300mA。因而采用DS1302提供时钟。(4)温

6、度传感器的选择方案与论证方案1:使用热敏电阻作为传感器,并与一相应电阻进行串联分压,利用热敏电阻的温度特性,采集量电阻变化的分压值,进行A/D转换。此设计方案需用A/D转换电路,增加硬件成本,而且热敏电阻的温度特性曲线并不是严格线性的,会产生较大误差。方案2:采用数字时温度传感器DS18B20,此类传感器位数字传感器,而且仅需要一条数据线进行传输,易于与单片机进行连接,可以去除转换模块,降低硬件成本,简化系统模型。且数字时温度传感器还具有测量精度高,范围广等优点。所以采用数字式温度传感器DS18B20测量温度。电路设计最终方案综上各方案论证,对此次作品的方案决定:采用AT89S52作为主控制系

7、统,DS1302提供时钟,DS18B20数字温度传感器测量温度,LCD液晶屏作为显示模块。四、硬件电路设计系统总体框图如下:DS18B20 模块键盘输入 电路 主 控 模 块 蜂鸣器DS1302时钟模块显示电路 图1.1 系统硬件模块图模块说明:DS1302时钟模块可以显示当前时间、日期及星期; 键盘输入电路可以调整日期及时间; DS18B20温度模块可以测量当前室内温度; 蜂鸣器模块可以提供烟雾警示; 显示电路显示当前系统运行情况。DS1302时钟电路的设计单片机必须在时钟的驱动下才能工作.在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决

8、定单片机的工作速度。图1.2外部振荡源电路一般选用石英晶体振荡器。此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。电路中两个电容 C1,C2的作用有两个:一是帮助振荡器起振;二是对振荡器的频率进行微调。C1,C2的典型值为30PF。单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。其大小是时钟信号频率的倒数,常用fosc表示。如时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12s。2、复位电路的设计单片机的第9脚RST为硬件复位端,只要将该端持续4个

9、机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如图1.3所示: 图1.3复位电路值得注意的是,在设计当中使用到了硬件复位和软件复位两种功能,由上面的硬件复位后的各状态可知寄存器及存储器的值都恢复到了初始值,而前面的功能介绍中提到了倒计时时间的记忆功能,该功能的实现的前提条件就是不能对单片机进行硬件复位,所以设定了软复位功能。软复位实际上就是当程序执行完毕之后,将程序指针通过一条跳转指令让它跳转到程序执行的起始地址。3、显示电路的设计显示功能与硬件关系极大,当硬件固定后,如何在不引起操作者误解的前提下提供尽可能丰富的信息,全靠软件来解决。4、键盘扫描电路的设计键盘

10、是人与微机系统打交道的主要设备。关于键盘硬件电路的设计方法也可以在文献和书籍中找到,配合各种不同的硬件电路,这些书籍中一般也提供了相应的键盘扫描程序。站在系统监控软件设计的立场上来看,仅仅完成键盘扫描,读取当前时刻的键盘状态是不够的,还有不少问题需要妥善解决,否则,人们在操作键盘就容易引起误操作和操作失控现象。在单片机应用中键盘用得最多的形式是独立键盘及矩阵键盘。如图1.4开关电路。 图1.4开关电路一般用在对硬件电路要求不高的简单电路中;矩阵键盘更适合于多按键电路。关于消除在按键过程中产生的“毛刺” 现象。这里采用最常用的方法,即延时重复扫描法,延时法的原理为:因为“毛刺”脉冲一般持续时间短

11、,约为几ms,而我们按键的时间一般远远大于这个时间,所以当单片机检测到有按键动静后再延时一段时间(这里我们取10ms)后再判断此电平是否保持原状态,如果是则为有效按键,否则无效。 液晶显示屏电路五系统原理 本系统是由AT89S52单片机为控制核心,时钟电路由DS1302提供,它可以对年、月、日、星期、时、分、秒进行计时,温度的采集由DS18B20构成,用LCD1602来显示数据,键盘输入电路可以调整时间及日期,通过语言编程,从DS1302寄存器中读取数据信息,从DS18B20中读取温度信息数据,再编程将以上信息送入LCD1602显示出来,同时通过键盘扫描来调整日期。 图1.5 系统总原理框图六

12、系统流程开始初始化读、写时间、日期、温度分离时间、日期、温度显示值键盘扫描子程序显示子程序结束 图1.6主程序流程图时间调整流程图控制键有效,进入年调整程序控制键有效,进入月调整程序开始等待按键程序等待按键程序减键有效加键有效加键有效减键有效月减1月加1年加1年减1控制键有效,进入日调整程序控制键有效,进入星期调整程序等待按键程序等待按键程序加键有效加键有效减键有效减键有效日减1星期减1星期加1日加1控制键有效,进入小时调整程序控制键有效,进入分调整程序等待按键程序等待按键程序减键有效加键有效减键有效加键有效时加1时减1分加1分减1按键有效,跳出时间调整程序,进入主循环程序 图1.7时间调整程

13、序流程图七软件测试1.测试元件序号名称型号1PC机HP-4416S2Keil3数字万用表DT92084Proteus 2、测试内容:蜂鸣器不报警,原因:蜂鸣器前置放大器放大倍数不够。解决办法:更改蜂鸣器前置放大器,以达到放大倍数要求。(2)LCD不显示字符,原因:LCD的电位器设置的阻值过高,导致字符显示亮度过低,字符显示而人眼无法察觉。解决办法:调整电位器阻值,直至屏幕亮度适中,可以正常显示字符为止。(3)LCD显示闪烁且亮度不均匀,原因:硬件电路电压不稳,导致芯片无法正常工作。解决办法:对调用的延时进行逐渐修改,可解决闪烁问题;其次本作品是动态扫描方式显示的数字,动态扫描很快,人眼无法识别

14、,但在调用显示程序时,如不在返回时屏蔽掉最后的附值,会出现很亮的现象,因而在现显示后面加了屏闭指令。加入温度程序后进行修改时间日期未按要求值变化。解决办法:由于DS18B20是串行通信数据,只用一个口线传输,在处理采集模拟信号时需要一定的时间,当把万年历的程序接入后,会对延时有很大的影响。因而在调用温度子程序时,先关闭定时器1中断允许,再介入温度子程序后再打开定时器1中断允许,从而解决此问题。八心得体会在整个设计过程中,发挥团队精神,分工合作,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。较好的完成了作品。达到了预期的目的,在最初的设计中,发挥“三个臭皮匠,顶个诸葛亮”的作用。相互

15、学习、相互讨论、研究。完了最初的设想。在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。反而达到事半功倍的效果。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同组员的讨论,理清了思路,反而得心应手。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一个脚印。也练就了我们的耐心,做什么事都在有耐心。此次比赛中学到了很多很多东西,这是最重要的。总之,参加电子竞赛我们的能力得到了全方位的提高。九参考文献(1)谭浩强.C程序设计【M

16、】.清华大学出版社,2005:1-300(2)阎石.数字电子技术基础【M】.北京:等教育出版社,1995.4(3)化成英.模拟电子技术基础【M】.北京:等教育出版社社.2001.12(4)万福君、潘松等.单片微机原理系统设计与应用【M】.北京:中国科学技术出版社,2005:1-357 (5)李权利,迟荣强等.单片机原理及接口技术【M】.北京:高等教育出版社,2004.1十附录#include #include /#include LCD1602.h/#include DS1302.h#define uint unsigned int#define uchar unsigned charsbit

17、 DS1302_CLK = P17; /实时时钟时钟线引脚 sbit DS1302_IO = P16; /实时时钟数据线引脚 sbit DS1302_RST = P15; /实时时钟复位线引脚sbit wireless_1 = P34;sbit wireless_2 = P35;sbit wireless_3 = P36;sbit wireless_4 = P37;sbit ACC0 = ACC0;sbit ACC7 = ACC7;sbit lightk=P12;sbit lightled=P37;sbit lightld=P32;sbit yanwu=P11;sbit ldk=P33;sbi

18、t beep=P24;sbit tempk1=P13;sbit tempk2=P14;uchar tempkk;uchar tempkl;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,时到日,月,年位闪的计数sbit Set = P20; /模式切换键sbit Up = P21; /加法按钮sbit Down = P22; /减法按钮sbit out = P23; /立刻跳出调整模式按钮-sbit DQ = P10; /温度传送数据IO口char done,count,temp,fl

19、ag,up_flag,down_flag;uchar temp_value; /温度值uchar TempBuffer5,week_value2;void show_time(); /液晶显示程序/*1602液晶显示部分子程序*/Port Definitions*sbit LcdRs= P25;sbit LcdRw= P26;sbit LcdEn = P27;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/内部等待函数*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdE

20、n=1;_nop_(); LcdEn=0;return DBPort;/向LCD写入命令或数据*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意顺序LcdEn=1;_nop_();/注意顺序LcdE

21、n=0;_nop_();LCD_Wait();/设置显示模式*#define LCD_SHOW0x04 /显示开#define LCD_HIDE0x00 /显示关 #define LCD_CURSOR0x02 /显示光标#define LCD_NO_CURSOR0x00 /无光标 #define LCD_FLASH0x01 /光标闪动#define LCD_NO_FLASH0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|DisplayMode);/设置输入模式*#defin

22、e LCD_AC_UP0x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 画面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LC

23、D_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动/液晶字符输入的位置*void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);/将字符输出到液晶显示void Print(un

24、signed char *str)while(*str!=0)LCD_Write(LCD_DATA,*str);str+;/*DS1302时钟部分子程序*/typedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString11;unsigned char TimeString9;SYSTE

25、MTIME;/定义的时间类型SYSTEMTIME CurrentTime;#define AM(X)X#define PM(X)(X+12) / 转成24小时制#define DS1302_SECOND0x80 /时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE0x82#define DS1302_HOUR0x84 #define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C void DS1302InputByte(unsigned char d

26、) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0

27、; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr)/读取DS

28、1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char ReadValue;ReadValue

29、= Read1302(DS1302_SECOND);Time-Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time-Day

30、 = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time-Week = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0x70)4)*10 + (ReadValue

31、&0x0F);void DateToStr(SYSTEMTIME *Time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString if(hide_year2) /这里的if,else语句都是判断位闪烁,2就不显示,输出字符串为 2007/07/22 Time-DateString0 = 2; Time-DateString1 = 0; Time-DateString2 = Time-Year/10 + 0; Time-DateString3 = Time-Year%10 + 0; else Time-DateString0 = ; Time-DateString

32、1 = ; Time-DateString2 = ; Time-DateString3 = ;Time-DateString4 = /;if(hide_monthDateString5 = Time-Month/10 + 0; Time-DateString6 = Time-Month%10 + 0; else Time-DateString5 = ; Time-DateString6 = ; Time-DateString7 = /;if(hide_dayDateString8 = Time-Day/10 + 0; Time-DateString9 = Time-Day%10 + 0; el

33、se Time-DateString8 = ; Time-DateString9 = ; if(hide_weekWeek%10 + 0-1; /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 else week_value0 = ; week_value1 = 0;Time-DateString10 = 0; /字符串末尾加 0 ,判断结束字符void TimeToStr(SYSTEMTIME *Time) /将时,分,秒数据转换成液晶显示字符放到数组 TimeString; if(hide_hourTimeString0 = Time-Hou

34、r/10 + 0; Time-TimeString1 = Time-Hour%10 + 0; else Time-TimeString0 = ; Time-TimeString1 = ;Time-TimeString2 = :; if(hide_minTimeString3 = Time-Minute/10 + 0; Time-TimeString4 = Time-Minute%10 + 0; else Time-TimeString3 = ; Time-TimeString4 = ; Time-TimeString5 = :; if(hide_secTimeString6 = Time-Se

35、cond/10 + 0; Time-TimeString7 = Time-Second%10 + 0; else Time-TimeString6 = ; Time-TimeString7 = ; Time-DateString8 = 0;void Initial_DS1302(void) /时钟芯片初始化 unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) /判断时钟芯片是否关闭 Write1302(0x8e,0x00); /写入允许Write1302(0x8c,0x07); /以下写入初始化时间 日期:07/07/25.

36、星期: 3. 时间: 23:59:55Write1302(0x88,0x07);Write1302(0x86,0x25);Write1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); /禁止写入/*ds18b20子程序*/*ds18b20延迟子函数(晶振12MHz )*/ void delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函数*/void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 学术论文 > 毕业设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922