找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7772|回复: 2
收起左侧

WORD格式可编辑 单片机太阳能路灯设计及proteus仿真

[复制链接]
ID:161768 发表于 2017-5-3 22:31 | 显示全部楼层 |阅读模式

     在本文中,我们计划了含有单片机STC12C2051和时钟芯片DS1302的一个结合时钟控制和光线控制的太阳能路灯控制系统(此句不通)。使用常见的存储器AT24C02存储路灯开关时间,光敏电阻来实现光开关。傍晚天黑时光敏电阻控制路灯开启,行人稀少的凌晨按照预先设定的时间熄灭街灯,早上行人增加时按照预先设定的时间点亮街灯,早上根据照明水平日出自动切断电路的。本文描述了整个系统的的工作原理和大部分电路,描述了单片机的优化设计和研究。

太阳能路灯的部分构成如下:光能电池、铅酸免维护电池、超亮LED, LED路灯系统等。太阳能是一种取之不尽、用之不竭的能源,是人类最有发展前途的能源。当今世界能源短缺,环境污染日益严重。尽可能多地发展太阳能技术已成为世界各国政府在可持续发展的主要方法。与白炽灯等照明方法相比,超高亮度LED灯体积小,重量轻,可靠性高,方向性好,并在各种恶劣的环境下工作稳定等优点。而且除了太阳能LED灯超节能外还有安装方便等优点。



第一章 绪论            

1.1研究背景

1.2国内外研究现状和发展趋势

1.3本文的主要研究内容

第二章 方案论证              2

2.1 设计要求              2

2.2 方案选择              2

第三章 系统总体框图              3

第四章 系统硬件设计              4

4.1 电源电路              4

4.2 太阳能电池板组件              4

4.3 蓄电池              5

4.4 照明负载              6

4.5 蓄电池和太阳能板的选用              7

4.6 显示电路              8

4.7 过充、过放控制电路              9

4.8 DS1302的结构及工作原理              10

4.9 存储器AT24C02简介1

第五章 系统软件设计及仿真3

5.1 系统软件设计              13

5.2 系统的仿真              16

结束语及致谢              21

参考文献2

附录3


1.006.jpg 1.007.jpg


第一章 绪论
1.1研究背景

太阳能路灯,因为其先进的技术,稳定的控制,成熟的节能效果,突出景观技术,被众人作为一种投资回报周期短,易于维护特征的推广。随着快速发展规模的太阳能街灯的扩大和大量应用,各种实际项目和施工质量差别很大。因此,我们应分析原因,不断总结经验,继续规范市场秩序,让LED路灯市场稳步发展。太阳能作为一种绿色能源是非常有价值的。每日的地球表面受到的的阳光照射能量约等于 250000000 桶石油。

太阳能 LED 灯具的使用应该引起全世界的注意,太阳能 LED 灯有重要的现实意义,特别是依靠火力发电或水力发电的其他偏远地区,因火力发电和水力发电无法连入国家大电网而造成自身的浪费,这些地区应加大开发太阳能电力的力度。这是利国利民可持续发展的好事。

1.2国内外研究现状和发展趋势

如今能源日益紧张,太阳能照明已迅速发展。在太阳能照明体系的成长中,人们不间断的的对照明系统经常使用的控制方法进行剖析,设计出了许多方便可行的控制方式,蓄电池充电效率不断进步,有效利用方面和充电时间是越来越理想。协调发展的太阳能组件、 太阳能照明技术使其越来越有价值。太阳能照明的电能,是真正的绿色照明,政府方面,自动省心还不用付电费,百姓方面,太阳能灯可免费提供能源和每晚的照明。道路照明在城市街道中占大部分。作为一种新能源和工业技术、一种新的成熟技术,与其他行业相比,有优势但仍有不完善的地方如发展时间短,技术不成熟。特别是性能、价格、安全、标准、售后、耐用等。

目前,太阳能路灯在城市路灯路灯中仍然没有得到广泛使用,但体积小、 可靠性强、 维修简便、 良好的指向性,相信未来的发展前景将是非常理想的,很值得被推广应用在城市路灯照明系统。


1.3本文的主要研究内容

    本文主要研究太阳能路灯控制系统的应用。太阳能控制器即太阳能充电放电控制器。控制太阳电池阵电源自动控制设备的负载和电池充电。自动防止蓄电池过充电和过放电。它对蓄电池的充、放电条件加以规定和控制,并根据太阳能电池模块的负荷控制电池向负载输出功率的电力需求,是整个系统的核心控制部分[1]。

