智能交通信号灯控制系统终稿

上传人:be****l 文档编号:67523151 上传时间:2022-03-31 格式:DOC 页数:35 大小:431.50KB
返回 下载 相关 举报
智能交通信号灯控制系统终稿_第1页
第1页 / 共35页
智能交通信号灯控制系统终稿_第2页
第2页 / 共35页
智能交通信号灯控制系统终稿_第3页
第3页 / 共35页
点击查看更多>>
资源描述
. . . 本科生毕业论文(设计)题目: 智能交通信号灯控制系统 专业代码: 070201 超 学号:2008200998 单位:物理科学与信息工程学院 指导教师:安学立2012年5月10日31 / 35目 录前言11、 智能交通信号灯控制系统研究目的和要求11.1、智能交通信号灯控制系统课题的研究目的和意义11.2、智能交通信号灯控制系统的设计要求22、 智能交通信号灯控制系统的总体结构22.1、智能交通信号灯控制系统简介22.2、智能交通信号灯控制系统硬件设计32.3、智能交通信号灯控制系统软件设计102.3.1、基本功能102.3.2、软件设计102.4、系统调试11结论12参考文献13致14附录15摘 要通过对目前国外智能交通信号灯控制系统方面相关资料的研究,结合目前国外主流的单片机应用技术,搭建一套完整的智能交通信号灯控制系统软硬件控制平台。系统功能主要有:交通信号灯正常显示、出现特殊情况或紧急情况时,可以让交通信号灯以常“红”显示,转去处理特殊情况或者紧急情况,处理完成以后系统会在接收到提醒时立即恢复交通信号灯的正常显示;系统具有独立的时钟系统。关键词:单片机; 交通信号灯; 紧急情况; AbstractBased on current domestic and foreign intelligent traffic signal lamp control system information related to the research, combined with the current domestic and international mainstream chip application technology, set up a complete set of intelligent traffic signal lamp control system software and hardware control platform. System functions include: traffic signal lamp display, there are special circumstances or emergency, can make the traffic signal lamp is used to red display, turned to dealing with special situations or emergencies, processing completed system will receive a reminder when immediate restoration of traffic signals display; system is independent of the clock system. Key words: single chip microcomputer; traffic lights; emergency;智能交通信号灯控制系统前言交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。随着智能控制技术的发展,未来的交通信号灯控制系统正朝着智能化,自适应的方向发展。智能交通信号灯控制系统能够根据实际的车流量状况进行实时调控红绿灯的通行时间,减少道路堵塞,优化道路交通状况。基于此,我们可以看出,研究这种新型的智能交通信号灯控制系统即有很强的实用价值和现实意义。目前单片机渗透到我们生活的各个领域,基于单片机实现的底层控制系统几乎无处不在。飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制等这些都离不开单片机。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。1、 智能交通信号灯控制系统研究目的和要求1.1、智能交通信号灯控制系统课题的研究目的和意义智能交通信号灯控制系统的研发和设计,目的是利用现代化计算机技术、通讯技术对日益快速发展的城市十字路口交通信号灯实现自动化监控和智能化的科学管理,做到集中管理,智能控制。进一步提高道路照明质量,提高服务质量,从而提高系统的整体社会效益、管理效益、经济效益和环保效益。智能交通信号灯控制系统基于STC89C51系列单片机1,配合高精度SD2403API时钟芯片所开发的一套简单实用的智能交通信号灯模拟控制系统,是对单片机应用的一个升华,具有很强的实用性。能够很方便地使用在城市道路、乡镇道路、甚至高速公路交通信号灯的智能控制方面。1.2、智能交通信号灯控制系统的设计要求 智能交通信号灯控制系统性能的基本要稳定性和可靠性,具体功能要求如下:(1)交通信号灯正常运行:红灯、黄灯、绿灯交替亮灭,红灯亮22S,黄灯亮3S、绿灯亮20S,数码管显示当前的时间。(2)报警情况处理:当按下K1或K2,表示第一个地点或第二个地点有特殊情况或紧急情况发生,则立即反馈给底层控制系统,底层系统立即中断交通信号灯的正常运行,使该路段全部以红灯显示,禁止车辆通行,并随时监测该路段特殊情况是否处理完毕。(3)报警情况取消:当特殊情况或者紧急情况处理完毕的时候,立即反馈给底层控制系统,底层控制系统立即开启交通信号灯的正常工作模式,并把当前的时间反馈给系统,系统可以通过数码管显示当前时间。系统主要性能指标:系统的稳定性,包括单片机要保证不死机,串口通信的稳定性等;系统的实用性和创新性等;2、 智能交通信号灯控制系统的总体结构2.1、智能交通信号灯控制系统简介智能交通信号灯控制系统由四个部分组成:单片机最小系统、系统时钟校时查时系统、报警系统(报警和取消报警)、显示系统。其中单片机最小系统包括STC89C52单片机、晶振电路(11.0592MHZ)2、复位电路、电源部分(+5v电压由三端稳压集成电路LM7805输出,前后端需要加上滤波电容);系统时钟电路是基于高精度SD2403API时钟芯片与相应的外围电路搭建而成,时钟芯片部寄存器读取方式采用IIC总线读取的方式;显示电路采用两个两位的共阴极数码管显示;模拟报警电路是用按键检测模拟的方式,K1、K2按下时,表示有紧急情况或出现特殊情况,系统转去处理当前特殊情况;K3、K4表示取消报警,当前交通信号灯按照正常情况亮灭。智能交通信号灯控制系统充分运用单片机技术,底层程序利用KEIL C语言开发系统平台进行开发3,硬件部分运用Portel DXP2004电路图设计软件设计4。2.2、智能交通信号灯控制系统硬件设计 智能交通信号灯控制系统包括单片机部分;电源部分;高精度SD2403API实时时钟芯片部分;紧急情况发生与取消相关电路;数码管显示部分;其系统框图如图4所示;智能交通信号灯控制系统的底层电路主要分为四个部分:单片机最小系统电路、系统校时查时系统电路、报警系统电路、数码管显示电路。(1) 单片机最小系统包括单片机、石英晶振电路、+5V稳压电路、复位电路、电源指示灯电路等几个小的功能电路。(2)系统校时查时系统电路是由高精度SD2403API时钟芯片与相应的外围电路搭建而成,单片机通过IIC总线的方式对芯片部进行相应的设置和读取。(3)报警系统电路用了四个按键进行模拟:K1、K2按下时,表示有紧急情况或出现特殊情况,系统转去执行当前特殊情况;K3、K4按下时,表示取消报警,当前交通信号灯按照正常情况亮灭,特别说明,系统在主程序中会对按键进行实时检测。(4)数码管显示电路主要将显示数据的BCD码转换成相对应的编码。选用两个两位的共阴极数码管分别显示时间的时和分。智能交通信号灯控制系统电路图是用Protel DXP2004软件设计。时钟校时和查询工具可以通过PC端串口调试助手5向单片机发送相应的命令(21位)来实现。图4、智能交通信号灯控制系统框图系统设计原理图:、如图5.1所示,该部分是STC89C51单片机最小系统,包括5V电源部分,其5V电源是由外接电源12V,经过稳压芯片LM7805输出稳定的5V电压;D1是电源指示灯,R1是限流电阻;晶振电路,系统所用的晶振频率为11.0592MHZ,由石英晶体搭建配套电路供给;复位电路,由于51系列单片机复位需要至少持续两个机械周期以上的高脉冲;图5.1、单片机最小系统、报警系统(按键)和时钟系统:如图5.2所示,系统时钟由高精度SD2403API时钟芯片通过搭建外围电路提供,供电电压为5V,报警系统由按键来模拟,K1、K2按下时,表示有紧急情况或特殊情况发生;K3、K4按下时表示上一次的紧急情况或者特殊情况已经处理完毕;图5.2、报警系统(按键)和时钟系统电路、显示部分:如图5.3所示,显示部分包括数码管显示和LED指示灯显示部分;数码管是用共阴极的双位数码管,每一个数码管都有两个位选,八个段选;如图所示,LED指示灯一共有7个,分别与单片机引脚相连。D1、D2表示红灯、D3、D4表示黄灯、D5、D6表示绿灯;D7是红灯,可以指示是否报警,当有紧急情况或者特殊情况发生时,红灯常亮,但取消报警时,处于熄灭状态;图5.3、数码管与LED指示灯电路、通信部分:该系统中单片机需要与PC端进行通信,中间的电平转化借助MAX232芯片,其中0.1uf电容的主要作用是滤波,去耦。其可以有TTL电平转化为232电平,方便通信,其外围电路如图5.4;图5.4、串口通信部分电路各芯片主要管脚功能如下: 1、STC89C52单片机(图1)167: ALE/PROG:地址锁存允许/片EPROM编程脉冲 ALE功能:用来锁存P0口送出的低8位地址 PROG功能:片有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。 PSEN:外ROM读选通信号。 RST/VPD:复位/备用电源。 RST(Reset)功能:复位信号输入端。 VPD功能:在Vcc掉电情况下,接备用电源。 EA/Vpp:外ROM选择/片EPROM编程电源。 EA功能:外ROM选择端。 Vpp功能:片有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。(5)、 I/O线80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。图1、51单片机引脚图2、高精度SD2403API时钟芯片8915:SD2400系列是一种具有置晶振、支持IIC串行接口的高精度实时时钟芯片,CPU可使用该接口通过5位地址寻址来读写片32字节寄存器的数据(包括时间寄存器、报警寄存器、控制寄存器、通用SRAM寄存器)。 SD2400系列置晶振,该芯片可保证时钟精度为5ppm(在25下),即年误差小于2.5 分钟;该芯片置时钟精度调整功能,可以在很宽的围校正时钟的偏差(分辨力3ppm),通过外置或置的数字温度传感器可设定适应温度变化的调整值,实现在宽温围高精度的计时功能。 SD2400系列置的一次性工业级电池或充电电池可保证在外部掉电情况下时钟使用寿命为58年时间;部具备电源切换电路,当芯片检测到主电源VDD掉到电池电压以下,芯片会自动转为由备电电池供电。 SD2400系列置单路定时/报警中断输出,报警中断时间最长可设至100年;置频率中断输出和倒计时中断输出。 SD2400系列采用了多种提高芯片可靠性的技术,可满足对实时时钟芯片的各种需要,是在选用高精度实时时钟时的理想选择。 SD2400系列部各种封装引脚图如图2.1,一般常用的是DIP-8脚封装;部结构图如图2.2所示;图2.1、SD2403API引脚图图2.2、SD2403API部结构图3、两位共阴极数码管9,有2个公共端,8位段选端,点亮二极管的电流一般在15MA左右;图3.1给出了数码管基本引脚图;数码管与单片机的基本连接图如图3.2;图3.1、数码管引脚图图3.2、数码管与单片机连接图数码管使用条件:、段与小数点之间加限流电阻;、使用电压:段:根据发光颜色决定 、小数点:根据发光颜色决定、使用电流:静态: 总电流80MA(每段10MA)、动态:平均电流4-5MA,峰峰值电流100MA;2.3、智能交通信号灯控制系统软件设计2.3.1、基本功能(1)交通信号灯正常运行:红灯、黄灯、绿灯交替亮灭,红灯亮22S,黄灯亮3S、绿灯亮20S,数码管显示当前的时间。(2)系统检测到K1或K2按下时,表示第一个地点或第二个地点有特殊情况或紧急情况发生,立即反馈给底层控制系统,单片机立即中断交通信号灯的正常运行,使该路段全部以红灯显示,禁止车辆通行,并随时监测该路段特殊情况是否处理完毕。(3)报警情况取消:系统检测到K3、K4键按下时,表示特殊情况或者紧急情况处理完毕,底层控制系统立即开启交通信号灯的正常工作模式,并把当前的时间反馈给系统,系统可以通过数码管显示当前时间。2.3.2、软件设计7121314智能交通信号灯控制系统软件基于KEIL C语言开发系统平台,用C语言开发,工程主要包括主程序(main.c)、定时器部分(timer.c)、时钟部分(sd2403api.h)、执行程序(command_process.c)、串口部分(uart.c)、全局变量声明(global.c);主程序流程图:图6、主程序流程图 流程图详解:系统上电以后首先对系统中所用到的相关变量进行初始化,然后对定时器0、串口、看门狗等进行初始化,然后进入While()循环,首先进行喂狗,然后检测串口1是否有命令过来,如果有命令,则转去执行串口1的命令,主要是系统时间的设置与查询;如果串口1中没有命令到来,则正常执行交通信号灯亮灭程序,此时再去判断是否有报警信息,如果有报警命令到来,则转去执行报警程序,如果没有,则转去执行数码管显示部分程序,执行完成以后转会喂狗部分,继续按照以上步骤执行,程序在此循环。串口相关程序流程图:图7、串口相关程序流程图 系统用到串口部分程序的作用主要是对系统时间进行设置和查询,这样整套系统时间就可以任意设置,并且由于SD2403API时钟芯片精度较高,一年中的误差率不会超过几分钟,所以系统在第一次使用时设置好了时间,可以每隔一年左右的时间进行校准,当然可以通过串口命令随时校准,如果嫌比较麻烦,单片机部已经对时间校准进行了设置,每隔一年校准一次; 通过以上流程图,我们可以看出,此串口程序可以接收一条长21个字节的完整命令,并且带有超时检测功能。即如果一条命令超时长达2s,则这条命令取消,重新接收下一条命令。这样可以保证命令的完整性和可靠性; 由于能够对系统时间进行设置和查询,且精度较高,所以这套配搭时间的系统用在交通道路方面的可靠性也较之一般系统高的多,整套系统交通信号灯亮灭的时间都可以随时记录和查询。方便日后进行的维修和事故处理。 注:整个系统的源程序、系统校时查询时间命令见附录(带注释);2.4、系统调试调试主要步骤如下8910:、根据硬件线路设计将硬件线路连接好;、根据软件流程图编写好源程序、程序在PC端上编译通过,并与PC机硬件连好,进行连接和运行调试;相关调试说明:智能交通信号灯底层控制系统硬件电路方面只需要熟悉Protel DXP软件即可,电路调试主要集中在电源部分和数码管显示部分中的位选信号部分,数码管位选信号用NPN三极管(9013)进行驱动,其中基极限流电阻的选择是个关键。软件的调试是本系统的难点也是重点。软件部分采用KEIL C语言开发系统进行编写,调试的重点在于采用IIC总线方式对时钟芯片部寄存器上的数据进行修改和读取,数码管动态显示以与定时器精确定时设置。本系统用STC-ISP-V4.80下载软件将KEIL 软件生成的相应的HEX文件下载到AT89C52单片机部,并进行在线调试。结论智能交通信号灯控制系统硬件部分用Protel DXP软件进行设计,软件部分采用KEIL C语言进行开发,充分发挥了C语言简单、实用、可移植性强的特点。总之,采用单片机应用开发技术使得复杂的电子系列设计变得简单容易,大大提高了设计的效率。本设计的特点在于AT 89C52单片机应用方面国已经比较成熟,系统开发周期短,整个系统稳定性高,能够满足道路照明的要求。该系统使用方法较为简单,能够很方便地进行量产普与。总之,整个设计的工作稳定可靠,具有很强的抗干扰能力是本系统的一大特色。本设计还可以从经济适用的角度出发,结合外围的LED、按键输入、数码管显示、报警和等电路利用C语言编写主核芯片的控制程序,使该系统能够实现交通信号灯的智能化控制。这样就可更方便的应用于城市道路、乡镇道路甚至高速公路等用到交通信号灯的场所。这也使得该系统更具有实用性。考虑到美观、成本、稳定性等诸多方面的因素、该系统功能上还有许多需要改进的地方。比如最关键的一点该系统只是对某个特定通道上的交通信号灯进行控制,而没有形成一个巨大的城市道路交通信号灯控制系统平台。但是通过此次学习,我深深的感受到,只有系统地充分地学习单片机方面,硬件电路方面的理论知识,才能在在理论学习的基础上进行系统开发时,能够更加地得心应手!只有使得理论充分地与实际相结合,才能顺利的做出较为出色的毕业设计, 加强单片机应用方面的能力,设汁好与工程实际应用接轨的课程题目。参考文献1 广弟等 单片机基础 航空航天, 2001.7 2 楼然苗等 51系列单片机设计实例 航空航天, 2003.3 3 唐俊翟等 单片机原理与应用 冶金工业, 2003.9 4 瑞新等 单片机原理与应用教程 机械工业, 2003.7 5 吴国经等 单片机应用技术 中国电力 2004.1 6 全利、迟荣强 单片机原理与接口技术 高等教育 2004.1 7 侯媛彬等 凌阳单片机原理与其毕业设计精选 科学 2006 8 罗亚非,凌阳十六位单片机应用基础 航空航天大学 2003 9 北阳电子,061A凌阳单片机与其附带光盘 2003年 10 毅刚等 MCS-51单片机应用设计,哈工大 2004年第2版 11 霍孟友等,单片机原理与应用机械工业 2004.1 12 霍孟友等 单片机原理与应用学习概要与题解 机械工业2005.3 13 许泳龙等,单片机原理与应用 机械工业,2005.1 14 马忠梅等,单片机的C语言应用程序设计,航空航天大学,2003修订版 15 薛均义 彦斌 虞鹤松 樊波,凌阳十六位单片机原理与应用,2003年,航空航天大学 致历时两个月的时间终于将这篇论文写完,在论文的写作过程中老师和同学给了我很大的帮助。首先要强烈感我的论文指导老师安学立老师,在我的论文写作过程中给予了诸多的指导,既学到知识又不产生依赖感。在安老师的悉心指导下,我对单片机应用方面知识有了进一步的理解和掌握,通过学习使我更加了解了我们所学的专业,学有所用,从而更加热爱电子专业。感我的同学和朋友,在我写论文的过程中给我提了很多的建议,还在论文的撰写和排版等过程中提供了很多的帮助。由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和同学批评和指正!附录系统校时与时间查询命令:系统时间设定(秒、分、时、星期): 2f 43 2f 06 00 00 00 00 00 00 00 00 0A 00 81 # # # # # CC 系统时间设定(日期、月份、年份、#):2f 43 2f 06 00 00 00 00 00 00 00 00 0A 00 82 # # # # # CC系统即时时间查询(秒、分、时、星期): 2f 43 2f 06 00 00 00 00 00 00 00 00 0A 00 88 00 00 00 00 84 CC 系统即时时间查询(日期、月份、年份、#):2f 43 2f 06 00 00 00 00 00 00 00 00 0A 00 89 00 00 00 00 99 CC 注明: 该命令中第19位是从第4到第18位之间包括第4和第18位的所有数据的八位异或校验。“#”代表任意设定的值或者需要求出的校验值。系统源程序如下(带注释):(1)、主程序如下(main.c):#include#include#include#include#include#include#includemain()unsigned char i;translight(); /相关变量初始化Phy_timer0_init(); /定时器1初始化uart1_init(); /串口初始化EA=1; /开总中断watchdog_init(); /看门狗初始化delay(30);while(1)watchdog_kick(); /看门狗从新计数if(uart1_flag) /是否有串口命令过来/有串口命令要执行;uart1_flag=0;uart1_flag_lock=1;/防止串口数据还没有处理完,又来了一条新的命令uart1_command_process(); /最大6层嵌套;uart1_flag_lock=0;tra_light_process(); /正常亮灯check_alarm(); /检测报警信息for(i=0;i10;i+) /循环执行10次,能够增加LED的亮度display(); /数码管连续显示10次(2)、系统执行子程序文件(command_process.c):#include#include#include#include/共阴数码管 0-9 - _ 空 表/=红灯20s、黄3s、绿灯22s按照正常次序依次执行=/void tra_light_process();void check_alarm();void display(void);void unknow_command(void);void process_0A();void process_0A_00();void back_time(unsigned num); /0返回时、分、秒、星期,1返回年、月、日void back_command(void);/=错误命令返回函数函数=/void unknow_command(void)back_buffer0=0x4F;back_buffer1=0x4F;back_buffer2=0x4F;uart1_send_string(back_buffer,21);back_buffer0=0x2F;back_buffer1=0x2F;back_buffer2=0x2F;/=交通信号灯正常执行函数=/void tra_light_process()if(!TRA_ALARM_FLAG) /没有紧急情况发生if(GREEN_FLAG) /需要亮绿灯GREEN_COUNT=0; /开始对绿灯时间进行记时,计时22SRED_1 =1; /关掉红灯RED_2 =1; /关掉红灯YELLOW_1=1; /关掉黄灯YELLOW_2=1; /关掉黄灯GREEN_1 =0; /点亮绿灯GREEN_2 =0; /点亮绿灯ALARM =1; /关闭报警灯else if(YELLOW_FLAG)YELLOW_COUNT=0; /开始对黄灯时间进行记时,计时3SRED_1 =1; /关掉红灯RED_2 =1; /关掉红灯YELLOW_1=0; /点亮黄灯YELLOW_2=0; /点亮黄灯GREEN_1 =1; /关掉绿灯GREEN_2 =1; /关掉绿灯ALARM =1; /关闭报警灯else if(RED_FLAG)RED_COUNT=0; /开始对红灯时间进行记时,计时22SRED_1 =0; /点亮红灯RED_2 =0; /点亮红灯YELLOW_1=1; /关掉黄灯YELLOW_2=1; /关掉黄灯GREEN_1 =1; /关掉绿灯GREEN_2 =1; /关掉绿灯ALARM =1; /关闭报警灯elseelse/=报警信息检测=/void check_alarm()if(K1=0&K2=0)/任意有按键按下时都会响应说明有地方有险情RED_COUNT=0;RED_1 =0; /有险情时亮红灯RED_2 =0;/点亮红灯YELLOW_1=1;/关掉黄灯YELLOW_2=1;/关掉黄灯GREEN_1 =1;/关掉绿灯GREEN_2 =1;/关掉绿灯ALARM =0;/报警指示灯点亮TRA_ALARM_FLAG=1;/指示有报警情况/=读取当前的值=/hour=I2C_single_byte_read(0x64,0x02);hour=(hour&0x3F)4)*10+(hour&0x0F); /读取小时minute=I2C_single_byte_read(0x64,0x01);minute=(minute&0x7F)4)*10+(minute&0x0F); /读取分钟second=I2C_single_byte_read(0x64,0x00);second=(second&0x7F)4)*10+(second&0x0f); /读取秒钟else if(K3=0&K4=0)TRA_ALARM_FLAG=0; /报警信息已经取消了else/=数码管显示当前的时间=/void display(void)unsigned char m,n,j,k;m=hour/10;n=hour%10;P1=tablem;POSITION1=1; /选通第一个数码管的第一个位置POSITION2=0;delay(4);P1=tablen;POSITION1=0;POSITION2=1; /选通第一个数码管的第二个位置j=minute/10;k=minute%10;P1=tablej;HPOSITION1=1; /选通第二个数码管的第一个位置HPOSITION2=0;delay(4);P1=tablek;HPOSITION1=0;HPOSITION2=1; /选通第二个数码管的第二个位置/=串口命令=/void process_0A()switch(uart1_cuffer13)case 0x00:process_0A_00(); /时间设定与查询break;default:break;/=设置和查询时间=/void process_0A_00()unsigned char hour;unsigned char minute;unsigned char week;unsigned char day;unsigned char month;unsigned char year;unsigned char t_buffer4;switch(uart1_cuffer14)case 0x81:t_buffer0=uart1_cuffer15;t_buffer1=uart1_cuffer16;t_buffer2=uart1_cuffer17;t_buffer3=uart1_cuffer18;uart1_cuffer15=(uart1_cuffer15/10)4|(uart1_cuffer15%10);/这几句是将16进制数转化为BCD码的格式uart1_cuffer16=(uart1_cuffer16/10)4|(uart1_cuffer16%10);uart1_cuffer17=(uart1_cuffer17/10)4|(uart1_cuffer17%10)|0x80;uart1_cuffer18=(uart1_cuffer18/10)4)*10+(hour&0x0F); /读取小时minute=I2C_single_byte_read(0x64,0x01);minute=(minute&0x7F)4)*10+(minute&0x0F);/读取分钟week=I2C_single_byte_read(0x64,0x03); /取得当前的星期week=week&0x07;back_command(); /返回命令break;case 0x82:t_buffer0=uart1_cuffer15;t_buffer1=uart1_cuffer16;t_buffer2=uart1_cuffer17;t_buffer3=uart1_cuffer18;uart1_cuffer15=(uart1_cuffer15/10)4|(uart1_cuffer15%10);/这几句是将16进制数转化为BCD码的格式uart1_cuffer16=(uart1_cuffer16/10)4|(uart1_cuffer16%10);uart1_cuffer17=(uart1_cuffer17/10)4)*10+(day&0x0f);month=I2C_single_byte_read(0x64,0x05);month=(month&0x1F)4)*10+(month&0x0F);year=I2C_single_byte_read(0x64,0x06);year=(year4)*10+(year&0x0f);back_command();/返回命令break;case 0x88:/返回秒、分、时、星期back_time(0);break;case 0x89:back_time(1);/返回日、月、年break;default:break;/*返回时间,参数num为0返回时、分、秒、星期,1返回年、月、日*/void back_time(unsigned num) /0返回时、分、秒、星期,1返回年、月、日unsigned char sum;unsigned char i;sum=0;back_buffer13=0x00;if(num)back_buffer14=0x89;back_buffer15=I2C_single_byte_read(0x64,0x04);/这几句话读取系统的日期、月份、年份back_buffer15=(back_buffer15&0x3F)4)*10+(back_buffer15&0x0F);back_buffer16=I2C_single_byte_read(0x64,0x05);back_buffer16=(back_buffer16&0x1F)4)*10+(back_buffer16&0x0F);back_buffer17=I2C_single_byte_read(0x64,0x06);back_buffer17=(back_buffer174)*10+(back_buffer17&0x0F);back_buffer18=0x00;elseback_buffer14=0x88;back_buffer15=I2C_single_byte_read(0x64,0x00);/这几句话读取系统的秒、分、时、星期back_buffer15=(back_buffer15&0x7F)4)*10+(back_buffer15&0x0F);back_buffer16=I2C_single_byte_read(0x64,0x01);back_buffer16=(back_buffer16&0x7F)4)*10+(back_buffer16&0x0F);back_buffer17=I2C_single_byte_read(0x64,0x02);back_buffer17=(back_buffer17&0x3F)4)*10+(back_buffer17&0x0F);back_buffer18=I2C_single_byte_read(0x64,0x03);back_buffer18=back_buffer18&0x07;for(i=3;i19;i+)sum=back_bufferi;back_buffer19=sum;uart1_send_string(back_buffer,21);/=统一返回命令=/void back_command(void)unsigned char i=0;unsigned char sum;uart1_cuffer1=0x2F;uart1_cuffer12=0x00;uart1_cuffer15=0x00;uart1_cuffer16=0x00;uart1_cuffer17=0x00;uart1_cuffer18=0x00;sum=0;for(i=3;i19;i+)sum=uart1_cufferi;uart1_cuffer19=sum;uart1_send_string(uart1_cuffer,21);串口命令相关子函数文件(uart.h):#include#include#include#include#include/*串口相关函数声明*/void uart1_init();void uart1_send(unsigned char send_data);void uart1_send_string(unsigned char*s,unsigned char length);void uart1_ISR(void);/*串口1初始化函数*/void uart1_init()TMOD|=0x20;/定时器1工作方式2TH1=0xfd;/相应波特率设初值计算方法。 初值X=(25611059200/(12*32*9600)TL1=0xfd;/9600为你要设置的波特率。11059200为晶振频率。X的值最后要换算成16进制PCON|= 0x00;/串口波特率加倍SCON|=0x50;/串口1工作在工作方式1,允许接收;/PS=1;/串口1中断优先级为1;ES=1;/允许串行中断;uart1_count=0;/*串口1,单字节发送函数,参数send_data为待发送的字节*/void uart1_send(unsigned char send_data)ES=0;TI=0;SBUF=send_data;while(TI=0);TI=0;ES=1;/*串口1,字符串发送函数,参数*s为待发送字符串的首地址,参数length为待发送字符串的长度,注意字符串的长度不能超过待发送的字符长度*/void uart1_send_string(unsigned char *s,unsigned char length)unsigned char i=0;for(i=0;ilength;i+)uart1_send(*s+);/*串口1中断处理函数*/void uart1_ISR(void) interrupt 4unsigned char i=0;if(RI)RI=0;uart1_bufferuart1_count=SBUF;/取串口1接收寄存器的值到串口1接收数据区switch(uart1_count)case 0:if(uart1_bufferuart1_count!=0x2F)uart1_count=-1;/如果接收到的第一个字节不是0x2F,则串口1指针回到-1的位置,elseuart1_time_flag=1;/如果接收到的第一个字节为0x2F,则开启串口1超时计数,break;case 1:if(uart1_bufferuart1_count!=0x43)uart1_count=-1;break;case 2:if(uart1_bufferuart1_count!=0x2F)uart1_count=-1;break;case 20:if(uart1_bufferuart1_count!=0xCC)uart1_count=-1;elseif(!uart1_flag_lock)/uart1_flag_lock作用是锁住变量uart1_flag和数组uart1_cuffer,防止一条命令还没执行完,这些量被改变for(i=0;i21;i+)uart1_cufferi=uart1_bufferi;uart1_flag=1;uart1_count=-1;uart1_time_flag=0;/如果串口1接收数据没有超时,则禁止串口1超时计数uart1_timeout_count=0;/清串口1超时计数break;default:break;uart1_count+; /串口1指针加1/*串口1命令处理函数*/void uart1_command_process(void)unsigned char sum;unsigned char i=0;if(uart1_cuffer3=0x06)sum=0; /初始化sum为0,计算校验和时用for(i=3;i19;i+) /计算校验和sum=uart1_cufferi;if(sum=uart1_cuffer19)/如果校验和正确,则执行if里面的语句switch(uart1_cuffer12)case 0x0A:process_0A();/六路灯全开、全关、单独开、单独关相关命令、时间设置和查询break;default:unknow_command(); /错误命令返回break; /if(sum=uart1_cuffer19)else/校验和错误对高精度时钟芯片SD2403API部时钟进行设置和读取相关函数(SD2403API.C):#include#include#include#includesbit SCL=P16;sbit SDA=P17;/*local function*
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!