资源描述
单片机应用系统设计报告题 目 单片机应用系统设计 学 院 信息学院 专 业 电气工程及自动化 班 级 12电气升本 学生姓名 朱婉婉 学 号 123040021 7 月 16 日至 7 月 28 日 共 11 天 13 年 7 月 18 日一、设计内容及要求必做实验内容: 时 钟 09年 06月24日 22时33分24秒 1.使用中文液晶128x64点阵LCD,采用16点阵字库显示当前时间“时时:分分:秒秒” 2.用4个按键设置现在时间: K1进入设置现在时间;K2调整小时;K3调整分;K4设置完成。3.增加闹铃功能,时间到了使用音乐声可选实验内容:4.增加闹铃功能, 时间到发出声响并启动继电器5.增加秒表计数功能,精度为0.01秒6.增加万年历显示“年月日”课程设计要求方案设计前要求完成设计报告,每个组一份;方案实施过程中完善设计报告,每个成员独立进行;方案实施结束,经过指导老师验收后完成设计报告,每个成员独立完成,其中设计图纸每个组只需要1份。二、设计原始资料单片机的C语言应用程序设计(第四版)8051系列单片机C程序设计完全手册三、主要参考资料THGQC-1实验指导书C8051F串行实时时钟芯片S3530A及其在51单片机系统中的应用时钟芯片S-3530A与C8051F040单片机的通讯接口设计四、进程安排教学内容 学时 地点资料查阅与学习讨论 1天 2-216单片机实验室分散设计 5天 2-216单片机实验室编写报告 3天 2-216单片机实验室成果验收 1天 2-216单片机实验室 (单片机应用系统设计 )设计任务书学 院: 信息学院 班 级: 12电气升本 学生姓名: 朱婉婉 学号 123040021 指导教师: 时间: 2013年 7 月 16 日 到 2013 年 7 月 26 日摘要 数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。基于这种情况,我们课程设计小组两人多方查阅资料,反复论证设计出了这款既简单实用,又价格便宜的单片机电子时钟。 关键词:单片机 时钟 计时目录一、概述11、总体功能12、实验要求1二、硬件电路图及说明31、硬件电路图32、12864LCD液晶显示屏33、按键功能34、实时时钟芯片S-3530A3三、电路及程序设计7四、设计特点16五、调试171、主循环程序流程32、关于3530读出数据的更改33、关于秒表的设置3 4、关于时间的设置35、遇到的具体问题36、 注意事项3六、总结及体会19七、使用说明书21八、程序及简单注解221、main.c32、I2C.c33、LCD.c3一、 概述1、总体功能本次设计时钟电路,使用了STC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、扬声器、显示屏即可满足设计要求。2、实验要求必做实验内容: 1.使用中文液晶128x64点阵LCD,采用16点阵字库显示当前时间“时时:分分:秒秒” 2.用4个按键设置现在时间:K1进入设置日期;(K11)时 钟 09年 06月24日 22时33分24秒 K2调整 年;K3调整 月;K4调整 日。K1进入设置现在时间;(K12)K2调整 小时 ;K3调整 分 ;K4调整 秒。K1设置完成(K13)增加闹铃功能,时间到了使用音乐声(指示灯闪动10秒)可选实验内容增加闹铃功能, 三次闹铃增加秒表计数功能,精度为0.01秒 0.00200.00 增加万年历显示“年月日” 二月 28天、29天增加星期显示增加整点闹铃 指示灯闪动5次增加整点闹铃开关9秒表反字 小图形 被设置的数字闪动,其他自己认为可添加的内容课程设计要求方案设计前要求完成设计报告,每个组一份;方案实施过程中完善设计报告,每个成员独立进行;方案实施结束,经过指导老师验收后完成设计报告,每个成员独立完成,其中设计图纸每个组只需要1份二、硬件电路图及说明1、硬件电路图 LCD时钟控制系统利用C8051F020芯片作为控制中心,配合液晶显示128*64液晶显示模块 、独立式键盘模块、实时时钟/日历芯片模块等电路,实现日历时钟实现显示年月日时分秒。总体设计方框图如图1所示: 图1 2、12864LCD液晶显示屏 带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为12864, 内置8192个16*16点汉字,和128个16*8点ASCII字符集利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示84行1616点阵的汉字也可完成图形显示低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 12864接口定义及其与C8051F020的接口:引脚及内部结构如图2所示: 图2 液晶显示电路 3、按键电路K1连接P3.0口,K2连接P3.1口, K3;连接P3.2口, K4连接P3.3口 键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。按键开关的抖动问题,键盘与单片机的连接组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。当开关S未被按下时,P3.0输入为高电平,S闭合后,P3.0输入为低电平。而按键会有抖动现象,因此必须考虑如何去除抖动,常用的去抖动的方法有两种:硬件方法和软件方法。单片机中常用软件法。软件法其实很简单,就是在单片机获得P3.0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P3.0口,如果仍为低,说明S1的确按下了,这实际上是避开了按键按下时的抖动时间。而在检测到按键释放后(P3.0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。本次实验去抖动采用软件方式。四个按键分别接到P3.1 、P3.2、P3.3和P3.4。对于这种键各程序可以采用不断查询的方法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的键处理。4、实时时钟芯片 S-3530AS-3530是一款低功耗的CMOS实时时钟/日历芯片,它提供二个中断输出和掉电检测器,所有的地址和数据通过I2C总线接口串行传递。最大总线速度为400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动增加。(1)器件特性:l 低工作电流:典型值为0.7A(VDD=3.0V);l 世纪标志;l 大工作电压范围:1.05.5V;l BCD码设置时间参数l 低休眠电流;典型值为0.25A(VDD=1.85.5V时);l 稳压电路l 报警和定时器;l 掉电检测器;l 内部集成的振荡器电容;l I2C总线从地址:读:0A3H;写:0A2H;三、电路与程序设计1、程序流程图主程序:开始 关看门狗程序初始化系统时钟初始化定时器1开中断调用函数TestI2C()结束子程序TestI2C():开始读取3530数据时间赋初值将初值读入3530清屏在16,0处显示05年01月01日, 在16,2处显示00时00分00秒读取3530数据调用函数set_value()分为0且秒小于11Y整点报时LED灯闪烁调用函数alarm_check()刷新显示时分秒,刷新显示年月日Nmiaobiao_on为偶且不为0Y显示秒表miaobiao_on为0Y显示星期延时100ms设置flag1标志位为1按键判断程序set_value():根据设计原则,判断按键并作出相应反应. 开始 读取按键值有键按下且flag1=1flag=0 按下的键为K1 flag=1; key2=1; flag1=0;在(112,0)显示“年”按下的键为K2flag=3; flag1=0;在(112,0)显示“闹”按下的键为K3 flag=7; miaobiao_on=1; flag1=0; 在(16,4)显示“秒表: XXX:XX”flag=1按下的键为K1flag=2; key2=1; flag1=0;在(112,0)显示“时” 按下的键为K2 key2+;flag1=0; key2=2 在(112,0)显示“月” key2=3 在(112,0)显示“日”按下的键为K3 key2=1 年加1,星期根据平年闰年加1或2将数据读入3530 更新星期和年的显示 flag1=0; key2=2月加1,星期根据月的日期增加将数据读入3530更新星期和月的显示 flag1=0; key2=3 月加1,星期根据月的日期增加 将数据读入3530 更新星期和月的显示 flag1=0; 按下的键为K4 退出时钟设置 flag=0; flag1=0; key2=0; 清除提示字符 flag=2 按下的键为K1 退出时钟设置 flag=0;flag1=0;key2=0; 清除提示字符 按下的键为K2 key2+;flag1=0; key2=2 在(112,0)显示分 key2=3 在(112,0)显示秒 按下的键为K3 key2=1 时加1 将更改的数据读入3530 刷新显示时,flag1=0; key2=2 分加1 将更改的数据读入3530 刷新显示分,flag1=0; key2=3 秒加1将更改的数据读入3530 刷新显示秒,flag1=0; 按下的键为K4退出时钟设置flag=0; flag1=0; key2=0;清楚提示字符flag=3按下的键为K2alarm_num不等于0flag=4; flag1=0;在(00,6)显示“1”在(64,6) 显示第一个闹钟设置时间flag=0;flag1=0;退出闹钟功能,清除提示字符按下的键为K3alarm_num1flag=5; 在(00,6)显示2在(64,6) 显示第二个闹钟设置时间flag1=0;开闹钟在(112,6)显示“开”flag=0; flag1=0;退出闹钟设置,清楚提示字符按下的键为K3闹钟1的时加1,刷新显示闹钟时间,flag1=0;按下的键为K4闹钟1的秒加1,刷新显示闹钟时间,flag1=0;flag=5按下的键为K2alarm_num2flag=6; 在(00,6)显示3在(64,6) 显示第二个闹钟设置时间flag1=0;开闹钟在(112,6)显示“开”flag=0; flag1=0;退出闹钟设置,清楚提示字符按下的键为K3闹钟1的时加1,刷新显示闹钟时间,flag1=0;按下的键为K4闹钟1的秒加1,刷新显示闹钟时间,flag1=0;flag=6按下的键为K1按下的键为K2按下的键为K3按下的键为K4flag=7按下的键为K1按下的键为K2按下的键为K3按下的键为K4闹钟判断程序alarm_check():判断闹钟是否开,根据闹钟开启数量判断是否到设定时间,若到,则启动LED灯闪四.设计特点:1.该时钟由四个按键控制,按键功能分明:K1进入设置日期;(K11)K2调整 年;K3调整 月;K4调整 日。K1进入设置现在时间;(K12)K2调整 小时 ;K3调整 分 ;K4调整 秒。K1设置完成(K13)进入闹铃设置。2.秒表采用定时器中断控制,计时精确。K3一次进入秒表。K3两次开始计时。K3三次计时停止。K4退出秒表。3.显示页面结构清晰,功能明确。平时若无设置,则只显示年月日,时分秒以及星期4.进入设置后会出现一些提示字符,表述明了。五.调试:1.主循环程序流程实验初期,原来的流程是测试按键,完成所有操作后再刷新显示,进入主循环,但是,这样在测试按键,等待操作时会造成较大的延时。因此该方案未录取。最后采用的方案是:检测到一次按键,就更改flag和flag1标志位,记录按键次序后就进入主循环,然后继续检测有无按键操作,这样对于程序就基本不会造成延时,而且程序的流程也更清晰。关于标志位:flag用来记录之前按键次数和次序flag=0表示之前无按键操作flag=1表示K1按一下flag=2表示K1按两下flag=3表示K2按一下flag=4表示K2按两下flag=5表示K2按三下flag=6表示K2按四下flag=7表示K3按一下flag1表示之前有无按键按下flag1=1,表示无按键,flag1=0,表示已有按键按下过。2.关于3530读出数据的更改遇到的具体问题:时间设置时,10以下的都能正确显示,两位数的就不会正确显示。在设置“时”时,只能加到12,而程序中的时钟为24小时制,所以不正确。原因:3530中读出的数据格式为BCD码,而程序中修改则按照16进制进行。所以会有数据错误。解决方法:在设置时钟时间时,要先读出3530数据,更改后再读入3530中,而3530中的数据存放为BCD码,读出后并不表示时间的真实数据,因此,我编写了两个转化函数:change()将16进制转化为BCD码fchange()将BCD码转化为16进制读出数据后先将其转化为16进制,进行操作后再转化为BCD码,读入3530数据更改中,因为“时”的数据表示只需低4位和高4位中的低两位,所以最高2位中会有一些脏数据,在读出后应先与上0x3f再进行转化操作。3.关于秒表设置秒表采用定时器1,初值为(65536-18432),并利用一个计数变量miaobiao,初值为10,中断中重新赋初值,每次中断miaobiao减1,减至0时,秒表计数变量加1,miaobiao重新赋值为10!4.关于时间的设置在时间设置时遇到的问题基本上是因为考虑的不够周全,刚开始时,没考虑到闰年,大小月等情况,因此,闰年的二月不能调出29号,大小月也不能区别,遇到这个问题后就开始更改程序的细节问题,使得设置时间时所有的日子都能设置出。要考虑的设置:年有闰年,平年,月有大小月,星期要随着年,月,日的更改而更改。5.遇到的具体问题在运行时,显示屏幕卡屏。只要一运行秒表程序,很快就会使程序卡在某一点。原因:在原来的中断程序中还有加入显示代码,造成在运行时,显示屏幕卡屏。因为屏幕中显示的时间和秒表分别由两个计数器控制,在刷新时因为计数器冲突而造成了卡屏的现象。那是因为屏幕中显示的时间和秒表分别由两个计数器控制,在刷新时因为计数器冲突而造成了卡屏的现象。更改方法:将中断程序中的显示代码取出,直接放在主循环程序中,这样就能顺利运行了。6.注意事项 在设计秒表时,定时器1的主要程序放在main.c文件中,而一些显示程序则在I2C.c文件中,因此,在调用这些变量时就会出现编译错误。为解决该现象,我在main.c文件中先编写了一个小的调用显示程序,在需要显示时再调用该程序,就解决了变量调用问题。六.总结及体会: 本次课程设计是用AT89S51单片机CPU及LCM1602设计一个数字时钟,经过一个星期的调试,结果满足设计要求,验证无误。通过单片机硬件电路的调试,实现了预先设定的功能,设计主要用到的元件不多,最主要的是程序也比较长比较麻烦,同时也遇到了少量困难,尤其是关于校时模块的设计实现。关于显示模块,在以前的实验中做过,所以问题很容易解决。学以致用,将从书本上学到的知识应用于实践,学会了初步的电子电路仿真设计虽然过程中遇到了一些困难,但是在解决这些问题的过程无疑也是对自己自身专业素质的一种提高。当最终调试成功的时候也是对自己的一种肯定。此次的设计作业不仅增强了自己在专业设计方面的信心,鼓舞了自己,更是一次兴趣的培养,为自己以后的学习方向的明确了重点。另外在这次实验中我们遇到了不少的问题针对不同的问题我们采取不同的解决方法,最终一一解决设计中遇到的问题。在我们曾经遇到不懂的问题时,利用网上的资源,搜索查找得到需要的信息七.使用说明书: 该产品为电子时钟,能显示年月日,时分秒及星期,有秒表功能,闹钟功能(注1),会进行整点报时,有四个按键控制功能的选择使用,下文中分别称为K1,K2,K3,K4XX年XX月XX日 XXXX时XX分XX秒 星期X按键说明:K1:进入时间设置 K1按一次,设置年月日 K1按两次,设置时分秒 K2移位,K3加1,K4退出 K1按三次,退出设置如右图,在时间设置时,屏幕右上角会根据按键操作而出现“时”“分”“秒”“年”“月”“日”提示当前操作的作用对象。K2:进入闹钟设置XX年XX月XX日 XXXX时XX分XX秒 星期XK3选择开闹钟的次数(0-3),若开的闹钟个数为零则表示闹钟关闭 K2 进入闹钟时间设置,K3时加,K4分加 再按K2退出闹钟操作界面如右图:右上角会出现“闹”提示字。最下一行显示 当前设置闹钟时间,闹钟次数,及闹钟开关状况。XX年XX月XX日 XX时XX分XX秒 秒表: XXX:XXK3:开启秒表 K3开始/停止计时 K4 退出秒表.秒表界面:注1:闹钟功能,本产品闹钟最多能设置3个不同时间,可选择开闹钟的次数,例如,若选择次数为1时,则只会对闹钟一设置的时间作出反应(LED灯闪),次数为2时,则对前两个闹钟设定时间作出反应,因此,建议将常用的闹钟时间设在前面.八.程序及简单注释:1、main.c#include c8051f020.h #include void Delay1us(unsigned char us)while (us) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); -us;void SYSCLK_Init (void) int i; / delay counter OSCXCN = 0x65; / start external oscillator with for (i=0; i 8; / set Timer0 to overflow in 1ms TL0 = -SYSCLK/1000; TR0 = 1; / START Timer0 IE|= 0x2; void Timer1_Init (void) CKCON|=0x8; TMOD|=0x10; /16Bit TR1 = 0; / STOP Timer0 TH1 =(65535-18432)/256; / set Timer0 to overflow in 1ms TL1 =(65535-18432)%256; ET1=1; void Timer0_ISR (void) interrupt 1 /1msTH0 = (-SYSCLK/1000) 8; TL0 = -SYSCLK/1000;if (Count1ms) Count1ms-;void Delay1ms(unsigned char T)Count1ms=T;while (Count1ms);void Delay1s(unsigned char T)while (T)Delay1ms(200);Delay1ms(200);Delay1ms(200);Delay1ms(200);Delay1ms(200);T-;void TestLCD(void);void TestI2C (void);void main (void) WDTCN = 0xde;WDTCN = 0xad; /关看门狗SYSCLK_Init (); /初始化时钟Timer0_Init();/初始化定时器 Timer1_Init();/初始化定时器PORT_Init (); /初始化IO口/SPI0_Init (); /初始化SPI0/CPT1CN|=0x80;/使能比较器1/REF0CN = 0x03; /使能片内参考电压/DAC0CN |= 0x80;/使能DAC0/DAC0H=0; DAC0L=0; EA=1;/开中断 /TestLCD(); /Test7279(0);TestI2C();2、I2c.c#include c8051f020.h/ SFR declarations/-/ Global CONSTANTS/-sbitK1=P30;sbitK2=P31;sbitK3=P32;sbitK4=P33;sbitK5=P34;sbitP1_6=P16;sbitP1_7=P17;#define WRITE0x00/ SMBus WRITE command#defineREAD 0x01/ SMBus READ command/ Device addresses (7 bits, lsb is a dont care)#defineCLOCK3530_ADDRESS_RESET0x60/1 ack#defineCLOCK3530_ADDRESS_STATUS0x62/2 ack#defineCLOCK3530_ADDRESS_DATEHOUR0x64/8 ack year month day week hour minute second#defineCLOCK3530_ADDRESS_HOUR0x66/4 ack hour minute second#defineCLOCK3530_ADDRESS_INT10x68/3 ack #defineCLOCK3530_ADDRESS_INT20x6A/3 ack union unsigned char ClockString7;struct RealClockunsigned char Year,Month,Day,Week,Hour,Minute,Second; RT; RealTime;/ SMBus states:/ MT = Master Transmitter/ MR = Master Receiver#defineSMB_BUS_ERROR0x00/ (all modes) BUS ERROR#defineSMB_START0x08/ (MT & MR) START transmitted#defineSMB_RP_START0x10/ (MT & MR) repeated START#defineSMB_MTADDACK0x18/ (MT) Slave address + W transmitted;#defineSMB_MTADDNACK0x20/ (MT) Slave address + W transmitted;/ NACK received#defineSMB_MTDBACK0x28/ (MT) data byte transmitted; ACK recvd#defineSMB_MTDBNACK0x30/ (MT) data byte transmitted; NACK recvd#defineSMB_MTARBLOST0x38/ (MT) arbitration lost#defineSMB_MRADDACK0x40/ (MR) Slave address + R transmitted;/ ACK received#defineSMB_MRADDNACK0x48/ (MR) Slave address + R transmitted;/ NACK received#defineSMB_MRDBACK0x50/ (MR) data byte recvd; ACK transmitted#defineSMB_MRDBNACK0x58/ (MR) data byte recvd; NACK transmitted/-/Global VARIABLES/-char COMMAND;/ Holds the slave address + R/W bit for use in the SMBus ISR.unsigned char *I2CDataBuff;int n=0,i,flag=1,m=0,h,f,hm=0,s=0,bs=0,l=0,q=0,q1=1,h1,h2,f1,f2;char BYTE_NUMBER;/ Used by ISR to check what data has just been/ sent - High address byte, Low byte, or data byteunsigned char Hour,Minute,Year,Month,Day,Week,Second;unsigned char HIGH_ADD, LOW_ADD;/ High & Low byte for EEPROM memory addressbit SM_BUSY;/ This bit is set when a send or receive/ is started. It is cleared by the/ ISR when the operation is finished./-/ Function PROTOTYPES/-void SMBus_ISR (void);/-/ MAIN Routine/-/ Main routine configures the crossbar and SMBus, and tests/ the SMBus interface between the three EEPROMsvoid ResetRealClock(void)while (SM_BUSY);/ Wait for SMBus to be free.SM_BUSY = 1;/ Occupy SMBus (set to busy)SMB0CN = 0x44;/ SMBus enabled, ACK on acknowledge cycleBYTE_NUMBER = 0;/ 2 address bytes.COMMAND = (CLOCK3530_ADDRESS_RESET | READ);/ Chip select + READSTA = 1;/ Start transferwhile (SM_BUSY);/ Wait for transfer to finish/=写S-3530A内部实时数据寄存器程序=/功能:将设定年、月、日、星期、时、分、秒数据写入S-3530A |/入口:发送数据放在年、月、日、星期、时、分、秒各寄存器 |/出口:NONE |/=void SetRealClock(void)while (SM_BUSY);/ Wait for SMBus to be free.SM_BUSY = 1;/ Occupy SMBus (set to busy)SMB0CN = 0x44;/ SMBus enabled, ACK on acknowledge cycleBYTE_NUMBER = 7;/ 2 address bytes.COMMAND = (CLOCK3530_ADDRESS_DATEHOUR | WRITE);/ Chip select + WRITEI2CDataBuff = &RealTime.ClockString0;/ Data to be writenSTA = 1;/ Start transfer/=读S-3530A实时数据寄存器子程序=/功能:从S-3530A读入当前时间数据 |/入口:NONE |/出口:接收数据放在年、月、日、星期、时、分、秒各寄存器 |/=void GetRealClock(void)while (SM_BUSY);/ Wait for SMBus to be free.SM_BUSY = 1;/ Occupy SMBus (set to busy)SMB0CN = 0x44;/ SMBus enabled, ACK on acknowledge cycleBYTE_NUMBER = 7;/ 2 address bytes.COMMAND = (CLOCK3530_ADDRESS_DATEHOUR | READ);/ Chip select + READI2CDataBuff = &RealTime.ClockString0;/ Data to be writenSTA = 1;/ Start transferwhile (SM_BUSY);/ Wait for transfer to finish/=写状态寄存器程序=/功能:读/写S-3530A状态寄存器,对S-3530A进行设置 |/入口:NONE 出口:NONE |/=unsigned char GetRealClockStatus(void)unsigned char result; while (SM_BUSY);/ Wait for SMBus to be free.SM_BUSY = 1;/ Occupy SMBus (set to busy)SMB0CN = 0x44;/ SMBus enabled, ACK on acknowledge cycleBYTE_NUMBER = 1;COMMAND = (CLOCK3530_ADDRESS_STATUS | READ);I2CDataBuff = &result;STA = 1;/ Start transferwhile (SM_BUSY);/ Wait for transfer to finishreturn result;void SetRealClockStatus(unsigned char status)while (SM_BUSY);/ Wait for SMBus to be free.SM_BUSY = 1;/ Occupy SMBus (set to busy)SMB0CN = 0x44;/ SMBus enabled, ACK on acknowledge cycleBYTE_NUMBER = 1;COMMAND = (CLOCK3530_ADDRESS_STATUS | WRITE);I2CDataBuff = &status;STA = 1;/ Start transfer#include INTRINS.Hunsigned char revolve(unsigned char val)char i;unsigned char val1=0;for (i=0;i8;i+)if (val&0x1)val1+;val1=_crol_(val1,1);val=_cror_(val,1);val1=_cror_(val1,1);return val1;/*-邬-*/char code wu1= 0x00,0x00,0xFC,0x06,0x45,0x84,0x7E,0x04,0x00,0x00,0xFE,0x42,0xB2,0x0E,0x00,0x00,0x10,0x10,0x13,0x12,0x12,0x1A,0x52,0x82,0x7F,0x02,0xFF,0x10,0x20,0x11,0x0E,0x00,;/*-西-*/char code xi1= 0x04,0xC4,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0xE6,0x44,0x00,0x00,0xFF,0x40,0x50,0x48,0x47,0x40,0x40,0x40,0x47,0x48,0x48,0x40,0xFF,0x00,0x00,;/*-占-*/char code zhan= 0x00,0x00,0x80,0x80,0x80,0x80,0xFF,0x88,0x88,0x88,0x88,0xC8,0x8C,0x08,0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,;/*-朱-*/char code zhu= 0x80,0x80,0xA0,0x9E,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x8C,0x88,0xC0,0x80,0x00,
展开阅读全文