太阳能路灯太阳能控制器是它的最重要组成部分。太阳能控制系统的作用是避免过充电和过放电, 使电池充电和放电条件通过设置以便电池不会深度充电和放电。当存在较大的温差,太阳能控制器将弥补电池温度。能量控制器完成过充电保护,过放电保护,设计,灯光控制,时间控制,甚至反接保护功能。如果注重成本控制,可以实现其高性价比。

控制系统在照明系统中有核心充电、过充电和过放电保护、进行系统控制、时间控制和逆变器的功能。

第二章 方案论证
2.1 设计要求

(1)电池板功率的计算和选用;(要求功率多大?)

(2)蓄电池电池容量,充电和放电控制和状态显示;

(3)连续阴雨天三天路灯仍能照明;

(4)光线暗时路灯自动点亮;

(5)晚上24点熄灭;

(6)早上5点路灯点亮;

(7)早上光线强时路灯自动熄灭;

(8)系统断电时后下次使用依然有数据存在。
2.2 方案选择(写清楚方案,功率如何满足等,要写出结算过程)

太阳能 LED 灯和其他路灯光一样,必须在早上熄灯在晚上亮光。并且24小时管理蓄电池电量。今天的世界上通用的控制器: 时钟类型、 经纬类型等,但因为不同的工程,每个都有优点和缺点。  

光敏感探头的时候会在光线微弱的晚上自动打开;早晨的光线变强时,自动断电。为节约用电,原来的光控开关,是半导体分立器件,电路复杂,组件多,体积大,失败率高。随着现代技术的不断发展,出现了以NE555为代表的时基集成电路,光控开关电路开始大幅度地简化高效。光开关特性的感光部件中探头的安装位置是关键,也是需要技巧避免光的干涉,但在实际使用中,很难判断。产生误动作是经常发生也是不可避免的。

采用时钟控制器的路灯控制器,可以提前选好开关灯的时间。路灯将根据设定的时间定时亮灯、熄灯。也就实现了自动控制的效果。优点:因为是提前设定的开关时间控制路灯,这样就不会收到外界较大干扰,只要本身没故障就不会有误动作的现象。缺点:因为日出日落的时间每天都不同。无法根据日期变化和阴雨天气自动更改开关时间,如果找专人定期更改每天开关时间,就无法达到自动控制的效果了。定时开关有机械钟和电子钟两种,石英钟的机械手表,走时准确,但由于在核心温度高的塑料齿轮会变形,会造成关机现象。以LR6818、LM8650为代表的电子钟的定时开关的代表也开始广泛地使用。近年来,现有的电子时钟 LED 液晶显示器具有体积小、 外围元件少等优点,可以设置 6 组开关,许多制造商对于大批量生产的产品,现在主要用于路灯控制系统。

利用计算机技术,在阳光下的仿真技术,经纬控制器自动的夜灯,早上可以自动关灯。它的优点是时间敏感的开关、 光学开关不容易受到干涉,控制时间准确。 能克服计时器无法自动切换开关时间的弱点。目前,路灯控制系统经常使用这种控制方法,但价格较高,街道照明会增加不必要的成本[2]。

关于这一主题的路灯智能控制一直有研究者,但还不是一个成熟的产品。本文会结合上面几种方法的优点,减少缺点。节约能源,从成本和环境保护等方面的设计,使定时控制和光电控制相结合,以实现智能设计的太阳能灯。

第三章 系统总体框图

总体电路部分组成如下:太阳能电池板、防止过充过放电路、51单片机、蓄电池、时间控制电路、光控光敏电路、照明负载LED灯与时间显示电路[3]。系统总体方框图如图3.1所示。

1.008.jpg 太阳能发电的单片机电池电压低时,电池的使用寿命将会减少,所以要防止电池过充和过放,以上的充电和放电控制电路必须有。要介绍该工作原理第四章 系统硬件设计4.1 电源电路

电源电路如图4.1所示。太阳能发电系统,电池电压24V电压5V输出电压,作为主电源控制器。电容器C2,C3作为高频旁路电容器。电容器C1,C4是滤波电容器。为什么这么设计

1.009.jpg

图4.1  电源电路

