模拟路灯控制系统毕业论文(附硬件图及源c程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
毕业论文声明
本人郑重声明:
1.此毕业论文是本人在指导教师指导下独立进行研究取得的成果。
除了特别加以标注地方外,本文不包含他人或其它机构已经发表或撰写过的研究成果。
对本文研究做出重要贡献的个人与集体均已在文中作了明确标明。
本人完全意识到本声明的法律结果由本人承担。
2.本人完全了解学校、学院有关保留、使用学位论文的规定,同意学校与学院保留并向国家有关部门或机构送交此论文的复印件和电子版,允许此文被查阅和借阅。
本人授权大学学院可以将此文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本文。
3.若在大学学院毕业论文审查小组复审中,发现本文有抄袭,一切后果均由本人承担,与毕业论文指导老师无关。
4.本人所呈交的毕业论文,是在指导老师的指导下独立进行研究所取得的成果。
论文中凡引用他人已经发布或未发表的成果、数据、观点等,均已明确注明出处。
论文中已经注明引用的内容外,不包含任何其他个人或集体已经发表或撰写过的研究成果。
对本文的研究成果做出重要贡献的个人和集体,均已在论文中已明确的方式标明。
学位论文作者(签名):
年月
关于毕业论文使用授权的声明
本人在指导老师的指导下所完成的论文及相关的资料(包括图纸、实验记录、原始数据、实物照片、图片、录音带、设计手稿等),知识产权归属华北电力大学。
本人完全了解大学有关保存,使用毕业论文的规定。
同意学校保存或向国家有关部门或机构送交论文的纸质版或电子版,允许论文被查阅或借阅。
本人授权大学可以将本毕业论文的全部或部分内容编入有关数据库进行检索,可以采用任何复制手段保存或编汇本毕业论文。
如果发表相关成果,一定征得指导教师同意,且第一署名单位为大学。
本人毕业后使用毕业论文或与该论文直接相关的学术论文或成果时,第一署名单位仍然为大学。
本人完全了解大学关于收集、保存、使用学位论文的规定,同意如下各项内容:按照学校要求提交学位论文的印刷本和电子版本;学校有权保存学位论文的印刷本和电子版,并采用影印、缩印、扫描、数字化或其它手段保存或汇编本学位论文;学校有权提供目录检索以及提供本学位论文全文或者部分的阅览服务;学校有权按有关规定向国家有关部门或者机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入学校有关数据
库和收录到《中国学位论文全文数据库》进行信息服务。
在不以赢利为目的的前提下,学校可以适当复制论文的部分或全部内容用于学术活动。
论文作者签名:日期:
指导教师签名:日期:
模拟路灯控制系统
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:
指导教师签名:日期:
使用授权说明
本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:
学位论文原创性声明
本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日
导师签名:日期:年月日
指导教师评阅书
评阅教师评阅书
教研室(或答辩小组)及教学系意见
摘要
本文介绍了一个模拟路灯控制系统的应用方案,用以实现模拟路灯的智能控制。
本方案以宏晶公司的MCU芯片STC12C5410AD为核心,加以简单的外围电路,实现了模拟路灯控制系统所要求的全部技术内容。
STC单片机在最近几年应用越来越广泛,因其抗干扰能力强、稳定性好,性价比高,因此是低成本路灯控制解决方案的首选。
该控制系统除了选用廉价的单片机芯片,还采用了廉价的红外对射传感器,大大降低了系统成本。
整个系统的电路简单,结构紧凑,电源驱动仅采用变压器与三端稳压器相结合,附加少许滤波电容便实现了稳定的电源输出。
经过多次测试,证实该系统能长时间稳定工作,完全满足设计要求指标。
关键词:模拟控制;LED照明;单片机
ABSTRACT
This paper introduces a simulation control system application scheme street, to simulate the street lamp of intelligent control. This plan to macro crystal company MCU, STC12C5410AD as the core, to chip the periphery of the simple circuit, realize the simulation street lamp control system all of the requested technology content. STC SCM in recent years more and more wide application, because of its strong anti-interference ability, good stability, high performance/price ratio, and so is the low cost street lamp control solutions of choice. The control system in addition to choose cheap single-chip microcomputer chip, also adopted the cheap infrared mutual illuminate sensor, and greatly reduce the cost of system. The whole system of the circuit is simple, compact structure, power drive only used three transformer and the regulators, and the combination of a few additional filter capacitance will realize the stable power output. After many test, and confirm that the system can work stably for a long time, fully meet the design requirements index.
Keywords: Simulate controlling; LED lighting; Single-chip microcomputer
目录
1 系统设计 (1)
1.1 设计要求 (1)
1.1.1 基本要求 (1)
1.1.2 发挥部分 (2)
1.2 总体设计方案 (2)
1.2.1 功能分解及设计思路 (2)
1.2.2 方案论证与比较 (2)
1.2.3 系统各模块的最终方案 (5)
1.3 系统功能说明书(用户使用说明书) (5)
1.3.1 路灯的工作模式 (5)
1.3.2 按键操作说明 (6)
2 单元电路设计 (6)
2.1 电源供电电路 (6)
2.2 单片机最小系统 (7)
2.3 输入与输出 (7)
2.4 电流源驱动 (8)
3 软件设计 (9)
3.1系统主程序流程图 (9)
3.1.1系统流程图 (9)
3.1.2 定时器溢出中断处理函数流程图 (10)
3.1.3 按键扫描流程图 (11)
3.2 系统子程序 (11)
4 系统测试 (12)
4.1 测试仪器 (12)
4.2 指标测试 (13)
4.2.1 各部分测试的指标 (13)
4.2.2 系统实现的功能 (13)
5 结论 (15)
参考文献 (16)
附录 1 程序代码 (17)
附录 2 硬件原理图 (29)
附录 3 PCB图(部分) (30)
1 系统设计
1.1 设计要求
设计并制作一套模拟路灯控制系统。
控制系统结构如图1.1所示:
图1.1 模拟路灯控制系统
路灯布置如图1.2所示:
图1.2 路灯布置示意图(单位:cm)
1.1.1 基本要求
(1)支路控制器有时钟功能,能设定、显示开关灯时间,并控制整条支路按时开灯和关灯。
(2)支路控制器应能根据环境明暗变化,自动开灯和关灯。
(3)支路控制器应能根据交通情况自动调节亮灯状态:当可移动物体M(在物体前端
标出定位点,由定位点确定物体位置)由左至右到达S点时(见图2),灯1亮;当物体M到达B点时,灯1灭,灯2亮;若物体M由右至左移动时,则亮灯次序与上相反。
(4)支路控制器能分别独立控制每只路灯的开灯和关灯时间。
(5)当路灯出现故障时(灯不亮),支路控制器应发出声光报警信号,并显示有故障路灯的地址编号。
1.1.2 发挥部分
(1)自制单元控制器中的LED灯恒流驱动电源。
(2)单元控制器具有调光功能,路灯驱动电源输出功率能在规定时间按设定要求自动减小,该功率应能在20%~100%范围内设定并调节,调节误差≤2%。
(3)性价比高,工作稳定,符合电磁兼容(EMC)方面的要求,无对外干扰或干扰小。
1.2 总体设计方案
1.2.1 功能分解及设计思路
本模拟路灯控制系统的设计方案要实现的主要功能主要分解为以下五个方面:
(1)是时钟功能及定时开关灯。
(2)是根据环境明暗变化,自动开灯和关灯。
(3)是根据交通情况自动调节亮灯状态:当汽车靠近路灯时,路灯能自动点亮;当汽车远离时,路灯自动熄灭。
(4)声光报警功能,当路灯出现故障时而不亮时,控制器发出信号,并显示有故障路灯的地址编号。
(5)是根据绿色节能照明要求,采用恒流源驱动LED路灯发亮且能调光,路灯驱动电源输出功率能在20%~100%范围内设定并调节,调节误差≤2%。
以上功能的实现,都是以单片机为核心,在单片机系统实现的输入输出和显示功能的基础上,由单片机的内置逻辑和运算功能,加上一定的外围电路得以实现。
针对以上的五个功能,采用模块化的设计思想,以下分别叙述之。
1.2.2 方案论证与比较
(1)时钟功能及定时开关机
【方案一】采用专用时钟芯片
现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。
其优势是可以单独使用,直接连接到单片机外围,有自己独立的时钟晶振,精度较高。
单片机通过串行接口读取和写入当前的时钟值,时钟芯片的运行受单片机死机的影响少。
其缺点一是消耗了单片机IO口资源。
二是在编程时需要增加读写串行口的内容,消耗了单片机的运行时间。
三是增加了成本。
增加了时钟芯片及其外围电路的开支。
DS1302的典型应用电路如图1.3所示:
图1.3 DS1302的典型应用电路
【方案二】采用单片机内置时钟
本方案直接利用单片机的内置定时器,通过定时器的中断和简单运算实现时钟功能。
例如:
STC单片机,在4M时钟时,单个指令的运行时间是1微秒,设置定时器1每125个指令周期产生一个中断,即125微秒,8个中断后,时间平台是1毫秒,设置以下时间计数变量分别为:
uchar To1mS = 0x00; //当该变量增加到某个数值时,表示经过了1毫秒
uchar To2mS = 0x00; //当该变量增加到某个数值时,表示经过了2毫秒
uchar Is2mS = 0; //到达2毫秒时刻
uchar To20mS = 0x00; //当该变量增加到某个数值时,表示经过了20毫秒
uchar Is20mS = 0; //到达20毫秒时刻
uchar To1S = 0x00; //当该变量增加到某个数值时,表示经过了1秒
uchar Is1S = 0; //到达1秒时刻
在秒时间平台,用ToMIN变量,计数60秒后进入分钟平台,计数60分钟后,进入小时平台。
方案二没有增加外置电路,充分利用了单片机的定时器功能,实施简洁方便,主要的缺点是当控制系统断电或死机以后,需要人工重新定时。
本系统的时钟功能实现采用方案二。
(2)根据环境明暗变化,自动开灯和关灯功能。
【方案一】采用比较器的解决方案。
光敏电阻与固定电阻串联,加一级电压跟随器后输入比较器,与比较器负输入端的电压值进行比较,得到一个高电平或低电平输出,进入单片机的IO口。
优点是电路比较直观,操作比较方便,可直接通过电位器调节路灯的开启亮度。
对维护人员的要求不高。
缺点是不方便进行数码控制。
【方案二】采用AD变换。
光敏电阻与固定电阻串联,由单片机内置的AD变换接口读入当前的电压值,然后根据读取的电压值判断当前的环境亮度。
路灯的开启电平由内部的变量控制。
方案二的优点在于可以方便以实现对路灯开启电平的数码控制和远程控制。
本系统采用方案二。
(3)根据交通情况自动调节亮灯状态。
当汽车靠近路灯时,路灯能自动点亮;当汽车远离时,路灯自动熄灭。
【方案一】采用工业级的光电传感器。
这种光电传感器普遍运用于电梯、生产线等工业场所。
优点是使用方便,型号很多,输出量是开关量,不需调理电路。
缺点是价格较贵。
【方案二】采用廉价的红外对射传感器。
红外对射的特点是传输距离较远,能量集中。
当没有物体遮挡时,红外光直射到红外探头上,红外接收管连续输出低电平到单片机,当有物体经过时,红外光被遮住,此时红外探头输出高电平到单片机。
由于红外光的发射有一定的偏角,本设计利用了黑色套管遮挡红外发射灯头,以减少红外光的散失。
本系统采用方案二。
(4)故障报警功能
采用光敏电阻检测路灯的亮度,同时排除环境光的干扰。
利用单片机的AD口,读入光敏电阻上检测到的路灯亮度值。
(5)恒流源驱动LED及20%到100%范围内可调亮度。
【方案一】采用恒流源驱动芯片,目前市场上成品的恒流源驱动芯片比较多,一般采用使用取样电阻调节输出电流的方式。
这些芯片使用方便,性能较好,但价格较贵。
【方案二】采用PWM方式驱动功率三极管输出驱动电流,用电流取样电阻串入LED供电回路,用AD口读取当前的电流值,实现闭环控制。
方案二利用了单片机的AD变换资源,同时采用PWM方式,可以使LED工作在断断续续的状态,可以延长LED的使用寿命。
本系统采用方案二。
1.2.3 系统各模块的最终方案
图1.4
1.3 系统功能说明书(用户使用说明书)
1.3.1 路灯的工作模式
本模拟路灯控制系统具备5种工作模式,分别是自动群控模式、自动分控模式、根据照度自动控制模式、根据交通情况自动控制模式、手动控制模式,下面对每种工作模式简单介绍如下:
(1)自动群控模式
在该模式下,支路控制器根据设定好的定时信息,自动地同时打开或者关闭两盏路灯。
系统启动后默认进入该模式。
(2)自动分控模式
在该模式下,支路控制器根据设定好的定时信息,分别控制两盏路灯的开关,例如,当系统的时间和路灯1开灯的时间相等时,开启路灯1;当系统的时间和路灯2关灯的时间相等时开启路灯2。
(3)根据照度自动控制模式
在该模式下,当环境照度低于一定的值时开启两盏路灯,当环境照度高于一定的值时关闭两盏路灯。
(4)根据交通情况自动控制模式
在该模式下,当可移动物体M由左到右到达S点时(见图××),灯1亮;当物体M到达B点时,灯1灭,灯2亮;若物体M由右到左移动时,则亮灯的次序与上相反。
(5)手动控制模式
在手动模式时,两盏路灯只能由支路控制器用增加和减少键手动的调整亮度,路灯的亮度可以在0%~100%自由的上下调整,步进为10%。
(1)~(4)等四种工作模式是互斥的,即在某一时刻只能具有其中的一种功能,不过各种模式可以手动的切换,手动调整路灯亮度的功能在这四种模式中都是有效的。
另外,该路灯控制系统还具备故障检测功能,当路灯出现无法正常工作的状况时,该控制系统能够判定是哪一环节出现问题,并将故障通过声音警报及数码管显示告知用户。
1.3.2 按键操作说明
支路控制器具备5个按键,分别为时间调整键、模式选择键、增加键、减少键、确认键。
(1)时间调整键:按时间调整键时,可以循环地选择系统时间、路灯1和2共同的开关灯时间、
路灯1的开关灯时间和路灯2的开关灯时间。
(2)模式选择键:按模式选择键可以进行系统工作模式的切换,顺序为自动群控模式;
自动分控模式;根据照度自动控制模式;根据交通情况自动控制模式;手动控制模式。
(3)增加、减少键:按这两个键可以对时间或者亮度进行增减,长按时时间或者亮度可以连续变换。
(4)确认键:确认键只在时间调整时有效,分别确认小时、分钟、秒的输入。
2 单元电路设计
2.1 电源供电电路
图2.1
该电路采用变压器与三端稳压器相结合。
使220V电压经变压器变压,降为12V。
过整流桥并利用两个容量较大的电容滤波,从而得到较为稳定的直流电压。
通过7805型号的三端稳压器稳压之后,输出一个电压为5V,电流为750mA的直流电源。
2.2 单片机最小系统
图2.2
该控制系统的核心芯片采用的是STC12C5404AD,它的最小系统由STC单片机,电容和晶振组成。
上电瞬间,电源经复位电容向单片机发送一个高电平信号,使单片机复位。
同时晶振起振,使单片机工作。
晶振的大小可根据实际需要进行选择,常用的晶振有4M,6M,11.0592M,12M,24M等。
2.3 输入与输出
图2.3 按键输入
按键输出采用AD变换,节省了IO口资源。
通过不同大小的电阻进行分压,按下不同的按键就会向单片机发送不同的电压值。
如:按下s1是0V;按下s2,电压=2K/(2K+10K)*5V=0.83V。
经过单片机AD变换之后,就可以判断是哪个按键按下去,从而执行相应的功能。
图2.4 显示输出
该控制系统采用LED数码管显示输出。
LED数码管最突出的特点是使用简单,价格低廉。
在该系统中主要用来显示数字时钟,显示模式设定等。
2.4 电流源驱动
图2.5
电流源驱动电路,是为驱动1W 大功率LED灯而设计的。
LED灯属于电流源驱动,根据计算,每个1W的LED灯至少需要200mA的驱动电流才能点亮,而单片机的IO输出电流实际只有20mA到30mA,所以必须经过电流放大才能使其工作。
因此在该电路中采用了一个9013对电流进行放大。
3 软件设计
3.1 系统主程序流程图
3.1.1 系统流程图
图3.1 系统流程图
3.1.2 定时器溢出中断处理函数流程图
图3.2 定时器溢出中断处理函数流程图3.1.3 按键扫描流程图
图3.3 按键扫描流程图
3.2 系统子程序
本系统包含以下子程序
//键盘处理------------------------------
void KeyboardScan(void);//键盘扫描函数
void KeyboardOperate(uchar KeyNum);//按键处理函数
//定时器处理------------------------------
void InitTimer(void);//定时器参数设定及启动
//路灯控制------------------------------
void BrightnessSet(uchar LightNum, uchar Brightness);//亮度调整
//延时函数-----------------------------
void delay(uint i);
//AD采样------------------------------
void InitADC(); //ADC转换初始化
uchar GetADCResult(uchar ch); //取ADC转换初值
uint get_adc(uchar ch); //对ADC取值进行操作
//显示函数---------------
void display();
//蜂鸣器发生函数-----------------
void speak();
/**************************************************************
* 亮度调整函数*
**************************************************************/
void BrightnessSet(uchar LightNum, uchar Brightness);
/**************************************************************
* 中断处理程序*
**************************************************************/
void t0() interrupt 1 using 1
void t1() interrupt 3
4 系统测试
4.1 测试仪器
数字示波器:该系统采用红外对射传感器,因为它的正常工作需要外加38KHz的触发频率。
数字示波器主要用来测量频率。
万用表:在该系统中用来测量电压、电流、电阻等。
4.2 指标测试
4.2.1 各部分测试的指标
4.2.2 系统实现的功能
表2—2 发挥部分
表2—3 特色功能
5 结论
该系统调试最终结果,符合本次设计的全部要求。
经过功率扩大、电网通讯等方面的改良,就能用于实际路灯控制。
以其超低成本,高可靠性的特点,与其他现有成品相比,具有一定的竞争优势。
该控制系统在调试过程中,遇到过一些与理论相差很大的实际问题。
比如红外对射传感器的对焦问题,因为红外线是不可见光,对焦比较麻烦,但是借用其他辅助工具就会简单很多。
最简便的方法是利用带摄像头的手机来获取红外光,从而能顺利完成对红外对射传感器的对焦。
红外对射的接收部分,因受频率限制,只能接收频率在38KHz的红外信号,所以在调试过程中有一定的难度。
经方案论证,采用PWM脉宽调制输出,是切实可行的最有效方案。
程序书写如下:
#include<reg51.h>
sbit pwmout=P1^1; //定义PWM输出端口
void init() interrupt 1 //中断方式1
{
TH0=0xff;TL0=0xf3; //定时器初值
pwmout=~pwmout; //对PWM输出取反,产生一高一低的脉冲信号
}
void main()
{
TMOD=0X11; //定时计数器工作在1方式
TH0=0xff;TL0=0xf3; //初始化初值
EA=1;ET0=1;TR0=1;//开总中断,允许定时器1中断,开定时器1中断
while(1);
}
参考文献
[1] 于殿泓,王新年.单片机原理与程序设计实验教程[M].西安:西安电子科技大学出版社,2007,8.
[2] 赵文博,刘文涛.单片机语言C51程序设计[M].北京:人民邮电出版社,2005,10.
[3] 李爱秋.红外线遥控12位电子密码锁的设计[J].温州职业技术学院学报第8卷第一期,2008.
[4] 陈杰,黄鸿.传感器与检测技术[M].北京:高等教育出版社,2010,8.
[5] 周航慈. 单片机应用程序设计技术[M]. 北京:北京航空航天大学出版社,2011,2.
[6] 李朝青. 单片机原理及接口技术[M]. 北京:北京航空航天大学出版社, 2005,10.
[7] 孙育才. MCS-51系列单片微型计算机及其应用[M]. 东南大学出版社, 2004,6.
[8] 沈红卫. 单片机应用系统设计实力与分析[M]. 北京:北京航空航天大学出版社,2003.
[9] 徐爱钧, 彭秀华. 单片机高级语言C51应用程序设计[M].北京航空航天大学出版社,2006.
[10] 曾一江. 单片微机原理与接口技术[M]. 北京:科技出版社,2009,12.
[11] 康华光. 电子技术基础(模拟部分)[M]. 北京:高等教育出版社, 2004,4.
附录1 程序代码
#include"STC12C5410AD.h"
#include "intrins.h"
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
uchar dis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3e,0x77,
0x40,0x00,0x76,0x71,0x37,0x79,0x31,0x38};//10_V,A,-,熄灭,H,F_15,N,E,R,L//////
sfr ADC_RES = 0xC6; //ADC high 8-bit result register
/////
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //420 clocks
#define ADC_SPEEDL 0x20 //280 clocks
#define ADC_SPEEDH 0x40 //140 clocks
#define ADC_SPEEDHH 0x60 //70 clocks
////////////////////////ISP//////////////////
#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值/////////////////////////////////////////////////////////////////////////////
sbit k1=P1^0;//按钮
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit cgq_a=P1^3;
sbit cgq_b=P1^4;
sbit cgq_c=P3^0;
sbit zishi=P3^1;
////
sbit en1=P3^4;//373使能端端码
sbit en2=P3^5;//373使能端位码
///
sbit feng=P3^7;
///
sbit led1=P3^2;
sbit led2=P3^3;
/////////函数定义部分
uchar d[8];
char shi=0,fen=0,miao=0,set_miao=0,pwm,k3num=0,
set_fen=0;set_on_shi=0,set_off_shi=0,light=0,pwm_count=0;
bit shijian_bit=1,pwm_bit=1,light_bit=1,bad_deng1=0,bad_bit=0,
bad_deng2=0,display_bit=0,auto_mode=1,sdong=1,sdong_bit=0;
uint sum2=0,shi_count=0,sum_deng1,sum_deng2,kk,jj,ff,ii;
////
void IAP_Disable();
uchar Byte_Read(uchar addh,uchar addl);
void Sector_Erase(uchar addh,uchar addl);
void Byte_Program(uchar addh,uchar addl, uchar ch);
////////////////////////////////
void InitADC(); //ADC转换初始化uchar GetADCResult(uchar ch); //取ADC转换初值uint get_adc(uchar ch);
///////////// //取ADC转换数据10位
void delay(uint i);
void jiyi();
void read_jiyi();
void run_shijian(); //延时1MS
/////////////////////////////////////////////////////////////////////////
void delay(uint i)//延时函数
{
uint a,b;
for(a=0;a<i;a++)
for(b=0;b<120;b++);
}
//////////////////
void display()//显示函数
{
uchar i,s=0x01;
for(i=0;i<8;i++)
{
P2=dis[d[i]];
en1=1;en1=0;
P2=~s;
en2=1;en2=0;
delay(4);
P2=0xff;
en2=1;en2=0;
s=s<<1;
}
}
void chaizi()//拆字函数
{
d[0]=shi/10;
d[1]=shi%10;
d[2]=12;
d[3]=fen/10;
d[4]=fen%10;
d[5]=12;
d[6]=miao/10;
d[7]=miao%10;
}
void speak()//蜂鸣器发生函数
{
feng=0;
delay(10);
feng=1;
}
void t0() interrupt 1 using 1
{
TH0=0Xfc;TL0=0X18;
if(light_bit)
{
if(pwm_count>=10) pwm_count=0;
else pwm_count++;
if(pwm_count<=pwm) led1=led2=1;
else led1=led2=0;
///////////////////
sum2=get_adc(7);
sum2=sum2*48/1000;
if(sum2<5) {led1=led2=1;}
else if(sum2<15)
{
pwm=9;
}
else if(sum2<35)
{
pwm=0;
}
else if(sum2<45) {led1=led2=0;}
else ;
}
if(shijian_bit)
{
if(shi_count<500) shi_count++;
else{miao++;shi_count=0;}
if(miao>=60){miao=0;fen++;}
if(fen>=60){fen=0;shi++;}
if(shi>23){shi=0;}
}
//////////////
if(kk<=2000) kk++;
else {kk=0;bad_bit=1;}
if(ff<=1000) ff++;
else {ff=0;ii++;bad_bit=0;if(ii==6){ii=0;}}
//////////////////
//////////////////////////
sum_deng1=get_adc(6);
sum_deng1=sum_deng1*48/1000;//光敏检测灯A if(sum_deng1>=25) bad_deng1=1;
else bad_deng1=0;
//////////////////////////////////
sum_deng2=get_adc(5);
sum_deng2=sum_deng2*48/1000;//光敏检测灯B if(sum_deng2>=25) bad_deng2=1;
else bad_deng2=0;
}
void set_time()//设置时间
{
while(1)
{
shijian_bit=0;
d[5]=12;
d[6]=miao/10;
d[7]=miao%10;
d[0]=d[1]=d[2]=d[3]=d[4]=13;
display();
if(k4==0)
{
while(!k4)display();
speak();
if(miao<59)
miao=miao+1;
else miao=0;
}
if(k5==0)
{
while(!k5)display();
speak();
miao=miao-1;
if(miao<=0)
miao=59;
}
if(k1==0)
{
while(!k1)display();
speak();
goto m1;
}
}
m1:
while(1)
{
shijian_bit=0;
d[2]=12;
d[3]=fen/10;
d[4]=fen%10;
d[0]=d[1]=d[5]=d[6]=d[7]=13;
display();
if(k4==0)
{
while(!k4)display();
speak();
if(fen<59)
fen=fen+1;
else fen=0;
}
if(k5==0)
{
while(!k5)display();
speak();
fen=fen-1;
if(fen<=0)
fen=59;
}
if(k1==0)
{
while(!k1)display();
speak();
goto m2;
}
}
m2: while(1)
{
shijian_bit=0;
d[0]=shi/10;
d[1]=shi%10;
d[2]=d[3]=d[4]=d[5]=d[6]=d[7]=13;
display();
if(k4==0)
{
while(!k4)display();
speak();
if(shi<23)
shi=shi+1;
else shi=0;
}
if(k5==0)
{
while(!k5)display();
speak();
shi=shi-1;
if(shi<=0)
shi=23;
}
if(k1==0)
{
while(!k1)display();
speak();
goto m3;
}
}
m3:jiyi();shijian_bit=1;
}
void jiyi()//存储函数
{
Sector_Erase(0x2a,0x00);
delay(10);
Byte_Program(0x2a,0x01,shi);
delay(10);
Byte_Program(0x2a,0x02,fen);
delay(10);
Byte_Program(0x2a,0x03,miao);
delay(10);
Byte_Program(0x2a,0x04,set_on_shi);
delay(10);
Byte_Program(0x2a,0x05,set_off_shi);
delay(10);
}
void read_jiyi()//读出存人的值
{
shi=Byte_Read(0x2a,0x01);
delay(10);
fen=Byte_Read(0x2a,0x02);
delay(10);
miao=Byte_Read(0x2a,0x03);
delay(10);
set_on_shi=Byte_Read(0x2a,0x04);
delay(10);
set_off_shi=Byte_Read(0x2a,0x05);
delay(10);
}
void set_on_off()//设置开关灯时间
{
while(1)
{
d[3]=0;
d[4]=16;
d[5]=12;
d[6]=set_on_shi/10;
d[7]=set_on_shi%10;
d[0]=d[1]=d[2]=13;
display();
if(k4==0)
{
while(!k4)display();
speak();
if(set_on_shi<23)
set_on_shi=set_on_shi+1;
else set_on_shi=0;
}
if(k5==0)
{
while(!k5)display();
speak();
set_on_shi=set_on_shi-1;
if(set_on_shi<=0)
set_on_shi=23;
}
if(k2==0)
{
while(!k2)display();
speak();
goto m1;
}
}
m1:
while(1)
{
d[2]=0;d[3]=d[4]=15;
d[0]=d[1]=13;d[5]=12;
d[6]=set_off_shi/10;
d[7]=set_off_shi%10;
display();
if(k4==0)
{
while(!k4)display();
speak();
if(set_off_shi<23)
set_off_shi=set_off_shi+1;
else set_off_shi=0;
}
if(k5==0)
{
while(!k5)display();
speak();
set_off_shi=set_off_shi-1;
if(set_off_shi<=0)
set_off_shi=23;
}
if(k2==0)
{
while(!k2)display();
speak();
goto m2;
}
}
m2:jiyi();shijian_bit=1;
}
void main()//主函数
{
P2M0=0x00;P2M1=0xff;
TMOD=0x11;
TH0=0Xfc;TL0=0X18;
// TH1=0xff;TL1=0x9c;
EA=1;ET0=1;TR0=1;
// EA=1;ET1=1;TR1=1;
P3M0=0x00;P3M1=0xff;
InitADC();
delay(10);
read_jiyi();
zishi=1;
loop:
if(bad_bit)
{
if(bad_deng1==1){bad_deng1=0;goto loop1;}//1
if(bad_deng2==1){bad_deng2=0;goto loop3;}//2
if(bad_deng1==1&&bad_deng2==1){bad_deng2=bad_deng1=0;;goto loop2;}//1.2 }
if(k1==0)
{
while(!k1)display();
speak();
set_time();//设置时间
}
if(k2==0)
{
while(!k2)display();
speak();
set_on_off();//设置开关灯时间
}
if(sdong_bit)
{
if(shi>=set_on_shi){led1=led2=0;sdong=1;}
if(shi>=set_off_shi){led1=led2=1;sdong=0;}
}
chaizi();
display();
/////////////////
if(k3==0)
{
while(!k3);
speak();
k3num++;
switch(k3num%2)
{
case
1:zishi=0;led1=led2=0;bad_bit=0;auto_mode=1;sdong=1;sdong_bit=0;light_bit=1;break;//自动模式case
0:zishi=1;led1=led2=1;bad_bit=1;auto_mode=1;sdong=0;sdong_bit=1;light_bit=0;break;//手动模式}
}
if(auto_mode)//自动模式
{
if(sdong)
{
if(cgq_a==0&&cgq_b==1&&cgq_c==1){led1=0;led2=1;}//3.2开 3.3 关
if(cgq_a==1&&cgq_b==0&&cgq_c==1){led1=1;led2=0;}//3.2关 3.3开
if(cgq_a==1&&cgq_b==1&&cgq_c==0){led1=1;led2=1;}//3.2关 3.3 关
}
}
goto loop;
//////////////////////////
loop2:
if(ii==3||ii==6)
{bad_bit=0;goto loop;}
bad_bit=0;
d[0]=17;d[1]=18;d[2]=d[5]=12;d[3]=19;
d[4]=1;d[6]=19;d[7]=2;//ER-L1-L2
display();
if(bad_deng1==0||bad_deng2==0) goto loop;
goto loop2;
loop1:
if(ii==3||ii==6)
{bad_bit=0;goto loop;}
bad_bit=0;
d[0]=17;d[1]=d[2]=d[4]=18;d[3]=0;d[5]=12;
d[6]=19;d[7]=1;//ERROR-L1
display();
if(bad_deng1==0) goto loop;
goto loop1;
loop3:
if(ii==3||ii==6)
{bad_bit=0;goto loop;}
bad_bit=0;
d[0]=17;d[1]=d[2]=d[4]=18;d[3]=0;d[5]=12;
d[6]=19;d[7]=2;//ERROR-L2
display();
if(bad_deng2==0) goto loop;
goto loop3;
}
/////////////
uint get_adc(uchar ch)
{uint adc_r;
adc_r=GetADCResult(ch)*4+ADC_LOW2;
return(adc_r);
}
/////////////////
uchar GetADCResult(uchar ch)
{ ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //Must wait before inquiry
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
ADC_CONTR &= ~ADC_FLAG; //Close ADC
return ADC_RES; //Return ADC result
}
///////////
void InitADC()
{
P1 = P1M1 =P1M0 =0xff; //Set all P1 as Open-Drain mode
ADC_RES = 0; //Clear previous result
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
delay(2); //ADC power-on and delay
}
///////////////////////////////////////////////////////////
uchar Byte_Read(uchar addh,uchar addl)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令。