已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
天 津 大 学 网 络 教 育 学 院 专科毕业论文 题目:基于数字电路的交通信号灯控制系统设计 完成期限:2015年9月26日至2015年10月16日 学习中心:专业名称:电气自动化技术学生姓名: 学生学号:1指导教师:天津大学网络教育学院专科毕业论文基于数字电路的交通信号灯控制系统设计一、绪论1、课题的背景与意义随着电子技术的迅速发展,特别是大规模集成电路出现,给人类生活带来了根本性的改变,尤其是单片机技术的应用产品已经走进了千家万户。近年来,我国科技的不断发展,我国经济发展的支柱产业电子产业获得长足发展,各种电子产品琳琅满目,随处可见,随着电子产品的更新速度的加快,各种功能强大,款式新颖的电子产品不断问世。数字万年历便是这一发展趋势中的代表,数字万年历则顺应了人们对时间方面的要求。它的出现给人们的生活带来的诸多方便,在时间极显宝贵的现代生活中,其作用更是不言而喻。它在学校、车站、码头、剧院、医院、办公室等公共场所的应用非常广泛。但传统的数字万年历除显示时间之外,功能较为单一,逐渐失去了市场。顺应技术发展和人们生产、生活需求,各种功能的新式万年历不断涌现,且功能不断更新。数字万年历作为电子类的小产品以其方便、实用等优势成为市场上的宠儿,同时也成为单片机设计培训中一个很实用的课题。因为这个课题有很好的的开发性和可发挥性,因此对设计者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且要求设计的数字万年历在操作上力求简洁,功能上尽量齐全,显示界面也要出色。所以数字万年历无论从实用的角度和培养能力的角度都很有价值。二、系统硬件设计本系统以单片机为核心控制器,包含了时钟芯片的接口、键盘接口、温度检测接口以及液晶显示输出接口,因此在硬件设计中合理分配单片机的输入输出端口尤为重要,通过综合比较市场上的元器件的价格以及分析单片机的I/O 口数量,本系统最终选择了AVR 单片机中的 MEGA16 型,设计的硬件电路图见附录2,其单片机的I/O的分配如下:11个I/O口用于液晶显示,4个I/O口用于按键输入,3个 I/O 口用于时钟芯片,1个 I/O口用于温度检测,1个I/O口用于声音输出,单片机的20个I/O口充分利用。下面从系统硬件的各个组成部分一一做介绍。1、主控制器 ATmega16 单片机介绍 ATmega16带有16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512字节的EEPROM,1K字节的SRAM,32个通用I/O口线,32个通用工作寄存器,用于边界扫描 的JTAG 接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/计数器(T/C), 片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可 选差分输入级可编程增益(TQFP 封装)的ADC,具有片内振荡器的可编程看门狗定时器,一个SPI串行端口,以及六个可以通过软件进行选择的省电模式。工作于空闲模式时CPU 停止工作,而USART、两线接口、A/D转换器、SRAM、T/C、SPI端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态;ADC噪声抑制模式时终止CPU和除了异步定时器与ADC以外所有I/O模块的工作,以降低ADC转换时的开关噪声;Standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;扩展 Standby 模式下则允许振荡器和异步定时器继续工作。2、时钟电路 DS1302本系统时钟芯片选择了DS1302芯片,该芯片是DALLAS 公司推出的涓流充电时钟 芯片,内含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行 通信实。时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰 年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24或12小时格式。DS1302与 单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线:(1)RES(复位);(2)I/O( 数 据 线 );(3)SCLK(串行时钟)。时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302与ATmega16的接口电路图如图1所示:图 1DS1302 与 ATmega16 的接口电路图3、温度检测 DS18B20本万年历采用了美国 DAL-LAS公司最新推出的 DS18B20数字式温度传感器 ,并由 DS18B20和ATmega16组成了室温测量系统,可根据实际需要任意设定温度值,并进行自动控制。DS18B20 是美国DALLAS 公司继DS18B20 之后推出的增强型单总线数字式温度传感 器,它在转换速度、转换时间、传输距离、分辨率等方面较DS18B20 有了很大的改进,给 用户带来了更方便、更令人满意的效果。18B20与ATmega16的接口电路如图2所示:图 2 18B20与 ATmega16 的接口电路图4、液晶显示液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件。本设计中拟显示内容如表1所示。 表1 lcd12864画面1显示内容20090601星期一己丑年五月初九芒种19:25:0829.1度5、键盘接口按键输入部分主要用于时间调整、定时设置、闹钟设置以及查询公历某日对应的农历日期,最终确定由四个按键来实现上叙功能,由于按键比较少,所以用普通按钮接在 I/O 口,启用 I/O 口的内部上拉电阻,用查询法完成读键功能。6、语音闹铃模块报时是本套数字万年历的一个重要功能,报时器可用蜂鸣器和扬声器来实现,本次设计采用蜂鸣器实现闹铃报时。由于单片机I/O引脚输出的电流较小,所以单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。本次设计采用了一个很简单的电路来实现蜂鸣器的连接,利用一个三极管来放大驱动蜂鸣器,电路连接如图3所示。在本设计电路中,设计者采用PNP管9012来做为控制蜂鸣器的开关,由图3-3可以看出当PD6引脚为高电平时,PNP管截止,蜂鸣器不工作;当PD6引脚为低电平时,PNP管导通,蜂鸣器工作,其中R2为限流电阻。采用PNP管9012的作用是为了防止系统上电时峰鸣器发出声音,因为系统复位以后,I/O口输出的是高电平。用户可以通过程序控制PD6管脚的置低和置高来使蜂鸣器发出声音和关闭,同时,蜂鸣器的声音大小及音调可以通过调整PD6管脚的置高时间及输出的波形进行控制,这一点可以在调试程序的时候来实现。 图3 报时电路7、电源的设计电源变压器滤波电路整流电路稳压电路电源部分的设计目的就是为各个硬件提供工作电源。单片机ATmega16芯片,显示电路等都采用5V电源供电。具体的方案是用W7805集成稳压电源提供+5V的电压供给单片机。其原理是(以+5V为例介绍)用交流电220V通过变压器变压,变为交流的9V电压,再经过整流变为直流电后,再接一个W7805使其转换为所需的直流电作为外接电源。 稳压电源由电源变压器、整流电路、滤波电路和稳压电路四个部分组成,如图4所示图4 稳压电源原理图电源变压器的作用是将来自电网的220V交流电压uI变换为整流电路所需要的交流电压u1。在稳压电源中一般用四个二极管组成桥式整流电路,整流电路的作用是将交流电压u2变换成脉动的直流电压u3。由于输入电压u3发生波动、负载和温度发生变化时,滤波电路输出的直流电压u3会随着变化。因此,为了维持输出电压U0稳定不变,还需加一级稳压电路。在本次设计中采用+5V电压所以选用H7805稳压器。它的主要特点如下:1.输出电流可达1A 2.输出电压有:5V 3.过热保护 4.短路保护 5.输出晶体管SOA保护光靠一个稳压器还不行,还需要有电容或电阻与其连接才能得到较稳定的+5V电压。220V电压必须经过整流才可接到稳压器的输入端,则整个电源电路可分整流、滤波、稳压三部分。电路图如图5所示。图5 电源电路整流部分为桥式整流电路。滤波部分为带极性的电容,如图3-5中电容E2即为滤波电容其值取2200uF。 稳压部分接三端稳压集成芯片H7805,能输出5V稳压电源,电容C0来抵消输入线较长时的电感效应,以防止电路产生自激振荡,其容量较小,一般小于1uF。用E3消除输出电压中的高频噪声,并有滤波的作用。另外,二极管D5起保护作用。三 、系统软件设计本系统的软件部分主要要进行公历计算程序设计,公历转农历的算法的研究,温度 测量程序设计,按键的扫描输入等。程序开始运行后首先要进行初始化,把单片机的各引脚的状态按程序里面的初始化命令进行初始化,初始化完成后运行温度测量程序,读取出温度传感器测量出来的温度,然后运行公历计算程序,得到公历的时间、日期信息 , 再运行按键扫描程序,检测有无按键按下,如果没有按键按下则直接调用公历转农历程 序,根据得到的公历日期信息计算出农历的日期和年号,如果有按键按下则更新按键修 改后的变量后送给农历计算程序,由农历计算程序根据修改后的变量计算出对应的农历 年份,计算完成后运行显示程序,显示程序将得到的温度数据、公历信息、农历信息送给对应的数码管让其显示。系统总体程序流程图如图6所示:修改变量开始初始化按键显示输出结束读取温度读取时间扫描按键农历计算图6 系统整体流程图1、公历计算显示程序设计本系统使用的是时钟芯片 DS1302,公历程序主要完成从 DS1302 各个寄存器中读出 年、周、月、日、时、分、秒等数据,再进行处理。在首次对 DS1302 进行操作前,必 须对它进行初始化,然后从 DS1302 中读出数据,再经过处理后,送给液晶屏显示。公历程序流程图如图7所示:开始初始化DS1302DS1302开始振荡读取年、月、日、星期、时、分、秒将读取的数据处理后送液晶显示器图 7 公历计算程序流程图(1)DS1302内部寄存器DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD 码形式。其日历、时间寄存器及其控制字见表2。表2 DS1302的日历、时钟寄存器及其控制字寄存器名命令字取值范围各位内容写操作读操作76543210秒寄存器80H81H00-59CH10SECSEC分寄存器82H83H00-59010MINMIN小时寄存器84H85H01-12或00-2312/24010/APHRHR日期寄存器86H87H00-28、29、30、310010DATADATA月份寄存器88H89H01-1200010MMONTH周寄存器8AH8BH01-0700000DAY年寄存器8CH8DH00-9910YEARYEAR注:本数据均来自DS1302操作说明书。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COHFDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、 FFH(读)。CH:时钟停止位寄存器2 的第7 位12/24 小时标志 CH=0 振荡器工作允许bit7=1,12 小时模式CH=1 振荡器停止bit7=0,24 小时模式WP:写保护位寄存器2 的第5 位:AM/PM定义 WP=0 寄存器数据能够写入AP=1 下午模式WP=1 寄存器数据不能写入AP=0 上午模式 TCS:涓流充电选择DS:二极管选择位 TCS=1010 使能涓流充电DS=01 选择一个二极管 TCS=其它 禁止涓流充电DS=10 选择两个二极管 DS=00 或11, 即使TCS=1010, 充电功能也被禁止表3RS位配置表RS位电阻典型位00没有没有01R12K10R24K11R38K注:数据来源于DS1302操作说明书。(2)时间读取程序设计本系统的时间读取主要来源于单片机对DS1302的操作,在硬件上DS1302与单片机的 连接需要三条线,即SCLK(7)、I/O(6)、RST(5), DS1302与ATmega16的连接图。在软件上的操作可分为以下几个步骤:初始化DS1302:#asm.equ ds1302_port=0x18 ;PORTB.equ ds1302_io=5.equ ds1302_sclk=4.equ ds1302_rst=6#endasm/定义 DS1302 所使用的 I/O 口void rtc_init(unsigned char tc_on,unsigned char diodes,unsigned char res)res&=3;if (tc_on) res|=0xa0;if (diodes=1) res|=4;else if (diodes=2) res|=8; else res=0; ds1302_write(0x8e,0); ds1302_write(0x90,res); ds1302_write(0x8e,0x80);该函数的主要功能是设置是否使用涓流充电,复位 DS1302,发控制命令,允许写 DS1302。读取时间和日期。DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位 MSB(D7)必须为逻辑 1,如果 D7=0,则禁止写 DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定 RAM 数据;D5D1 指定输入或输出的特定寄存器;最低位 LSB(D0)为逻辑 0,指定写操作(输入),D0=1,指定读操作(输出)。void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec)*hour=bcd2bin(ds1302_read(0x85);*min=bcd2bin(ds1302_read(0x83);*sec=bcd2bin(ds1302_read(0x81);该函数的主要功能是读取 DS1302 的时间,读取小时、分钟、秒钟的具体值。void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char*year)*date=bcd2bin(ds1302_read(0x87);*month=bcd2bin(ds1302_read(0x89);*year=bcd2bin(ds1302_read(0x8d); 该函数的主要功能是读取 DS1302 的日期,月份和年份。时间设置。在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。void rtc_set_time(unsigned char hour,unsigned char min,unsigned char sec) ds1302_write(0x8e,0); ds1302_write(0x84,bin2bcd(hour); ds1302_write(0x82,bin2bcd(min); ds1302_write(0x80,bin2bcd(sec); ds1302_write(0x8e,0x80);该函数的主要功能是设置 DS1302 的时间,写入修改的小时、分钟、秒钟的具体值。void rtc_set_date(unsigned char date,unsigned char month,unsigned char year) ds1302_write(0x8e,0); ds1302_write(0x86,bin2bcd(date); ds1302_write(0x88,bin2bcd(month); ds1302_write(0x8c,bin2bcd(year); ds1302_write(0x8e,0x80);该函数的主要功能是设置 DS1302 的日期,月份和年份。2、农历转换程序设计农历转换程序主要是通过对当前公历日期的计算,得到当前的农历日期。(1)公历转农历算法研究公历,也就是太阳历,其本质就是对太阳在黄道上的视位置进行划分。农历,也就是月亮历,其本质就是对月球在白道上的视位置进行划分。本系统采用的方案是用查表法来 实现的。把农历的每年的月大月小和闰月情况编成一个用 32 位二进制数据,低 12/13 位表示每个月的大小,高16 位表示闰哪个月,最后把每个 32 位的二进制数据转换成 16 进制数据放在数组里,在查表的时候调用它。比如2006年农历的16进制数据为0x7155b,转换成二进制数如下:0000 0000 0000 01110001010101011011|-闰7月-|- 123456778910 11 12-|又如2007年农历的16进制数据为0x25d,转换成二进制数如下:0000 0000 0000 00000000001001011011|-无闰月-|- 12345678910 11 12 -|(2)干支纪年简介农历纪年法叫干支纪年法。是以十天干和十二地支组合来纪年的,干支就字面意义 来说,就相当于树干和枝叶。我国古代以天为主,以地为从,天和干相连叫天干,地和 支相连叫地支,合起来叫天干地支,简称干支。天干有十个,就是甲、乙、丙、丁、戊 、 己、庚、辛、壬、癸,地支有十二个,依次是子、丑、寅、卯、辰、巳、午、未、申、 酉、戌、亥。古人把它们按照一定的顺序而不重复地搭配起来,从甲子到癸亥共六十对 , 依次为:01.甲子 02.乙丑 03.丙寅 04.丁卯 05.戊辰 06.己巳07.庚午 08.辛未 09.壬申 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.癸亥六十年满后又重新开始,周而复始,不断循环。(3)公历转农历程序本系统设计的公历转农历程序的日期为 1921 年 2 月 8 日到 2100 年 2 月 8 日,将公 历 1921 年 2 月 8 日作为起点,对应的农历为 1921(辛酉)年正月初一。具体的转换程 序如下:zhuanhuan()static int nIsEnd,m,k,n,i,nBit;static long nTheDate;int y;wCurYear= nian; wCurMonth = yue; wCurDay= ri; y=wCurYear -1921;nTheDate=(y8)+(y6)+(y5)+(y3)+(y2)+wCurDay+wMonthAddwCurMonth - 1 - 38;if(!(wCurYear & 0x0003) & (wCurMonth 2)nTheDate+; nIsEnd = 0;m= 0;while(nIsEnd != 1)if(wNongliDatam =0)nBit = wNongliDatam; for(i=1;i1); nBit = (nBit & 0x0001);if (nTheDate y)wCurMonth = wCurMonth - 1;if(wCurMonth0)wCurMonth=-wCurMonth;yun=1;else yun=0;该函数是将读取到的公历的年份先赋值给wCurYear,先计算出当前公历年份距1921年的年数,y=wCurYear-1921;然后根据 y 计算出今天距离公历 1921 年 2 月 8 日的具体 天数,nTheDate=(y8)+(y6)+(y5)+(y3)+(y2)+wCurDay+wMonthAddwCurMonth-1-38;该公式中不包括公历 1921 年距今的闰年天数,所有的 2 月份全部都是按 28 天计算的,接下来就需要对 nTheDate 进行修正,if(!(wCurYear & 0x0003) & (wCurMonth 2)nTheDate+;如果碰到闰年,总天数 nTheDate 就加 1 天。通过得到的 nTheDate 进行查表计算出 当前距农历 1921 年的年数 m,然后就得到了当前农历的年份,wCurYear = 1921 + m;农历采用是干支纪年法,通过得到的 wCurYear 先计算出天干,并将计算出的天干 赋值给 led1,led1=(wCurYear+6)%10;然后根据 wCurYear 计算出地支,并将计算出的地支赋值给 led2, led2=(wCurYear+8)%12;3、温度测量程序设计(1)、DS18B20的测温原理DS18B20测温原理如图8所示。传感器中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明 显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在- 55 所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数 器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时, 停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。下图中的斜率累加 器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值,只要计 数门仍未关闭就重复上述过程, 直至温度寄存器值达到被测温度值, 这就是DS18B20的测温原理。斜率累加器计数比较器预置低温度系数晶振计算器1预置温度寄存器减到0计算器2高温度系数晶振减到0增加停止LSB位置/清除图8DS18B20的测温原理在正常测温情况下,DS18B20的测温分辩率为0.5以12位数据格式表示,其中最低 有效位(LSB)由比较器进行0.25比较,当计数器1中的余值转化成温度后低于0.25时, 清除温度寄存器的最低位(LSB),当计数器1中的余值转化成温度后高于0.25,置位温 度寄存器的最低位(LSB)。(2) 温度程序单总线上最基本的操作有初始化、写和读 3种,所有其它的操作都由这3种基本操 作组合而成。 初始化#asm.equ w1_port=0x12 ;PORTD.equ w1_bit=7#endasm/定义 18B20 所用的数据线在对 DS18B20 进行 ROM 和 RAM 操作之前,单片机首先发出一个复位脉冲(最小脉冲 宽度为 480us 的低电平信号),然后单片机释放单总线 I/O 线,使之处于接收状态。单 总线经过上拉电阻被拉至高电平。当DS18B20检测到 I/O端的上升沿时,就等待 15-60us, 然后向单片机发出应答脉冲(60-240us 的低电平信号)。初始化程序如下:unsignedchar DS18B20_init(unsigned char *addr,signed char temp_low,signed char temp_high,unsigned char resolution)if (ds18b20_select(addr)=0) return 0; resolution=(resolution5) | 0x1f; w1_write(0x4e);w1_write(temp_high); w1_write(temp_low); w1_write(resolution);if (ds18b20_read_spd(addr)=0) return 0;if ( ds18b20_scratch_pad.temp_low!=temp_low) |( ds18b20_scratch_pad.temp_high!=temp_high) |( ds18b20_scratch_pad.conf_register!=resolution) return 0;if (ds18b20_select(addr)=0) return 0;w1_write(0x48); delay_ms(15); return w1_init(); 写时序单片机把 I/O 线从高电平拉低至低电平时,做为一个写时序的开始。写时序分为写1 和写 0 两种。写 0 时,单总线要被拉低至少 60us,保证 DS18B20 能够在 15-45us 之间 能够正确的采样 I/O 总线上的“0”电平。若 I/O 线为高电平,即认为写入了一位 1,反 之,则认为写入了一位 0。写 1 时,单总线被拉低之后,在 15us 之内就要释放单总线。 在两个写周期间至少有 1us 的恢复期。写时序的程序如下:unsigned char ds18b20_select(unsigned char *addr)unsigned char i;if (w1_init()=0) return 0;if (addr) w1_write(0x55); i=0;dow1_write(*(addr+);while (+i8);else w1_write(0xcc);return 1; 读时序当单片机将 I/O 线从高电平拉至低电平时,就做为一个读周期的开始,并且 I/O 线保 持低电平的时间至少为 15us。DS18B20 的读时序也分为读 0 和读 1 两个过程。DS18B20 的读时序是从单片机把单总线拉低后,在 15us 后就要释放单总线,以让 DS18B20 把数 据传输到单总线上。DS18B20 在完成一个读时序过程,至少需要 60us 才能完成,并且在两位数据之间至少要有 1us 的恢复期。读时序的程序如下:unsigned char ds18b20_read_spd(unsigned char *addr)unsigned char i;unsigned char *p;if (ds18b20_select(addr)=0) return 0;w1_write(0xbe);i=0;p=(char *) & ds18b20_scratch_pad;do*(p+)=w1_read();while (+i5) & 3; if (ds18b20_select(addr)=0) return -9999;w1_write(0x44);delay_ms(conv_delayresolution);if (ds18b20_read_spd(addr)=0) return -9999;w1_init();return (*(int *) & ds18b20_scratch_pad.temp_lsb)& bit_maskresolution)*0.0625;结论与展望经过大四下半学期的设计制作,本电子万年历最终实现了实时显示当前的公历年、 月、日、时、分、秒、星期、室温、农历年、月、日、二十四节气、定时,预期设计目标全部实现。本万年历功能上需要改进的地方有如下几个方面:一、温度高于某一设定值可以给出温馨提示,如气温过高,提示不宜进行剧烈运动,或者当温度低于某一设定值时提示加衣服,甚至可以把父母的生日信息编进去,在生日当天可以自动给出祝福信息;二、考虑到本电子万年历一般用于室内,挂在墙上,输入部分可以加装遥控接收模块,用普通遥控器就能任意设定时间、定时,查询农历日期等。可以说,未来的电子万年历在生产应用中会有一个广阔的发展前景。致 谢我衷心感谢王猛老师对我的帮助。通过王老师耐心的讲解使我对课题由逐步加深了解,并在王老师的指导下写下了论文。王老师用深入浅出的方法给我讲解,使我很快掌握了许多新的知识,更重要的是使 我学到了许多进行科学研究的思想和方法。这些思想和方法将使我在以后的工作、生活 中受益无穷。王老师那种对工作勤勤恳恳、认真负责,待人和蔼可亲的精神深深的感染 了我。由衷的感谢江老师对我的帮助并祝江老师工作顺利!最后,向在百忙中抽出宝贵时间参与论文评审和答辩的专家和评委们,表示由衷地感谢! 附录 A 电子万年历原理图附录 B 电子万年历源程序/编译环境,CodeVisionAVR 1.24.8 Professional#include #include #asm.equ ds1302_port=0x18 ;PORTB.equ ds1302_io=5.equ ds1302_sclk=4.equ ds1302_rst=6#endasm/定义单片机与 DS1302 连接的 I/O 口#include #asm.equ w1_port=0x12 ;PORTD.equ w1_bit=7#endasm/定义单片机与 18B20 连接的 I/O 口#include #include #define MAX_DS1820 8unsigned char ds1820_devices;unsigned char ds1820_rom_codesMAX_DS18209;unsigned char num =0x3f,0x0c,0x5b,0x5e,0x6c,0x76,0x77,0x1c,0x7f,0x7e,0x00;/数码管显示代码int s,h,t,led,led0,ban,led1,led2,led3,led4;/s,h 用来控制数码管动态扫描,led,led0,ban,led1,led2,led3,led4 用来显示农 历年号、24 节气、星座unsigned int z,b,w,dn,dnn=2008,dy=8,dr=8,yun=0,set,mode,san,sa,tmode;/dnn 倒计时日期的年,dy 倒计时日期的月,dr 倒计时日期的日,yun 农历的月份是 否是闰月,set,mode,san,sa,tmode 用于调整及查询时的中间变量int kn,ky=2,kr,knb=19,kns=2,kng=1,krs=0,krg=8;/查询农历日期的中间变量int djs,sz1,sz2,sz3,sz4,sz5,sz6,sz7,sz8,sy1,sy2,sy3,sy4,sy5;int xz1,xz2,xz3,xz4,xz5,xz6,xz7,xz8,xy1,xy2,xy3,xy4;/数码管显示的中间变量unsigned char mg,fen,shi,r,yy,nn;/秒、分、时、日、月、年int temp,temp_h,temp_l;/定义温度值static const unsigned short wMonthAdd13=0,31,59,90,120,151,181,212,243,273,304,334,365;static const unsigned short wMonthAddy13=0,31,60,91,121,152,182,213,244,274,305,335,366;static const unsigned long wNongliData180=/*农历数据*/0xA4B,0x5164B,0x6A5,0x6D4,0x415B5,0x2B6,0x957,0x2092F,0x497,0x60C96,0xD4A,0xEA5,0x50DA9,0x5AD,0x2B6,0x3126E,0x92E,0x7192D,0xC95,0xD4A,0x61B4A,0xB55,0x56A,0x4155B,0x25D,0x92D,0x2192B,0xA95,0x71695,0x6CA,0xB55,0x50AB5,0x4DA,0xA5B,0x30A57,0x52B,0x8152A,0xE95,0x6AA,0x615AA,0xAB5,0x4B6,0x414AE,0xA57,0x526,0x31D26,0xD95,0x70B55,0x56A,0x96D,0x5095D,0x4AD,0xA4D,0x41A4D,0xD25,0x81AA5,0xB54,0xB6A,0x612DA,0x95B,0x49B,0x41497,0xA4B,0xA164B,0x6A5,0x6D4,0x615B4,0xAB6,0x957,0x5092F,0x497,0x64B,0x30D4A,0xEA5,0x80D65,0x5AC,0xAB6,0x5126D,0x92E,0xC96,0x41A95,0x00D4A,0x00DA5,0x20B55,0x0056A,0x7155B,0x0025D,0x0092D,0x5192B,0x00A95,0x00B4A,0x416AA,0x00AD5,0x90AB5,0x004BA,0x00A5B,0x60A57,0x0052B,0x00A93,0x40E95,0x006AA,0x00AD5,0x209B5,0x004B6,0x612AE,0x00A4E,0x00D26,0x51D26,0x00D53,0x005AA,0x30D6A,0x0096D,0xB095D,0x004AD,0x00A4D,0x61A4B,0x00D25,0x00D52,0x51B54,0x00B5A,0x0056D,0x2095B,0x0049B,0x71497,0x00A4B,0x00AA5,0x516A5,0x006D2,0x00ADA,0x30AB6,0x00937,0x8092F,0x00497,0x0064B,0x60D4A,0x00EA5,0x006B2,0x4156C,0x00AAE,0x0092E,0x3192E,0x00C96,0x71A95,0x00D4A,0x00DA5,0x50B55,0x0056A,0x00A6D,0x40A5D,0x0052D,0x8152B,0x00A95,0x00B4A,0x616AA,0x00AD5,0x0055A,0x414BA,0x00A5B,0x0052B,0x31527,0x00693,0x70E53,0x006AA,0x00AD5,0x509B5,0x004B6,0x00A57,0x40A4E,0x00D26,0x81D26,0x00D52,0x00DAA,0x60D6A,0x0056D,0x004AE,0x4149D,0x00A4D,0x00D15,0x21B25;static int wCurYear,wCurMonth,wCurDay,nian,yue,ri;zhuanhuan() /公历转农历程序static int nIsEnd,m,k,n,i,nBit;static long nTheDate;int y;wCurYear = nian;wCurMonth = yue;wCurDay = ri;y=wCurYear - 1921;nTheDate =(y8)+(y6)+(y5)+(y3)+(y2) + wCurDay
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025阜阳职业技术学院博士后科研工作站博士后研究人员招聘2人笔试考试参考试题及答案解析
- 2025年威海那香海苏州外国语学校教师招聘(38人)笔试考试参考试题及答案解析
- 2026年柳州职业技术学院单招职业适应性测试题库及答案详解一套
- 2026年郑州卫生健康职业学院单招职业倾向性考试题库及答案详解一套
- 2026年杭州职业技术学院单招职业倾向性考试题库参考答案详解
- 2026年广东科学技术职业学院单招职业适应性测试题库及答案详解1套
- 2026年福建卫生职业技术学院单招职业倾向性测试题库及参考答案详解一套
- 2026年阜新高等专科学校单招职业倾向性测试题库及参考答案详解
- 2026年福州软件职业技术学院单招职业技能考试题库及答案详解一套
- 2026年江西省赣州市单招职业适应性测试题库及参考答案详解1套
- 2024年人民法院聘用书记员考试试题及答案
- 房屋中介佣金协议书
- 2026届新高考政治热点冲刺复习 主要的国际组织
- 生物制药研发新趋势
- 终末期患者营养支持方案
- 高标准农田灌溉与排水管网布局方案
- 大明湖课件教学课件
- 河源市龙川县事业单位考试题目及答案解析
- 动静脉内瘘球囊扩张术课件
- 离婚财产分割培训课件
- 煤油灯的课件
评论
0/150
提交评论