4.2 太阳能电池板组件

  太阳能发电分为热能发电和光能发电两种。

(1) 太阳能热发电:太阳辐射的第一吸收的热能转换成电能,有两个类别:一种是直接转换为热能发电作为太阳能热发电的代表,但功率很小[4]。有的还处于原理实验阶段;其他的是太阳能热发电,太阳能发电机由发动机驱动,其基本结构包括集热器,储能系统,发动机和发电机。一些国家正在研制的大电网设备,已达到实际应用的水平。因为太阳能热发电技术的复杂性,业务应用程序仅适用于大容量,所以其发展缓慢、 不是很多的应用程序。   

(2) 太阳能光发电:不发热,光是太阳光转化为电能,太阳能,风力发电机,光化学和光生物发电发电四类。目前广泛用于周围世界光伏、 光照到该单元格,利用光伏效应直接可以产生直流电,太阳能电池的一部分,蓄电池,控制器,逆变器和模拟的其他部分。目前世界上广泛使用太阳能电池的应用,从而生产成本开始放缓。目前情况下。光伏发电在世界主要用于三个方面:为无电场合提供电源;太阳能日用电子产品。

太阳能电池的基本特性:电压特性具有较强的非线性。S=l050W/m2;太阳能电池温度T=24℃;大气质量AM=1.52。在这种条件下的最大输出功率就是太阳能电池阵列的额定功率[5]。其额定输出功率单位是“峰瓦”,简记为“Wp”。

在365天太阳电池组件接受太阳辐射能量,选择最佳角度是很重要的。

通过计算模型可以计算太阳辐射在不同的角度要从中选择最合适的角度斜平面作为最后一种选择的平均辐射剂量的月度变化。
    太阳能电池板分为多晶硅和单晶硅,多晶硅区域,发电比单晶效率高,所以使用 70 W 将单个晶体硅太阳能电池组件符合设计要求[6]。

4.3 蓄电池

蓄电池是将太阳能电池的能量转化存储到自身的装置,其作用是储存阳光发出的多余的电力负荷矩阵,用于在夜间。总的要求是没有阳光的日子里仍然满足用户要求的电源性能指标。最常用的铅酸电池经常用在重要的场合,也可用于镉镍电池,但价格较高,相对没有广泛应用。

电池可以把直流电动能量转化为化学能,化学材料将其及时和有效地存储。光电转换系统有电池蓄电和调理作用。每个光伏系统将是不同的,没有阳光发电,电池可以提供稳定的电。

光伏发电系统,电池正在放电周期浮动状态, 夏天, 太阳能电池板充电电池;冬天阳光不足,储存的电能开始慢慢输出。日循环的次数比季节性循环要多得多:白天时储存的能量转换为电池电量,晚上,充的电开始缓慢输出。因此电池泄漏少,充放电效率尽可能高,最后,考虑的因素,如价格性能。

蓄电池的寿命的影响因素有制造质量的结构和工艺。还有一些是使用过程和维护工作。首先,彻底的影响电池放电深度的循环寿命,电池深度放电,往往会缩短生命周期。其次,电池的标称容量通常用于高电流充电放电,影响电池寿命。大电流充电,活性物质,特别是板不易脱落,短路正负极板严重;大电流放电,产生大的硫酸盐颗粒,板活性物质不能充分利用长电池的实际容量会逐渐减少,这样生活也会受到影响[7]。

这个电路使用免维护铅酸电池,不用特别的维修 ;即使倾倒也不溢出电解质的氢和空气的雾,更好的安全性能。但是充电电池是更敏感,所以过充电保护的要求;当长时间反复充电后,电池板变形。

4.4 照明负载

LED被加上电压后在内部会产生跃迁光辐射。不同类型的半导体材料,光的波长产生自然不同。发光二极管的基本构成是 P N 交界处,少数载体将积极当前 P N 交界,复合载体是光的发射发光二极管的一个基本原则。P N 半导体结灯发光固态照明材料和电子转型固体结果中不同国家的各种固体发光。半导体材料的工作原理决定了不连续的白光LED,但使用其他的合成方法。氮化铟镓结合荧光材料发射蓝光变成了白光LED ,蓝光,荧光材料发出黄光时的激励,合成为蓝色,黄色和白色。

