2023年单片机实验报告2.pdf
单 片 机 应 用 系 统 设 计 报 告题 目 单片机应用系统设计_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _学 院 信息学院_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _专 业 电气工程及自动化_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _班 级 1 2电气升本_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _学 生 姓 名 _ _ _ _ _ _ _ _ _ _ _ 朱婉婉_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _学 号 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _7月 16 日至 J 月 28日共 Q 天1 3年 7月 18 日时 钟2023 06 月 24 日22时 33分 24秒一、设计内容及规定必做实验内容:1.使用中文液晶128x6 4 点阵L C D,采用1 6 点阵字库显示当前时间“时时:分分:秒秒”2.用4 个按键设立现在时间:K1进入设立现在时间;K 2调整小时;K 3 调整分;K4设立完毕。3 .增长闹铃功能,时间到了使用音乐声可选实验内容:4.增长闹铃功能,时间到发出声响并启动继电器5.增长秒表计数功能,精度为0.0 1秒6.增长万年历显示“年月日”课程设计规定方案设计前规定完毕设计报告,每个组一份;方案实行过程中完善设计报告,每个成员独立进行;方案实行结束,通过指导老师验收后完毕设计报告,每个成员独立完毕,其中设计图纸每个组只需要1份。二、设计原始资料单片机的C 语言应用程序设计(第四版)8051系列单片机C 程序设计完全手册三、重要参考资料THGQC-1实验指导书C8 0 51F串行实时时钟芯片S3530A及其在51单片机系统中的应用时钟芯片S-35 3 0A与C80 5 1 F0 4 0 单片机的通讯接口设计四、进程安排教学内容 学时地点资料查阅与学习讨论 1 天2-2 1 6 单片机实验室分散设计 5 天2-2 16 单片机实验室编写报告 3 天2 216单片机实验室成果验收 1 天2-21 6 单片机实验室(单片机应用系统设计)设计任务书2 6日摘要学 院:信息学院_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _班 级:12电气升本_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _学生姓名:朱婉婉 学号指导教师:_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _时间:2023年 7月 16 日 到 202 3 年 7 月数字钟己成为人们平常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场合,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使 数 字 钟 具 有 走 时 准 确、性能稳定、携带方便等优点,它还用于H时、自 瑚 附及自谢辨懈各个领域。尽管目前市场上已有现成的数字钟集成电路芯片出售,价 格 便 宜、使用也 方 便,但 鉴 于 单 片 机 的 定 期 器 功 能 也 可 以 完 毕 数 字 钟 电 路 的 设 计,因此进行数字钟的设计 是 必 要 的。在 这 里 我 们 将 已 学 过 的 比 较 零 散 的 数 字 电 路 的 知 识 有 机 的、系统的联系起来用 于 实 际,来 培 养 我 们 的 综 合 分 析 和 设 计 电 路,写 程 序、调 试 电 路 的 能 力。单 片机具有体积 小、功 能 强 可 靠 性 高、价 格 低 廉 等 一 系 列 优 点,不 仅 已 成 为 工 业 测 控 领 域 普 遍 采 用的 智能 化 控 制 工 具,并 且 已 渗 入 到 人 们 工 作 和 和 生 活 的 各 个 角 落,有 力 地 推 动 了 各 行 业 的 技 术改 造 和 产 品 的 更 新 换 代,应 用 前 景 广 阔。基 于 这 种 情 况,我们课程设计小组两人多方查阅资料,反复论证设计出了这款既简朴实用,又价格便宜的一 一 单 片 机 电 子 时 钟。关键词:单 片 机 时 钟 计 时目录一、概述嘴误!未定义书签。1、总 体 功 能.错误!未定义书签。2、实验规定用昔误!未定义书签。二、硬件电路图及说明嘴误!未定义书签。1、硬件电路图.错误!未定义书签。2、1 2 8 6 4 L C D液晶显示屏.错误!未定义书签。3、按键功能阵昔误!未定义书签。4、实时时钟芯片S-3 5 3 0 A嘴误!未定义书签。三、电路及程序设计7。四、设计特点.错误!未定义书签。五、调试.错误!未定义书签。1、主循环程序流程.错误!未定义书签。2、关 于3 5 3 0读出数据的更改4昔误!未定义书签。3、关于秒表的设立,错误!未定义书签。4、关于时间的设立.错误!未定义书签。5、碰到的具体问题.错误!未定义书签。6、注 意 事 项.错误!未定义书签。六、总结及体会.1 9七、使用说明书.错误!未定义书签。八、程序及简朴注解昨昔误!未定义书签。1 m a in.c.错误!未定义书签。2、1 2 c.e嘴误!未定义书签。3、LCD.c嘴误!未定义书签。一、概述1、总体功能本次设计时钟电路,使用了 STC89C5 1单片机芯片控制电路,单片机控制电路简朴且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一扬声器来进行定期提醒,同 时 使 用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、扬声器、显示屏即可满足设计规定。2、实验规定必做实验内容:1.使用中文液晶128x64点阵LCD2.用 4 个按键设立现在时间:K 1 进入设立日期;(K l=l)K 2调整 年;K 3 调 整 月;K 4 调整 日。K1进入设立现在时间;(K l=2)K2调 整 小 时;K 3 调 整 分;K 4 调 整 秒。K 1设立完毕(Kl=3)增长闹铃功能,时间到了使用音乐声(指示灯闪动1 0 秒)可选实验内容增长闹铃功能,三次闹铃增长秒表计数功能,精度为0.01秒 0.00-20 0.00增长万年历显示 年月日 二 月 28天、29天增长星期显示增长整点闹铃 指示灯闪动5 次增长整点闹铃开关采 用 1 6 点阵字库显示当前时间“时时:分分:秒秒”时 钟2023 06 月 24 日22时33分 24秒反字秒 表o 09小图形被设立的数字闪动,其他自己认为可添加的内容课程设计规定方案设计前规定完毕设计报告,每个组一份;方案实行过程中完善设计报告,每个成员独立进行;方案实行结束,通过指导老师验收后完毕设计报告,每个成员独立完毕,其中设计图纸每个组只需要1份二、硬件电路图及说明1、硬件电路图LC D时钟控制系统运用C805 1 F020芯片作为控制中心,配合液晶显示128*6 4 液晶显示模块、独立式键盘模块、实时时钟/日历芯片模块等电路,实现日历时钟实现显示年月日时分秒。总体设计方框图如图1所示:图12、12 8 6 4 L C D 液晶显示屏带中文字库的12 8 X 6 4是一种具有4位/8位并行、2线或3线串行多种接口方式,内部具有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为1 28X 64,内置8 192个1 6*1 6点汉字,和12 8个16*8点ASCII字符集运用该模块灵活的接口方式和简朴、方便的操作指令,可构成全中文人机交互图形界面。可以显示8义4行16X 16点阵的汉字也可完毕图形显示低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不管硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。12864接口定义及其与C80 5 1F020的接口:4567891 0111 21 3111 51 61 7D/I R/ED OD ID 2D 3D 4D 5D 6D 7C S 1 C S 2 R E TP 1 0 P 1 1 P 1 2 P 2 0 P 2 1 P 2 2 P 2 3 P 2 4 P 2 5 P 2 6 P 2 7 P 1 3 P 1 4 P 1 5引脚及内部结构如图2所示:VCC JT41VCC6。12151S21242581lHl72023J40LCD VCCLCD ELCD IHLC DLCD D2LCD D3LCD D4JLCD D6LCD RSTLCD VEELCD VCC1 23 45 6LCD VEELCD112S(M图 2 液晶显示电路LCD CS23、按键电路K1 连接 P3.0 口,K2 连接 P3.1 口,K3;连接 P3.2 口,K4 连接 P3.3 口键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来辨认键盘上的闭合键,它具有结构简朴,使用灵活等特点,因此被广泛应用于单片机系统。按键开关的抖动问题,键盘与单片机的连接组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。当开关S未被按下时,P3.0输入为高电平,S闭合后,P 3.0输入为低电平。而按键会有抖动现象,因此必须考虑如何去除抖动,常用的去抖动的方法有两种:硬件方法和软件方法。单片机中常用软件法。软件法其实很简朴,就是在单片机获得P3.0 口为低的信息后,不是立即认定S 1已被按下,而是延时1 0毫秒或更长一些时间后再次检测P 3.0 口,假如仍为低,说明S 1的确按下了,这事实上是避开了按键按下时的抖动时间。而在检测到按键释放后(P3.0为高)再延时5 1 0个毫秒,消除后沿的抖动,然后再对键值解决。本次实验去抖动采用软件方式。四个按键分别接到P 3.1、P3.2、P3.3和P3.4。对于这种键各程序可以采用不断查询的方法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的键解决。4、实 时 时 钟 芯 片S-353 0 AS 3530是一款低功耗的CMOS实时时钟/日历芯片,它提供二个中断输出和掉电检测器,所有的地址和数据通过12c总线接口串行传递。最大总线速度为4 00Kbi ts/s,每次读写数据后,内嵌的字地址寄存器会自动增长。(1)器件特性:低工作电流:典型值为0.7 口 A(VDD=3.0V);世纪标志;大 工作电压范围:1.0-5.5V;BCD码设立时间参数 低休眠电流;典型值为0.25uA(VDD=1.85.5V时);稳压电路 报警和定期器;掉电检测器;内部集成的振荡器电容;12c总线从地址:读:0A 3H;写:0A2H;三、电路与程序设计1、程序流程图主程序:开始结束子程序 Tes t I2C():开始读取3 530数据时间赋初值将 初 值 读 入 3 53 0清屏在 16,0处显示2 0 2 3 0 1 月 01日,在 16,2 处显示00时 00分00秒读 取 3 5 3 0 数据调用函数s et value()分为。且秒小于11I Y整点报时LED灯闪烁调用函数a 1 arm_c h e ck 0刷新显示时分秒,刷新显示年月日N设立fla g l标志位为1按键判断程序set_ val u e():根据设计原则,判断按键并作出相应反映.开始读取按键值有键按下且f lagl=l按下的键为KIf l a g=l;k e y 2=1 ;f l a g1 =0;在(1 1 2,0 )显 示“年”按下的键为K 2f l a g =3;f l a g l=0 ;在(1 1 2,0)显示“闹”按下的键为K 3f 1 a g=7 :m i a o b i a o _ o n=l;f l a g l=0;在(1 6,4)显 示“秒表:X X X:X Xw按下的键为K If 1 a g=2;k e y 2 =l;f 1a g l=0;在(1 1 2,0 )显 示“时”按下的键为K 2k e y 2+;f l a g l =0 ;k e y 2=2在(1 1 2,0)显示“月”k e y 2 3在(1 1 2,0)显 示“日”按下的键为K 3k e y 2=l年 加1,星期根据平年闰年加1或2将数据读入3 5 30更新星期和年的显示f l a g l=0;k e y 2=2月 加1,星期根据月的日期增长将数据读入3 5 3 0更 新 星 期 和 月 的 显 示f l a g 10 ;k e y 2 =3月加1,星期根据月的日期增长将数据读入3 5 3 0更 新 星 期 和 月 的 显 示fl a g1=0;按下的键为K 4退出时钟设立f 1 a g=0;f l a g 1=0 ;k e y2=0;清除提醒字符f l a g=2按下的键为K Ik e y 2 =2在(1 1 2,0)显示分k e y 2=3在(1 1 2,0)显示秒按下的键为K 3将更改的数据读入3 5 3 0刷新显示时,f l a g l=0;将更改的数据读入3 5 3 0刷新显示分,f l a g l=0 ;将更改的数据读入3 5 3 0刷 新 显 示 秒,f 1 a g l=退出时钟设立f l a g=O;f 1 a g l=O;k e y 2=0;清楚提醒字符a l a r m n u m 不等于 0f l a g=4;f 1 a g 1 =0 ;在(0 0 ,6)显 示“1”在(6 4,6)显示第一个闹钟设立时间f 1 a g=0 ;f l a g l=0;退出闹钟功能,清除提醒字符f 1 a g=4f 1 a g=5 ;在(0 0,6)显示 2在(6 4,6)显示第二个闹钟设立时间f 1 a g 1 =0 ;开闹钟在(1 1 2 ,6)显 示“开”f l a g=0;f l a g 1 =0;退出闹钟设立,清楚提醒字符按下的键为K 3闹钟1 的时加1,刷新显示闹钟时间,f 1 a g l=0;按下的键为K4闹钟1 的秒加1,刷新显示闹钟时间,f 1 a g l=0;f l a g=6;在(0 0,6)显示 3在(6 4,6)显示第二个闹钟设立时间f 1 a g l=0 ;开闹钟在(1 1 2,6)显 示“开”f l a g=0;f l a g l =0;退出闹钟设立,清楚提醒字符按下的键为K 3闹钟1 的时加1,刷新显示闹钟时间,f l a g l=O;按下的键为K 4闹钟1 的秒加1,刷新显示闹钟时间,f l a g 1 -0;按下的键为K 1按下的键为K 2按下的键为K 3按下的键为K 4f 1 a g=7按下的键为KI按下的键为K 2按下的键为K 3按下的键为K 4闹钟判断程序alarm_ c he c k():判断闹钟是否开,根据闹钟启动数量判断是否到设定期间,若到,则启动LED灯闪四.设计特点:1.该时钟由四个按键控制,按键功能分明:K 1进入设立日期;(K l=l)K 2调 整 年;K3调 整 月;K4调 整 日。K1进入设立现在时间;(K l=2)K 2调 整 小 时;K3调整 分;K 4调 整 秒。K 1设立完毕(K l=3)进入闹铃设立。2.秒表采用定期器中断控制,计时精确。K 3一次进入秒表。K3两次开始计时。K3三次计时停止。K4退出秒表。3.显示页面结构清楚,功能明确。平时若无设立,则只显示年月日,时分秒以及星期4.进入设立后会出现一些提醒字符,表述明了。五.调试:1.主循环程序流程实验初期,本来的流程是测试按键,完毕所有操作后再刷新显示,进入主循环,但是,这样在测试按键,等待操作时会导致较大的延时。因此该方案未录取。最后采用的方案是:检测到一次按键,就更改fla g 和 fl a g l 标志位,记录按键顺序后就进入主循环,然后继续检测有无按键操作,这样对于程序就基本不会导致延时,并且程序的流程也更清楚。关于标志位:fl a g 用来记录之前按键次数和顺序fl a g=0 表达之前无按键操作fl a g=l表达K1按一下f lag=2表达K1按两下fl a g=3表达K 2 按一下fl a g=4表达K 2按两下flag=5表达K 2按三下f la g=6 表达K2按四下f 1 ag=7表达K3按一下f la g l表达之前有无按键按下f la g 1=1,表达无按键,f 1 a g 1=0,表达已有按键按下过。2.关于3530读出数据的更改碰到的具体问题:时间设立时,10以下的都能对的显示,两位数的就不会对的显示。在设立“时”时,只能加到1 2,而程序中的时钟为2 4 小时制,所以不对的。因素:3530 中读出的数据格式为B CD码,而程序中修改则按照16进制进行。所以会有数据错误。解决方法:在设立时钟时间时,要先读出3 5 3 0 数据,更改后再读入35 3 0 中,而 3530中的数据存放为BCD码,读出后并不表达时间的真实数据,因此,我编写了两个转化函数:c h a n g e ()将1 6进制转化为B C D码f c h a n g e ()将B C D码转化为1 6进制读出数据后先将其转化为1 6进制,进行操作后再转化为B C D码,读 入3 5 3 0数据更改中,由于“时”的数据表达只需低4位和高4位中的低两位,所以最高2位中会有一些脏数据,在读出后应先与上O x 3 f再进行转化操作。3 .关子秒表设立秒表采用定期器1,初值为(6 5 5 3 6 T 8 4 3 2),并运用一个计数变量m i a。b i a o,初值 为1 0,中断中重新赋初值,每次中断m i a o b i a o减1,减 至0时,秒表计数变量加1,m i a ob i a o重新赋值为1 0!4 .关于时间的设立在时间设立时碰到的问题基本上是由于考虑的不够周全,刚开始时,没考虑到闰年,大小月等情况,因此,闰年的二月不能调出2 9号,大小月也不能区别,碰到这个问题后就开始更改程序的细节问题,使得设立时间时所有的日子都能设立出。要考虑的设立:年有闰年,平年,月有大小月,星期要随着年,月,日的更改而更改。5 .碰到的具体问题在运营时,显示屏幕卡屏。只要一运营秒表程序,不久就会使程序卡在某一点。因素:在本来的中断程序中尚有加入显示代码,导致在运营时,显示屏幕卡屏。由于屏幕中显示的时间和秒表分别由两个计数器控制,在刷新时由于计数器冲突而导致了卡屏的现象。那是由于屏幕中显示的时间和秒表分别由两个计数器控制,在刷新时由于计数器冲突而导致了卡屏的现象。更改方法:将中断程序中的显示代码取出,直接放在主循环程序中,这样就能顺利运营了。6 .注意事项在设计秒表时,定 期 器 1 的重要程序放在m ain.c 文献中,而一些显示程序则在I2C.c 文献中,因此,在调用这些变量时就会出现编译错误。为解决该现象,我在m a in,c 文献中先编写了一个小的调用显示程序,在需要显示时再调用该程序,就解决了变量调用问题。六.总结及体会:本次课程设计是用AT89s51单片机CPU及 LCM1602设计一个数字时钟,通过一个星期的调试结果满足设计规定,验说G误。通过单片机硬件电路的调试 剃了预先设定的功能,设计重要用到的元件不多,最重要的是程序也比较长比较麻烦,同时也碰到了少量困难,特别是关于校时模块的设计实现。关于显示模块,在以前的实验中做过,所以问题很容易解决。学以致用,将从书本上学到的知识应用于实践,学会了初步的电子电路仿真设计虽然过程中碰到了一些困难,但是在解决这些问题的过程无疑也是对自己自身专业素质的一种提高。当最终调试成功的时候也是对自己的一种肯定。本次的设计作业不仅增强了自己在专业设计方面的信心,鼓舞了自己,更是一次爱好的培养,为自己以后的学习方向的明确了重点。此外在这次实验中我们碰到了不少的问题针对不同的问题我们采用不同的解决方法,最终一一解决设计中碰到的问题。在我们曾经碰到不懂的问题时,运用网上的资源,搜索查找得到需要的信息七.使用说明书:该产品为电子时钟,能显示年月日,时分秒及星期,有秒表功能,闹钟功能(注 1),会进行整点报时,有四个按键控制功能的选择使用,下文中分别称为K1,K2,K3,K4XX年 XX月X X 日 XXX X 时 XX分 X X 秒星期X按键说明:K 1:进入时间设立K 1按 一 次,设立年月日K 1按 两 次,设立时分秒K 2移位,K 3加I 1,K 4退出K 1按 三 次,退出设立如 右 图,在 时 间 设 立 时,屏 幕 右 上 角 会 根 据 按 键 操 作 而 出 现“时”“分”“秒”“年”“月”“日”提 醒 当 前 操 作 的 作 用 对 象。K 2:进入闹钟设立K 3选 择 开 闹 钟 的 次 数(0 3),若开的闹钟个数为零则表达闹钟关闭K 2 进 入 闹 钟 时 间 设 立,K3时加,K 4分加再 按K 2退出XX年XX月XX日X XX X时X X分X X秒星 期X闹 钟 操 作 界 面 如 右 图:右 上 角 会 出 现“闹”提 醒 字。最 下 一 行 显 示 当 前 设 立 闹 钟 时 间,闹钟次数,及 闹 钟 开 关 状 况。K 3:启动秒表K 3开始/停止计时K 4退出秒表.秒 表 界 面:XX年 XX月 X X 日XX时X X 分 XX秒秒表:X X X:XX注1:闹钟功能,本 产 品 闹 钟 最 多 能 设 立3个 不 同 时 间,可 选 择 开 闹 钟 的 次 数,例 如,若选择 次 数 为1时,则 只 会 对 闹 钟 一 设 立 的 时 间 作 出 反 映(L ED灯 闪),次 数 为2时,则对前两个闹钟设定期间作出反映,因此,建议将常用的闹钟时间设在前面.八.程序及简朴注释:1 m a in.c#include c8 051 fO2O.h#in c lud e void Delay1us(unsigned c h a r u s)*w hi Ie(u s)_ n o p _ ();_ n o p _();_no p _();_nop_();_nop_()us;)v o i d SYSCLK_ I n it(v o id)int i;/delay co u n t e rOSCXCN=0 x65;/s ta r t ext erna I o s c i I latorithfor(i=0;i 8;oTLO=-SYSCL K/1 000;i f(Countlms)Cou n t1 ms;)vo i d D e I ay 1 ms(u nsigned cha r T)(Count 1ms=T;whi I e(Co unt 1 ms);)voi d Delay 1s(uns i gned c har T)*whi I e(T)(D e I a y 1ms(200);。De I ay1ms(2 00);Delaylms(200);Del ay1ms(2 0 0);。Delaylms(200);4 T-;*)v o id Tes t LCD(v o id);vo i d Tes t I 2 C(v o id);vo i d main(void)W D TC N =Oxde;WDTCN=Oxad;/关看门狗SYSCLK.Ini t();初始化时钟oTime r0_ I/初始化定期器Timer1_lnit();。初始化定期器oPORT_ I n i t();初始化 I0 口/ASPI0_ I n i t();/初始化SP I0/C PT1CN|=0 x80;/使能比较器 1/AREFO CN=0 x03;/使能片内参考电压/DACOCN|=0 x80;/使能 DAC0/DACOH=O;DACOL=0;EA=1;。开中断/T e s tLCD();/M e s t 727 9(0);T e s tl2 C();)2、I2c.c#inc I ude c8 051 f0 2 0.h。SFR dec I ara t i ons/G lo b a l CONSTANTSs b i tK1=P3A0;sb it K2=P3 1 ;sbit K3=P3/X2;s b it。K4=P3 人 3;sb it。K5=P3人 4;sb it。P 1 _ 6=P r6;s b i t P 1 _ 7;Pi7;#def i ne WRITEo 0 x 0 0。/SMBus WRITE command#de fine。READ 0ox01。SMBus READ co mmand/De v ice addresse s(7 b its,I sb is a don t c a r e)#d e fin e 。CLOCK3530.ADDRESS_RE SET。0 x60。/1 ack#de f ine CLOCK3530_ADDRESS_STATU S 0 x62。/2 ack#d e fin e CL0CK3 5 30_ ADDRESS_D ATEH0UR0 x64。/8 ack year month da y week hour minut e second#de f ineCL0CK3530_ADDRESS_HOUR0 x 6 64/o ac k hour m i n u t e second#def i neCLOCK 35 30_ADDRESS_INT1 0 x68。/3 ack#de f ineo CLOC K 3 5 30_ADDRESS INT2 Ox 6A,/3 a ckunion(u nsi gned c h a r ClockStr i n g 7;s t ruct Rea ICIoc k。”un s ig ned cha r Yea r,Mo n t h,Day,Week,Hour,M in u te,S e cond;RT;Rea I T ime;/SMB u s s t at e s:MT=Master Tr ansm i tt e r/MR=Mas ter Receiver#de f i ne SMB_BUS_ERRO RCbxOO。/(a I I modes)BUS ERROR#def ine。SMB_START。0 x08/(MT&MR)START t r ansmi t t ed#d ef i ned SMB_RP_S T ARTo 0 x 1 0 。/(MT&MR)r e pea ted START#def i neSMB.MTADDACK Ox 1 8。/(MT)S I ave add r e s s+W tr a nsmi t ted;#d e f in eSMB_MTADDNACK 0 x 2 0。/(M T)Slave a ddress+W t r ansm i t t ed;。/NACK r e c e i ved#d ef i n e SM B_ MTDBACKO?。x 2 8。/(MT)da t a b y te t ran s mi tte d;ACK rec1 vd#de f ineSMB_MTDBNACK0 x 3 0 /(MT)data by t e transm itt e d;NACK r ecvd#d e f ine SMB_MTARBLOST 0 x 3 8。/(MT)arb i tra t ion lost#d ef ine SMB_M R ADD A CKO x40。/(MR)S I a ve addr e ss+R tran s mi tted;o 。/ACK recei v ed#def i neSMB_MRADDNACK 0 x 4 8。(MR)S lave a d d r e ss+R tran s m i tte d;。o /NACK recei ve d#d e f i n e SMB_M R DBACK 0 x50。/(MR)dat a b y te re c 1 v d;ACK transmitted#d e f i neSMB_ MRDBNACKO。x 5 8(MR)data b y t e r ecvd;NACK t r ansmi t t ed/-/Global VARIABLESc h a r CO M M A N D ;“/H olds t h e si a ve add r ess+R/W bi t f o r use i n t h e SM Bus I SR.un s ign e d char*l2CDataBu f f;。int n=0,i,f I ag=1 ,m=0,h,f,hm=0,s=0,b s=0,I=0,Q =0,q1=1,h 1,h 2,f 1 ,f 2;ch a r BY TE_ N UM B E R ;。/Used by I SR t o ch e c k what data has just b e e n。sen t-High add r ess byte,Low b y te,o r d a ta by t eunsigned char Hour,Minute,Yea r,Mon t h,Day,Week,Second;u n si gned char H I G H_ ADD,LOVLADD;。/Hi gh&Low b y te fo r E EPROM memo r y add r essbi t SM_ BUSY;。/T h is b it is set w hen a send o r rece i ve。is s t ar ted.11 i s cleared by t h e。/I SR when th e o pe r at io n i s f i n i shed./Function PROTOTYPESvoid SM B u s_ I S R(v o id);/MA IN Ro u tine/Main r out in e con f ig u r es the c r os s bar an d SMBus,and te s ts/the SMBus in ter face bet w ee nthe t hree EE P ROM sv o id Rese t RealClock(v o id),whi I e(SM_BUSY);/W a i t fo r SMBus to be f r ee.?SM_B USY=1 ;。/0 c cupySMBus(set t o b u s y)SM BO C N =0 x 4 4;O O 0 /SMB us e n a b le d,ACK on ac k n ow I e d ge cycle,BYTE_NUMBER=0;。o /2 addressbyt e s.C O M M A N D =(CLOCK3530_ADDRESS_RESET|READ);。/Chip se I ect+READoSTA=1 ;。/Sta r ttransferwhile(8M_B U S Y);/W a i t f o r tra n sf e r to f i n i sh)=写S 3530 A内部实时数据寄存器程序=功能:将设定年、月、日、星期、时、分、秒数据写入S-353 0A/入口:发送数据放在年、月、日、星期、时、分、秒各寄存器出口:NONEvoid Set Rea I C lo c k (v o id)whi I e(SM_BUS Y);。/Wai t for SM B us to be f ree.SM_BUSY=1 ;。/O c cupy SMBus(s e t to busy)SM BO C N =0 x 44;。/SMBus e nab I e d,ACK on acknowledge c y c l eBYTE_NUMBER=7;。/2 ad dre s s bytes.oC O M M AND=(CL0CK3530 _ADDRESS_DATEHOUR|WR I TE);。/Ch i p s e lect+WRITEI 2CD a t aB u ff=&Re a I T ime.ClockS t r ing 0。/D a ta t o be wr i tenSTA=1;/S tart t r an s f er)/=S-3 530A 实时数据寄存器子程序=功能:从S-35 3 0A读入当前时间数据 I 入 口:NONEI/出口:接受数据放在年、月、日、星期、时、分、秒各寄存器 I/1 =v o id G e t Real C I ock(v o id)while(SM_BUSY);。Wait for SMBus to be free.SM_B U SY=1;。*/Occupy SMBus(se t to busy)oSM BOCN=0 x 44;,。/SMBus enabled,ACK o n a cknow I e dge eye I eBYTE.NUMBER=7;。/2 add re s s b y t e s.0 coMMAND=(C L0CK35 3 O_AD DRE SS_D A TEHOUR I R E A D);。/Chip selec t+R EADl2CDataB u f f=&R e a IT i me.ClockStr ing 0;。/Da t a to be wr i t e nST A=1 。/S t a r t tr a nsferwhi I e(S M_BUSY);。/W a it fo r tr an s f er t o f i n i sh)/=写状态寄存器程序=/功 能:读/写S-3 5 30 A状态寄存器,对S-3 5 30A进行设立 I/入 口:N O N E 出 口:NON E|u nsigned ch a r GetR e a I C lock S tatus(v o id)(unsi gned char resul t;wh i Ie(SM_BUSY);。/Wai t for SMBus t o b e f r ee.SM_BUS Y=1 ;。/0 c c upy SMBus(se t to busy)SMB0 C N=0 x 4 4;SMBus enabled,ACK on acknow Iedge c yc I eBYTE_NUMBER=1;。C O M M A ND=(C L0CK3530_ADDRESS_STA TUS I READ)oI 2CDataB u f f=&r esul t;。STA=1 ;。o 。I I S ta r t trans f er while(SM_ B USY)/1 W ait for t r a n s f e r to fin is h。r e turn r e sul t;)v o id Se t Rea I C locks t atus(u nsigned c har st a t u s)。w h i I e(SM_BUSY);。W a i t f。r SMBu s to be f r ee.3 SM_BUSY=1;。Occ u py SMB u s(se t t o busy)SMBO CN=0 x44;。SMBus enab led,ACK on acknowledge cycle。BYTE_NUMBER=1;,。CO M M AND=(CL0CK3530_ADDRES S.S T A T U S I WRI T E);。*l2CDataBuf f=&s t atus;。ST A=1;。/S ta r t tr ans f er)#inc I ude INTR INS.H unsigne d char revolve(uns i gned cha r val)char i;u ns i g ned char val1=0;o fo r(i=0;i8;i+