《智能万年历报告书.doc》由会员分享,可在线阅读,更多相关《智能万年历报告书.doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、参赛题目:智能万年历小组名称: Double-S 2011年 5 月 29日姓名史金龙史小雪联系电话所在学部信息科学与技术指导教师邵佳林老师课题分类A-单片机类 B-数模电类一、 参赛题目智能万年历二、 简介 本机可以进行时间、日期、年、温度智能显示,定时控制电铃进行作息提示,专为试验室,小型办公场合设计,具有体积小,功耗小等特点。面板实物图三、 方案本系统采用Atmel 公司的AT89S52单片机,是一种低功耗、高性能 CMOS 8 位微控制器,具有以下特点: l 8K 在系统可编程 Flash 存储器。l 与 MCS-51 单片机产品兼容l 1000 次擦写周期l 全静态操作:0Hz33H
2、zl 三级加密程序存储器l 32 个可编程 I/O 口线l 三个 16 位定时器/计数器l 八个中断源l 全双工 UART 串行通道l 低功耗空闲和掉电模式l 掉电后中断可唤醒l 看门狗定时器l 双数据指针l 掉电标识符按键设置模块单片机AT89S52最小系统数码管显示模块智能温度传感器模块电铃智能控制模块数字时钟芯片模块直流稳压电源模块四、各模块功能介绍1数字时钟芯片模块使用美国 DALLAS 公司推出的一种高性能、低功耗、带 RAM 的实时时钟 DS1302,采用 DS1302 作为主要计时芯片,可以作到计时准确,更重要的是 DS1302 可以在很小电流的后备电源(2.5V5.5V 电源,
3、在 2.5V 时耗电小于 300nA)下继续计时,而且 DS1302 可以编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本不耗电。2智能温度传感器单线数字温度传感器DS18B20,即“一线器件”,其具有独特的优点:(1)采用单总线的接口方式 与微处理器连接时,仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,如环境控制、设备过程控制、测温类消费电子产品、热感测系统等,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。(2)测量温度范围宽 测量精度高 DS18B20 的测量范
4、围为 -55 + 125 ; 在 -10+ 85C范围内,精度为 0.5C 。(3)在使用中不需要任何外围元件。(4)持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。(5)供电方式灵活 DS18B20可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。(6)测量参数可配置 DS18B20 的测量分辨率可通过程序设定 912 位。(7)负压特性 电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。(8)掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存
5、分辨率及报警温度的设定值;(9)DS18B20具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围。3按键设置模块独立按键输入部分主要用于时间切换,时间调整,用查询法完成读键功能,采用软件消抖。4电铃智能控制模块报时用单片机外接直流+5V继电器控制交流220V电铃,即弱电控强电,可以通过单片机软件编程设定时间点和次数,主要用于实验室上下课或工作单位上下班提醒。5直流稳压电源模块用交流220V交流电通过变压器变压,再接整流桥整流,滤波电容滤波,再接稳压芯片7805及去噪电容组,稳压为+5V单片机电源。6数码管显示模块采用八段数码管进行数字的显示,数码管具有价格低廉,性能稳定
6、,显示清晰,亮度高,使用电压低,寿命长等优点,是数字显示的最佳选择。本机显示及时间切换调整说明:切换说明:(1)初始状态依次显示时间,星期,温度,其中时与分之间的两个LED由DS1302的秒寄存器计时控制;(2)当按转换按键AN1后,时间显示变为日期显示,两个LED改为一个亮,且停止闪烁;(3)再按一下转换按键AN1,改为年份显示,且LED全灭。调整说明:当按下时间调整按键AN3时,重复显示以上三个步骤,再按分别进入年份、日期、星期、时间调整状态,通过加键AN2减键AN4可以对其进行调整。升级说明: 本系统还可以进行软件升级设置,通过温度传感器的上下温度值设定以检测被测试地点温度是否合格,即实
7、现温度实时检测,通过数码管、发光二级管或电铃进行报警。五、程序流程图跳过ROM(0xCC) 开始 DS1302, 18B20初始化 跳过ROM(0xCC)写命令,读温度寄存器(0xBE)初始化大循环温度转换结束?NOYes处理温度数据写命令,启动温度转换(0x44)向该地址写一个数据使DS1302不具备写保护复位产生一个高电平写DS1302地址No大循环Yes数据写完了?复位产生一个高电平写DS1302地址 启动报时NO读一个字节数据数据读完?YES处理时间数据大循环报时否继电器控制电铃响YESNO转换按键是否按下调用转换函数显示转化YESNO调整按键是否按下调用调整函数显示调整YES显示时间
8、、温度、LED 六、万年历程序#include #include #include intrins.h /_nop_();延时函数用#define uchar unsigned char#define uint unsigned intsbit DQ=P33; /温度输入口 sbit naoling=P37; /继电器输出口sbit P31=P31;sbit P32=P32;uchar flag0,miao,shi,fen,flagbaoshi1;/定义共阳极字型码-uchar code dispcode=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80
9、,0x90,0xff,0xbf;uchar time =0,0,0,0;/用来储存时间uchar date =0,0,0,0;/用来储存日期uchar year =0,0,0,0;/用来储存年份uchar week =0; /用来储存星期uchar second =0; /用来储存秒uchar data temp_data=0x00,0x00; /读出温度暂放uchar data temp=0x00,0x00,0x00,0x00; /显示单元数据,共3个数据和一个运算暂用void display(uchar minute10,uchar minute1,uchar hour10,uchar h
10、our1,uchar week1,uchar temp1,uchar temp2,uchar temp3);uchar flag,aa=2,bb=0;void Disp(uchar flag);SYSTEMTIME time1; /在ds1302.h文件中已经定义了一个名字为SYSTEMTIME的结/构体,在这里我们定义一个变量名为time1的SYSTEMTIME结构体/*延时*/ void delay(uint t)for(t;t0;t-); /11um延时/*18B20复位函数*/ow_reset(void)char presence=1;while(presence)while(pres
11、ence)DQ=1;_nop_();_nop_();DQ=0; delay(50); / 550usDQ=1; delay(6); / 66uspresence=DQ; / presence=0继续下一步 delay(45); /延时500uspresence = DQ;DQ=1; /*18B20写命令函数*/向 1-WIRE 总线上写一个字节void write_byte(uchar val)uchar i;for (i=8; i0; i-) /DQ=1;_nop_();_nop_(); DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();/5usD
12、Q = val&0x01; /最低位移出delay(6); /66usval=val/2; /右移一位DQ = 1;delay(1); /*18B20读1个字节函数*/从总线上读取一个字节uchar read_byte(void)uchar i;uchar value = 0;for (i=8;i0;i-)DQ=1;_nop_();_nop_();value=1;DQ = 0; _nop_();_nop_();_nop_();_nop_(); /4usDQ = 1;_nop_();_nop_();_nop_();_nop_(); /4us if(DQ)value|=0x80;delay(6);
13、 /66usDQ=1;return(value);/*读出温度函数*/read_temp()ow_reset(); /总线复位write_byte(0xCC); / 发Skip ROM命令write_byte(0xBE); / 发读命令temp_data0=read_byte(); /温度低8位temp_data1=read_byte(); /温度高8位ow_reset();write_byte(0xCC); / Skip ROMwrite_byte(0x44); / 发转换命令/*温度数据处理函数*/void work_temp()uchar n=0;uchar flag3=1,flag2=
14、1; /数字显示修正标记if(temp_data1&0xf8)!=0x00) /如果是负数 temp_data1=(temp_data1); temp_data0=(temp_data0)+1; n=1; flag0=1;/负温度求补码if(temp_data0255)temp_data1+; /温度进位temp3=(temp_data0&0xf0)4)|(temp_data1&0x07)4); /温度暂放temp2=temp3/100;temp1=temp3/10%10;temp0=temp3%10;if(!temp2) temp2=0x0a; flag3=0; if(!temp1) tem
15、p1=0x0a; flag2=0; /最高位为0时都不显示if(n) temp2=0x0b;/负温度时最高位显示- flag3=0;/*DS1302读取时间参数*/void DS1302_read() DS1302_GetTime(&time1); /读取时间参数 second0=(time1.Second)%2; /对秒取2的余用于LED显示 time3=(time1.Minute)%10;/把分的个位数据存入time3 time2=(time1.Minute)/10;/把分的十位数据存入time2 time1=(time1.Hour)%10; /把时的个位数据存入time1 time0=(
16、time1.Hour)/10; /把时的十位数据存入time0 date3=(time1.Day)%10; date2=(time1.Day)/10; date1=(time1.Month)%10; date0=(time1.Month)/10; year1=(time1.Year)%10; year0=(time1.Year)/10; week0=(time1.Week);/*时间调整子程序*/unsigned char button_time(n,x,y) unsigned char n,x,y;if(P1_5=0) delay(5000); if(P1_5=0) if(n=0) n=y;
17、 else n-; /减按键 while(P1_5=0); if(P1_7=0) delay(5000); if(P1_7=0) n+; /加按键 if(n=x) n=0; while(P1_7=0); return n; /最小为0按键unsigned char button_date(n,x,y) unsigned char n,x,y;if(P1_5=0) delay(5000); if(P1_5=0) if(n=1) n=y; else n-; /减按键 while(P1_5=0); if(P1_7=0) delay(5000); if(P1_7=0) n+; /加按键 if(n=x)
18、 n=1; while(P1_7=0); return n; /最小为1按键/*显示子程序*/void display(uchar minute10,uchar minute1,uchar hour10,uchar hour1,uchar week1,uchar temp1,uchar temp2,uchar temp3) P2=0x7f; P0=dispcodeminute10;/显示分的十位 delay(100); P2=0xbf; P0=dispcodeminute1;/显示分的个位 delay(100); P2=0xdf; P0=dispcodehour10;/显示时的十位 delay
19、(100); P2=0xef; P0=dispcodehour1;/显示时的个位 delay(100); P2=0xf7; P0=dispcodeweek1; /显示星期 delay(100); P2=0xfb; P0=dispcodetemp1; delay(100); P2=0xfd; P0=dispcodetemp2; delay(100); P2=0xfe; P0=dispcodetemp3; /显示温度 delay(100); P2=0; P0=0xff; /*报时子程序*/void baoshi() /闹铃时间次数设定 miao=time1.Second;/读取秒 fen=time
20、1.Minute; /读取分 shi=time1.Hour; /读取时 if(shi=8&fen=0) flagbaoshi1=1; else if(shi=9&fen=45) flagbaoshi1=1; else if(shi=10&fen=0) flagbaoshi1=1; else if(shi=11&fen=45) flagbaoshi1=1; else if(shi=14&fen=0) flagbaoshi1=1; else if(shi=15&fen=45) flagbaoshi1=1; else if(shi=16&fen=0) flagbaoshi1=1; else if(s
21、hi=17&fen=45) flagbaoshi1=1; else flagbaoshi1=0; if(flagbaoshi1=1&miao2) flag=0; if(P1_6=0)/如果按下Time Set键一下,开始显示日期,再按一下开始显示年份,/再按一下,进入年份,日期,星期和时间的调节模式 delay(5000); if(P1_6=0)while(P1_6=0)Disp(flag);flag+;if(flag8)flag=0;Disp(flag); /*时间显示调整子程序*/void Disp(uchar flag)switch(flag)case 0:display(time0,t
22、ime1,time2,time3,week0,temp2,temp1,temp0); /调用子函数display,把存入数组time的数据给显示出来 LED(); break;case 1:display(date0,date1,date2,date3,week0,temp2,temp1,temp0); /调用子函数display,把存入数组date的数据给显示出来 P32=0; P31=1; break; case 2:display(aa,bb,year0,year1,week0,temp2,temp1,temp0); /调用子函数display,把存入数组year的数据给显示出来 P31
23、=1; P32=1; break; case 3:time1.Year=button_time(time1.Year,100,99);/调整年 DS1302_SetTime(0x8c,time1.Year); display(11,11,year0,year1,week0,temp2,temp1,temp0); break;case 4:time1.Month=button_date(time1.Month,13,12);/调整月 DS1302_SetTime(0x88,time1.Month); display(date0,date1,11,11,week0,temp2,temp1,temp
24、0); P32=0; break;case 5:time1.Day=button_date(time1.Day,32,31);/调整日 DS1302_SetTime(0x86,time1.Day); display(11,11,date2,date3,week0,temp2,temp1,temp0); break; case 6:time1.Week=button_date(time1.Week,8,7);/调整星期 DS1302_SetTime(0x8a,time1.Week); display(11,11,11,11,week0,temp2,temp1,temp0); break;case
25、 7:time1.Hour=button_time(time1.Hour,24,23);/调整时 DS1302_SetTime(0x84,time1.Hour); display(time0,time1,11,11,week0,temp2,temp1,temp0); LED(); break;case 8:time1.Minute=button_time(time1.Minute,60,59);/调整分 DS1302_SetTime(0x82,time1.Minute); display(11,11,time2,time3,week0,temp2,temp1,temp0); LED(); br
26、eak; /*结束*/六、器件详单单片机最小系统名称型号数量备注单片机AT89S521C1C230 PF2晶振M111.0592 MHz1按键复位键1C310uF1R11.5K1LED黄色小1限流电阻R141501限流温度传感器DS18B201R210K1上拉电阻时钟芯片DS13201晶振M232.768 KHZ1电容C4 C512pf2掉电保护电源3V5号电池(2节)+电池盒1R3、R4、R510K3上拉电阻按键设置模块按键AN1 AN2 AN3 AN4系统设定键4R8,R9,R10,R1110K4上拉电阻电铃控制继电器HRS4H-S-DC5V1R65101限流R710K1上拉三极管Q1S8
27、5501D3IN40071泄流二极管电铃AC 220v1显示电路三极管Q2-Q9S85508RP41.5K8基极限流电阻共阳极数码管CPS05011BR8D1、D2小2红色灯秒指示R12 、R13510欧2限流RP3150欧7段选限流插口信号线16,电源218排线信号线16,电源218RP1、RP210k16P0/P2口上拉电阻直流稳压电源电源变压器220v-6v/2W/50HZ1电源插头线1整流桥IN58174滤波电容C11000uf/25V1C210UF/50V防止自激振荡稳压芯片78051C3330UF/35V1减小波纹电压C41541消除高频噪声电源开关1电源扩展插口9 供电模块电路图