超亮白光LED用太阳能照明,单梁式超高亮度LED灯管方向太强了,有不好的综合视觉效果,所以应该首选平面型超级明亮的单位类型和超级明亮的LED照明灯类型结合使用,集中了一批LED , LED光源布置有超高亮白光的某些规则的LED光源,以确保光效的发光强度是必要的,但也有了更高的,但是电流的增大,流量虽然增加了,但另一方面,目前的增加将导致增加热损失的来源,通常会导致温度升高,结合效果是减少的光,光通量和相交的最佳工作发光效率的影响,通常17.5ma。   

超亮白光LED光源具有以下优点:

(1)寿命长。LED 的寿命至少 100000 小时、 白炽灯灯具的一般是 2000 小时,荧光灯通常约 5000 小时。

   (2)效率高。LED耗电只有白炽灯的10%至20%。   

(3)绿色环保。日光灯不含汞,无频闪,环境友好。

    (4)耐低温。LED 的温度可在零下 40 ℃ ~ 80 ℃ 的温度中工作,范围是非常广泛。

这个电路的电压是关键特征点,一个充电和放电的电池更好的设计,和充电状态指示电路,发光二极管智能控制器已成为一种实用的功能,功能,防止电池过放电,充电。在太阳辐射不足的一个月,因为电压低,电池的充电的电池状态的低排放,所以负载电流很小,功率小、 系统可以工作有较长的时间。每月的太阳辐射是不够的,因为电池电压的电池充电状态为低,低排放,因此负载电流小,小系统可较长时间工作。

太阳能LED路灯, LED光源的数量范围是从1到几千的一批LED光源组成,排列组合是非常重要的一点。不同的排列组合的整体亮度的影响。

    这种设计使用,超级光亮管正常工作电压为 3.3 V,即 28 个1 W 超高亮管,四组每七个超亮MOSFET为一组,即使在电路中,这也减少了影响,超亮管其他明管的电路故障,由于超亮管井的直接影响,所以的灯去尝试的体积更小,曝光范围,这样就可以使超光管大,超亮管选择较大的管道明亮的灯光。

4.5 蓄电池和太阳能板的选用

路灯电压为24V ,电流约1.2A。路灯大约在一天内要工作8小时,阴天3天时系统也要正常工作,后备电源要有80%的放电率并坚持24h供电[8]。则蓄电池的容量如公式(1)为:

       Qx=(Tx×Is)=(24×1.2)/0.8=36(Ah)                     (1)

    式中:

       Qx——蓄电池容量;

       Tx——蓄电池放电时间;

       Is——设备工作电流。

最终选择了24V/36Ah蓄电池。有阳光时,16小时充满电。


(2)是用来计算的太阳能电池板功率如公式:

       P=24Ic

       =Vg〔Qx+Qs ×(D-1)〕/(Tc ×D)

                  =24Qx/Tc=24*(36+9.6)/16=68.4W               (2)

    式中:

       Qx——蓄电池容量;

       D——充满电需要的天数;

       Qs——日耗蓄电池容量;

       Vg——设备工作电压;

       Tc——充电满电所用时间。

    则太阳能板取24V/70W。

    太阳能各项性能指标如表所示:

太阳能电池

70W ,24 V

LED发光源

28个LED、每个1 W

工作温度

-40℃ +80℃

过充保护电压

26 V

过放保护电压

22 V

蓄电池

24 V,36Ah


照明时间

光敏电阻来实现光开关。 傍晚天黑时光敏电阻控制路灯开启,行人稀少的凌晨按照预先设定的时间熄灭街灯,早上行人增加时按照预先设定的时间点亮街灯, 早上根据照明水平日出自动切断电路的。

阴雨天保证时间

3个阴雨天也能正常工作

表4.1 太阳能LED的各种性能指标

4.6 显示电路(为啥这么设计,写清楚)

单片机的串行显示电路,由74 LS164为数码管驱动电路,二极管D1 , D2和D3 可降压,保护数码管,共显示四个数字,1.2显示小时,3.4显示分钟[9]。

       1.010.jpg

图4.2 显示电路

可以为同步移位寄存器使用双工串行通信端口,模式 0、 RXD (P3.0) 是一种串行输入或输出 ;通过数据同步的时钟(P3.1)终端串行输出,在时钟的同步功能,实现串行数据通信。允许低电平输出电流,不增加驱动电路的原因,亮度是可取的。4.7 过充、过放控制电路

过度充电的控制,在电池的充满状态时,充电电路保护,该控制电路是为电池放电的放电电路。过充和过放电保护电池,延长电池使用寿命。充放电控制电路如图4.3所示。: 1.011.jpg

过充电,过放电的判断主要是基于电池的电压水平,其工作原理如下:过载继电器开关控制电路的充电显示的运动范围的电路时,白天电荷状态正常,太阳热吸收从常闭继电器切换到电池当电池电压超过,电池的充电状态, U1 A”-”端电压大于“+”端的电压输出 U1 A,”“低水平的 Q1,接通和断开,继电器线圈通电时,继电器的常闭,常开触点断开充电电路,充电指示灯,停止对电池进行充电,过充电保护功能实现[10]。

继电器 J2 控制电路的串联电路,放电电路工作正常。晚上当蓄电池从电池到负载,当电池电压低于22 v,认为电池处于放电状态, U1 B电压的电压下面的“+”“-”,输出”“低,和打开和关闭,继电器线圈电源继电器开关从封闭走向开放,过放电指示灯停止向负载供电。达到过放保护功能。

4.8 DS1302的结构及工作原理

时序电路的功能是普遍使用的软件定时器,定时器的设计,但缺点是定时误差,不时修正时间的需要;另一个是电路硬件定时器,现在许多流行的串行时钟,如DS1302,DS1307等,该接口电路简单,价格低廉,使用方便,广泛应用[11]。DS1302是一家达拉斯的公司可以持续慢充电能力的电路,主要特征是串行数据传输的使用,可以提供可编程电源充电,电源保护,并且可以关闭充电功能[12]。

1.012.jpg DS1302工作电压为2.5V~5.5V。接口与CPU同步线,三字节的RAM使用突发数据传输。DS1302内部有RAM寄存器。

表4.2是DS1302的引脚功能,连接图如图4.4与单片机, VCC1 , VCC2作为备用电源的主电源[13]。在一般情况下,电源由主电源供电,而备用电源充电主电源,在主电源关闭,连续操作,可以保持时钟运行。Vcc1与Vcc2较大者供电DS1302。X1和X2为振荡源,外部的32.768kHz振荡器。RST是片选线,输入高电平来传送数据。

1.013.jpg
表4.2  DS1302的管脚介绍

RST输入有两个功能:第一,通过控制逻辑,使移位寄存器的地址/命令序列;最后,RST提供终止字节数据传送。如果RST设置为低电平的过程中传播,可以终止数据传输,I / O针进入一个高阻抗状态。运行用电,在 VCC ≥ 2.5 v,首先必须保持低水平。只有在SCLK为低,RST可以设置为高的水平,图4.4scl,I / O,用1302单片机读写控制RST连接[14]。

          1.014.jpg


图4.4 1302与单片机的连接图

4.9 存储器AT24C02简介

AT2402的1,2,3脚为空,4脚接地,5脚数据端,6脚时钟端,7脚写保护,8脚是电源。其与单片机的连接方法如图4.5:


1.015.jpg






图4.5 24C02与单片机连接方法

AT24C02角色在这个设计是电动记忆,是防止电源突然断开连接,用户的信息不丢失,存储当前的一组信息。AT24C02是2 KB字节ATMEL公司的电力可删除内存芯片,由于数据和地址线AT24C02重用,使用串行数据传输模式,所以只有两根电线 sci (shift 脉冲) 和 SDA 来传输数据 (数据 / 地址) 和微控制器。最低电压为2.5 V,额定电流1 ma,静态电流10 ua(5.5 V),芯片中的信息可以在有电源的情况下保存很长时间,并使用8英尺的保护,易于使用。

  管脚名称

     功    能

A0、A1、A2

器件地址选择

SDA

串行数据/地址

SCL

串行时钟

WP

写保护

VCC

+1.8V~6.0V工作电压

GND













表4.3  24C02的管脚介绍

R18,R19是上拉电阻,静态功耗可降低AT24C02。设置一个时间的信息时,系统会自动调用存储过程,存储芯片中的信息;当系统重新上电,自动呼叫存储器读取程序,信息存储,读取缓存单元,用于使用主程序。










  •   系统软件设计
5.1 系统软件设计

软件设计主要包括初始化程序,时间设置, 1302读写程序, 24 C02读写程序,子程序,按钮,显示刷新子例程,Program初始化[15]。该计划将用当前的系统时间相比较,时间设置,设置第二个时间间隔,并在同一时间,通过使用输出控制信号的驱动电路来驱动。整体系统的程序流程图如图5.1所示。

如果想调整时间开关灯和1302的时间可以通过地图按钮手动设置在S1,S2时间开关调整,S3分别显示1302次关键,具体程序流程图如图5.2所示。(具体程序请添加到附录里面)


1.016.jpg 1.017.jpg 1.018.jpg


1.019.jpg 1.020.jpg


5.2 系统仿真

1.021.jpg

图5.3 显示1302时间光线较亮,光敏电阻的电阻值较小,从而路灯断路,路灯熄灭。


1.022.jpg

图5.4 显示1302时间光线较暗,光敏电阻的电阻值较大,从而路灯亮。

1.023.jpg

图5.5 功能键标志位为“1”时,显示1302时间“时”并闪烁。此时可调节时间“时”。

1.024.jpg

图5.6 功能键标志位为“2”时,显示1302时间“分”并闪烁。此时可调节时间“分”。

1.025.jpg

图5.7 功能键标志位为“3”时,显示关路灯时间点“时”并闪烁。此时可调节关路灯时间点“时”。存上次1302时间。

1.026.jpg

图5.8 功能键标志位为“4”时,显示关路灯时间点“分”并闪烁。此时可调节关路灯时间点“分”。



1.027.jpg

图5.9 功能键标志位为“5”时,显示开路灯时间点“时”并闪烁。此时可调节关开路灯时间点“时”。存上次关路灯时间。


1.028.jpg

图5.10 功能键标志位为“6”时,显示开路灯时间点“分”并闪烁。此时可调节关开路灯时间点“分”。确定后存开路灯时间。

以下是总体电路图放在这章的开头,并介绍每个模块的功能

1.029.jpg
                 






附录(写清楚是什么内容)
//头文件


  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<math.h>
  4. #define uchar  unsigned char
  5. #define uint   unsigned int
  6. #define ulong  unsigned long
  7. #include "delay.h"
  8. #include "key.h"
  9. #include "ad.h"
  10. #include "24c02.h"
  11. #include "1602.h"
  12. #include "time.h"
  13. //功能按键变量
  14. uchar set=0;
  15. uint  shanshuo=0;
  16. uint light;
  17. //-------
  18. uchar openh=18;
  19. uchar openm=18;
  20. uchar closh=23;
  21. uchar closm=18;

  22. uchar cun[]={0,0,0,0};
  23. //显示函数
  24. void xianshi0()
  25. {
  26.    num[0]=SEG7[time[2]%100/10];
  27.    num[1]=SEG7[time[2]%10]&0X7F;
  28.    num[2]=SEG7[time[1]%100/10];
  29.    num[3]=SEG7[time[1]%10];
  30. }
  31. //---------------------------------------------------------------------
  32. //---------------------------------------------------------------------
  33. //显示设置时--1=00
  34. void xianshi1()
  35. {
  36.    num[0]=SEG7[1];
  37.    num[1]=0xb7;
  38.    shanshuo=(shanshuo+1)%80;
  39.    if(shanshuo>40){num[2]=SEG7[time[2]%100/10];num[3]=SEG7[time[2]%10];}
  40.    if(shanshuo<40){num[2]=0xff;num[3]=0xff;}
  41. }
  42. //显示设置分--2=00
  43. void xianshi2()
  44. {
  45.    num[0]=SEG7[2];
  46.    num[1]=0xb7;
  47.    shanshuo=(shanshuo+1)%80;
  48.    if(shanshuo>40){num[2]=SEG7[time[1]%100/10];num[3]=SEG7[time[1]%10];}
  49.    if(shanshuo<40){num[2]=0xff;num[3]=0xff;}
  50. }
  51. //---------------------------------------------------------------------
  52. //---------------------------------------------------------------------
  53. //显示设置打开时--3=00
  54. void xianshi3()
  55. {
  56.    num[0]=SEG7[3];
  57.    num[1]=0xb7;
  58.    shanshuo=(shanshuo+1)%80;
  59.    if(shanshuo>40){num[2]=SEG7[openh%100/10];num[3]=SEG7[openh%10];}
  60.    if(shanshuo<40){num[2]=0xff;num[3]=0xff;}
  61. }

  62. //显示设置打开时--4=00
  63. void xianshi4()
  64. {
  65.    num[0]=SEG7[4];
  66.    num[1]=0xb7;
  67.    shanshuo=(shanshuo+1)%80;
  68.    if(shanshuo>40){num[2]=SEG7[openm%100/10];num[3]=SEG7[openm%10];}
  69.    if(shanshuo<40){num[2]=0xff;num[3]=0xff;}
  70. }
  71. //---------------------------------------------------------------------
  72. //---------------------------------------------------------------------
  73. //显示设置关闭时--5=00
  74. void xianshi5()
  75. {
  76.    num[0]=SEG7[5];
  77.    num[1]=0xb7;
  78.    shanshuo=(shanshuo+1)%80;
  79.    if(shanshuo>40){num[2]=SEG7[closh%100/10];num[3]=SEG7[closh%10];}
  80.    if(shanshuo<40){num[2]=0xff;num[3]=0xff;}
  81. }

  82. //显示设置关闭时--6=00
  83. void xianshi6()
  84. {
  85.    num[0]=SEG7[6];
  86.    num[1]=0xb7;
  87.    shanshuo=(shanshuo+1)%80;
  88.    if(shanshuo>40){num[2]=SEG7[closm%100/10];num[3]=SEG7[closm%10];}
  89.    if(shanshuo<40){num[2]=0xff;num[3]=0xff;}
  90. }
  91. //按键处理函数
  92. void ctrl_key()
  93. {
  94.   if(key1==0)set=(set+1)%8;              while(key1==0);
  95.   //----------------
  96.   if(set==1){if(key2==0)time[2]=(time[2]+1)%24;while(key2==0);if(key3==0)time[2]=(time[2]-1)%24;while(key3==0);}
  97.   if(set==2){if(key2==0)time[1]=(time[1]+1)%60;while(key2==0);if(key3==0)time[1]=(time[1]-1)%60;while(key3==0);}
  98.   //----------------
  99.   if(set==3){if(key2==0)openh=(openh+1)%24;while(key2==0);    if(key3==0)openh=(openh-1)%24;while(key3==0);}
  100.   if(set==4){if(key2==0)openm=(openm+1)%60;while(key2==0);    if(key3==0)openm=(openm-1)%60;while(key3==0);}
  101.   //----------------
  102.   if(set==5){if(key2==0)closh=(closh+1)%24;while(key2==0);    if(key3==0)closh=(closh-1)%24;while(key3==0);}
  103.   if(set==6){if(key2==0)closm=(closm+1)%60;while(key2==0);    if(key3==0)closm=(closm-1)%60;while(key3==0);}
  104.   //----------------

  105. }

  106. void  chuli()
  107. {
  108.   //------------------------------
  109.   //------------------------------
  110.   if(set==7)
  111.   {
  112.    ds1302_settime();
  113.    cun[0]=openh;
  114.    cun[1]=openm;
  115.    cun[2]=closh;
  116.    cun[3]=closm;
  117.    WrToROM(cun,1,4); set=0;
  118.   }
  119.   //------------------------------
  120.   //-光线-----------
  121.   if(light<60)out=led=0;else out=led=1;
  122.   //------------------------------
  123.    if((time[2]==openh)&&(time[1]==openm))out=led=0;
  124.   if((time[2]==closh)&&(time[1]==closm))out=led=1;


  125. }                                                                                                                                                                                    
  126. //主函数
  127. void main()
  128. {
  129.   //初始化
  130.   ds1302_int();

  131.   RdFromROM(cun,1,4);
  132.    openh=cun[0];
  133.    openm=cun[1];
  134.    closh=cun[2];
  135.    closm=cun[3];
  136.   //-------定时器0配置
  137.   TMOD=0x01;              //方式1
  138.   //使能定时器0
  139.   ET0=1;
  140.   //定时器的初值
  141.   TH0=(65536-30000)/256;
  142.   TL0=(65536-30000)%256;
  143.   //停止开启定时器0
  144.   TR0=1;
  145.   EA=1;
  146.   //延时函数ms
  147.   _delay_ms(1);
  148.   _delay_us(1);
  149.   while(1)
  150.   {
  151.   if(set==0)xianshi0();
  152.   if(set==1)xianshi1();
  153.   if(set==2)xianshi2();
  154.   if(set==3)xianshi3();
  155.   if(set==4)xianshi4();
  156.   if(set==5)xianshi5();
  157.   if(set==6)xianshi6();
  158.   dispaly();
  159.   ctrl_key();
  160.   chuli();
  161.   }
  162. }

  163. //----T0 计数                           
  164. void  Time0() interrupt 1
  165. {
  166.   //重装初值30ms;
  167.   TH0=(65536-30000)/256;
  168.   TL0=(65536-30000)%256;
  169.   if(set==0)ds1302_readtime();
  170.   light=adc0832(0);
  171.   }


  172. sbit  CS= P3^2;
  173. sbit  Clk= P3^4;
  174. sbit  DATI=P3^3;
  175. sbit  DATO= P3^3;
  176. uint  dat = 0x00;      //AD值
  177. //AD转换子程序
  178. uint adc0832(unsigned char CH)
  179. {
  180.   uchar i,test,adval;
  181.   adval = 0x00;
  182.   test = 0x00;
  183.   Clk = 0;       //初始化
  184.   DATI = 1;
  185.   _nop_();   _nop_();

  186.   CS = 0;
  187.   _nop_();
  188.   Clk = 1;
  189.   _nop_();  _nop_();

  190. if ( CH == 0x00 )      //通道选择
  191.    {
  192.        Clk = 0;
  193.        DATI = 1;      //通道0的第一位
  194.        _nop_();
  195.        Clk = 1;
  196.        _nop_();  _nop_();

  197.        Clk = 0;
  198.        DATI = 0;      //通道0的第二位
  199.        _nop_();  _nop_();

  200.        Clk = 1;
  201.        _nop_();
  202.     }
  203.     else
  204.     {
  205.        Clk = 0;
  206.        DATI = 1;      //通道1的第一位
  207.         _nop_();  _nop_();

  208.        Clk = 1;
  209.         _nop_();  _nop_();

  210.        Clk = 0;
  211.        DATI = 1;      //通道1的第二位
  212.       _nop_();
  213.       Clk = 1;
  214.       _nop_();
  215.     }
  216.       Clk = 0;   _nop_();

  217.       DATI = 1;
  218.    for( i = 0;i < 8;i++ )      //读取前8位的值
  219.     {
  220.        _nop_();
  221.        adval <<= 1;
  222.        Clk = 1;
  223.        _nop_();  _nop_();

  224.        Clk = 0;                 _nop_();

  225.        if (DATO)
  226.           adval |= 0x01;
  227.       else
  228.           adval |= 0x00;
  229.     }
  230.   for (i = 0; i < 8; i++)      //读取后8位的值
  231.       {
  232.            test >>= 1;
  233.            if (DATO)
  234.               test |= 0x80;
  235.            else
  236.               test |= 0x00;
  237.           _nop_();
  238.           Clk = 1;
  239.           _nop_();  _nop_();

  240.           Clk = 0;   _nop_();

  241.       }
  242. //比较前8位与后8位的值,如果不相同舍去。
  243.   if (adval == test)   
  244.      dat = test;
  245.      _nop_();  _nop_();

  246.      CS = 1;        //释放ADC0832
  247.      DATO = 1;
  248.      Clk = 1;

  249.      return dat;

  250. }


  251. //------------------------------------
  252. #define at89c_51
  253. //-----------------------------------
  254. //--------------at89c_51-------------
  255. #ifdef  at89c_51
  256. #define at89c_51
  257. sbit     SDA=P1^7 ;
  258. sbit     SCL=P1^6 ;
  259. #define  SCL_1          SCL=1
  260. #define  SCL_0                       SCL=0

  261. #define  SDA_1          SDA=1
  262. #define  SDA_0          SDA=0

  263. #define  AddWr        0xa0                    //器件地址选择及写标志
  264. #define  AddRd        0xa1                              //器件地址选择及读标志
  265. void Nop()                              //空操作
  266. {
  267.   _nop_();
  268.   _nop_();
  269.   _nop_();
  270.   _nop_();
  271. }
  272. #endif
  273. //延时函数ms
  274. #ifdef  atmega_16
  275. #define atmega_16
  276. void Nop()                              //空操作

  277. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


word格式的完整文档下载地址:http://www.51hei.com/bbs/dpj-83421-1.html
回复

使用道具 举报

ID:62391 发表于 2018-3-25 23:32 | 显示全部楼层
有源程序吗
回复

使用道具 举报

ID:303672 发表于 2018-4-8 14:37 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表