日历时钟单片机课程设计
单片机电子万年历课程设计

就时钟而言,通常可采用数码管显示。由于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。另外,89C51本身无专门的液晶驱动接口,因此,本设计采用LED数码管显示,LED数码管是由两个七段四位BT—A5461AH和两个七段两位BT—A5261AH的组成,对于显示数字比较适合。
单片机电子万年历课程设计
前言
1.1 设计背景
随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。
1
CPYSTAC(32.768KHz)
个
1
0.5
0.5
CPYSTAC(12MHz)
个
1
0.5
0.5
DS1302
个
1
1.5
1.5
74LS47
个
2
2.5
5
CD4002B1
个
1
1.5
1.5
AT89C51
个
1
5
5
BT5461AH
个
2
2
4
BT5261AH
个
2
1
2
CR2032、电池座
个
2
0.5
1
万用板(8×30)
2、2N5551的引脚
1.3.4晶振
1、石英晶体振荡器
单片机实现日历时钟课程设计

山东科技大学信息与电气工程学院07-1班学生卡号0701100517 lfj;1键——可调日历;2键——结束返回;3键——秒加1/日加1;4键——分加1/月加1;5键——显示24小时制/时加1/年加1;6键——显示12小时制;7键——可调时间;8键——可调日期CLK BIT P1.6 ;时钟信号端DISP BIT P1.7 ;串出锁存端DBUF EQU 30H ;秒的最低位地址KCLK BIT P2.3KEY BIT P3.5PL BIT P1.7LED BIT P1.1CHANGE2 BIT 21H ;加12的标志位AD1 EQU 40H ;秒AD2 EQU 41H ;分AD3 EQU 42H ;小时AD4 EQU 43H ;天AD5 EQU 44H ;月AD6 EQU 45H ;年;定义结束ORG 0000HLJMP MAINORG 000BH ;T0中断入口LJMP INTORG 0030HMAIN: MOV R0,#AD1MOV R7,#06HLOOP0: MOV A,#00HMOV @R0,AINC R0DJNZ R7,LOOP0 ;R0~R7清零MOV IE,#82H ;允许T0中断MOV TMOD,#01H ;T0允许工作MOV TH0,#4CHMOV TL0,#00H ;送入计数初值0.5sMOV R5,#00H;初始化结束SETB TR0 ;T0使能LOOP: LCALL TEST ;扫描键盘CJNE A,#0FEH,NEXTD ;0FEH为1键LCALL DY1MSLCALL KEYDONENEXTD: SJMP LOOP ;扫描键盘看是否需要调整日历DISPLAY: LCALL TEST ;扫描键盘CJNE A,#0DFH,ERSHISI1;0DFH为6键SETB PSW.1 ;显示十二小时LJMP TIMEZHUANERSHISI1:CJNE A,#0EFH,ERSHISI2;0EFH为5键CLR PSW.1 ;显示二十四小时CLR CHANGE2LJMP TIMEZHUANERSHISI2:CJNE A,#0CFH,CHANGE;0CFH为5+6键CLR PSW.1SETB CHANGE2 ;CHANGE2=1表示把十二表示法转换成二十四小时LJMP TIMEZHUANCHANGE: CLR CHANGE2TIMEZHUAN:LCALL TESTCJNE A,#7FH,NEXTL;7FH为8键SETB PSW.5LJMP ZHUAN1NEXTL: CJNE A,#0BFH,ZHUAN1;0BFH为7键CLR PSW.5ZHUAN1: JB PSW.5,DAY ;PSW.5=0 调整时间,为1则调整日期MOV A,AD1 ;调整时间键码分离MOV B,#0AHDIV ABMOV R0,#DBUFMOV @R0,BINC R0MOV @R0,AMOV A,AD2MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,AJB PSW.1,TIMEZHUAN1LJMP TIMEZHUAN2TIMEZHUAN1: ;判断时间是否大于12MOV A,AD3MOV B,#0CHSUBB A,BJC NORMALTMOV AD3,ALJMP NORMALTTIMEZHUAN2:JNB CHANGE2,NORMALT ;判断是否加12MOV A,AD3ADD A,#12MOV AD3,ACLR CHANGE2NORMALT: MOV A,AD3MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,ASJMP DDISPDAY: ;调整日期键码分离MOV A,AD4MOV B,#0AHDIV ABMOV R0,#DBUFMOV @R0,BINC R0MOV @R0,AMOV A,AD5MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,AMOV A,AD6MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,ADDISP: ;显示,串入并处的方式,上升沿写入MOV R0,#DBUFMOV R7,#06HLOOP2:MOV R6,#08HMOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTR ;显示秒CLR CLOOP3:RRC ACLR CLKMOV DISP,CSETB CLKDJNZ R6,LOOP3INC R0DJNZ R7,LOOP2RETKEYDONE: ;人工手动调整日历AGAINB: LCALL DY250MS ;防抖250msLCALL TESTCJNE A,#7FH,NEXTL1 ;7FH为8键SETB PSW.5LJMP ZHUAN12NEXTL1:CJNE A,#0BFH,ZHUAN12CLR PSW.5 ;以上为扫描键盘并设置PSW.5 ZHUAN12:JB PSW.5,NEXT6B ;判断调整日期还是时间CJNE A,#0FDH,NEXTA ;0FDH为2键,如果按键值为FDH则结束LJMP BACKNEXTA: CJNE A,#0FBH,NEXTB;0FBH为3键INC AD1 ;秒加1MOV A,AD1CJNE A,#3CH,AGAINAMOV AD1,#00HSJMP AGAINANEXTB: CJNE A,#0F7H,NEXTC;0F7H为4键INC AD2 ;分加1MOV A,AD2CJNE A,#3CH,AGAINAMOV AD2,#00HSJMP AGAINANEXTC: CJNE A,#0EFH,AGAINA;0EFH为5键INC AD3 ;时加1MOV A,AD3CJNE A,#18H,AGAINAMOV AD3,#00HNEXTT: SJMP AGAINANEXT6B:CJNE A,#0FDH,NEXTAB;JIESHUJIAN ;0FDH为2键LJMP BACKNEXTAB: CJNE A,#0FBH,NEXTBB;0FBH为3键INC AD4 ;日加1MOV A,AD4CJNE A,#20H,AGAINAMOV AD4,#01HSJMP AGAINANEXTBB: CJNE A,#0F7H,NEXTCB;0F7H为4键INC AD5 ;月加1MOV A,AD5CJNE A,#0DH,AGAINAMOV AD5,#01HSJMP AGAINANEXTCB: CJNE A,#0EFH,AGAINA;0EFH为5键INC AD6 ;年加1MOV A,AD6CJNE A,#64H,AGAINAMOV AD6,#00HAGAINA: LCALL DISPLAYLJMP AGAINBBACK: RETINT: INC R5CJNE R5,#20,NEXTS1 ;循环20次,每次循环为0.5秒,共0.05*20=1秒MOV R5,#00HLCALL DISPLAY ;满一秒后的显示LJMP MENDNEXTS1: LJMP NEXTS ;满一秒后的显示MEND: MOV A,AD1CJNE A,#0AH,LAREMENDSETB LED ;满十秒关灯,否则继续LAREMEND:INC AD1MOV A,AD1CJNE A,#3CH, NEXTS2LJMP MEND1NEXTS2: LJMP NEXTS ;以上为看是否修改秒,满60,分加一否则跳转继续MEND1: MOV AD1,#00HINC AD2MOV A,AD2CJNE A,#3CH,NEXTS3LJMP MEND2NEXTS3: LJMP NEXTS ;以上为看是否修改分,满60,时加一否则跳转继续MEND2: MOV AD2,#00HINC AD3MOV A,AD3CJNE A,#0Ah,ZAIJIANCHAAJMP BAOSHIZAIJIANCHA:CJNE A,#0Bh,ZHENGCHANGBAOSHI: CLR LED ;以上为两个报时开灯ZHENGCHANG:MOV A,AD3CJNE A,#18H,NEXTS4 ;不满二十四小时跳出LJMP MEND3 ;满二十四后跳到清零小时继续加天NEXTS4: LJMP NEXTSMEND3: MOV AD3,#00HINC AD4MOV A,AD5CJNE A,#02H,JIXUTIAN ;判断是否为二月份MOV A,AD6MOV B,#4HDIV ABMOV A,BJZ RUNNIAN ;判断是否为闰年PINGNIAN:MOV A,AD4 ;平年CJNE A,#1DH,NEXTSMOV AD4,#01HAJMP JIXUYUERUNNIAN: MOV A,AD4 ; 闰年CJNE A,#1EH,NEXTSMOV AD4,#01HAJMP JIXUYUEJIXUTIAN: ; 不为二月,再查看是那个月MOV A,AD5CJNE A,#01H,PAN1LJMP SANSHIYIPAN1: CJNE A,#03H,PAN3LJMP SANSHIYIPAN3: CJNE A,#04H,PAN4LJMP SANSHIPAN4: CJNE A,#05H,PAN5LJMP SANSHIYIPAN5: CJNE A,#06H,PAN6LJMP SANSHIPAN6: CJNE A,#07H,PAN7LJMP SANSHIYIPAN7: CJNE A,#08H,PAN8LJMP SANSHIYIPAN8: CJNE A,#09H,PAN9LJMP SANSHIPAN9 : CJNE A,#10H,PAN10LJMP SANSHIYIPAN10: CJNE A,#11H,SANSHIYILJMP SANSHISANSHIYI:MOV A,AD4 ;月份:1,3,5,7,8,10,12CJNE A,#20H,NEXTSMOV AD4,#01HAJMP JIXUYUESANSHI: MOV A,AD4 ; 月份:2,4,6,8,11CJNE A,#1FH,NEXTSMOV AD4,#01HJIXUYUE: INC AD5 ; 满月后加年CJNE A,#0DH,NEXTSMOV AD5,#01HINC AD6MOV A,AD6CJNE A,#64H,NEXTS ; 年满100后清零MOV AD6,#00HNEXTS: ;再赋初值MOV TH0,#4CHMOV TL0,#00HRETIDY250MS: ; 延迟防抖250msMOV R4,#0FAHLOOP8: LCALL DY1MSDJNZ R4,LOOP8RETDY1MS: ; 延迟防抖1msMOV R5,#0FAHLOOP7: MOV R7,#70HDJNZ R5,LOOP7RET;键盘扫描子程序TEST: MOV R7,#08HSETB PLCLR PL ;低电平锁存NOPNOPSETB PL ;高电平输出MOV A,#0FFHAGAIN3: CLR KCLKNOPNOPMOV C,KEY ;把p3.5的状态存入CSETB KCLKRLC A ;键盘状态存入ADJNZ R7,AGAIN3 ;扫描八个按键RETTAB:DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,09H ;子程序功能索引:;TEST——扫描键盘;DDISP——显示;NEXTS——重新赋初值;DY1MS——延迟防抖1msEND。
基于单片机的万年历课程设计

一、前言随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
由其是单片机技术的应用产品已经走进了千家万户。
电子万年历的出现给人们的生活带来的诸多方便。
本设计是基于51系列的单片机进行的电子万年历设计,采用八位数码管显示年月日时分秒及温度信息,具有可调整日期和时间功能。
时间、日期调整由三个按键来实现,并可对闹铃开关进行设置。
日历能显示阳历和阴历年、月、日以及星期、时、分、秒。
设计以STC89C52RC 单片机为核心,构成单片机控制电路;以DS1302时钟芯片作为万年历信号发生器;以DS18B20作为检测温度的传感器。
关键词时钟电钟;DS1302;DS18B20;数码管;单片机。
二、系统概述及总体方案2.1系统概述本电子万年历采用单片机控制技术和数码管显示方案,可以很好的完成万年历和实时温度显示。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
2.2总体方案2.2.1单片机芯片:采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超低压工作;同时也与MCS-51系列单片机完全相同,该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
所以选择采用AT89S52作为主控制系统.2.2.2 时钟芯片:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.且同组同学已从Maxim申请到了这种芯片,所以本设计采用了这种芯片。
单片机课程设计(论文)电子万年历的设计

目录1设计要求 (2)2方案论证与对比 (2)液晶显示器控制方式选择 (2)2.2并行接口动态显示电路选择 (2)2.3LCD液晶显示器的接口方法选择 (3)液晶显示器限流电阻选择 (4)3系统硬件电路的设计 (5)主控模块AT89C52 (5)3.2显示模块电路设计 (6)4系统软件设计 (7)4.1系统软件概述 (7)4.2主要子程序设计 (8)4.2.1 时钟中断服务子程序设计 (8)时间调整子程序设计 (9)4.2.3 判断闰年子程序设计 (9)4.2.4 精度分析分析与计算 (10)4.2.5 第一次初值的设置 (10)4.2.6 重载初值的方法 (10)5系统仿真与测试 (11)5.1系统仿真 (11)功能测试 (11)6总结 (12)参考文献 (13)1设计要求本课题以AT89C52单片机为核心,设计并制作出智能LCD电子钟,具有以下基本功能:能进行时间、年份、日期、星期显示;能区分是否闰年;能检测室温并显示。
扩展功能部分可以通过控制按键使时间暂停、可以调整校正时间并通过按键切换轮流显示时间、年份、日期、星期。
2方案论证与对比2.1液晶显示器控制方式选择采用LCD液晶显示,具有超精致影像画质、十足平面显示、节省空间、节省能源等优点,但按控制方式不同,LCD可分为被动矩阵式LCD及主动矩阵式LCD两种。
可根据不同需要采用不同的方式。
方案一被动矩阵式LCD被动矩阵式LCD在亮度及可视角方面受到较大的限制,反应速度也较慢。
由于画面质量方面的问题,使得这种显示设备不利于发展为桌面型显示器,但成本低廉。
方案二主动矩阵式LCD目前应用比较广泛的主动矩阵式LCD,也称TFT-LCD(Thin Film Transistor-LCD,薄膜晶体管LCD)。
TFT液晶显示器是在画面中的每个像素内建晶体管,可使亮度更明亮、色彩更丰富及更宽广的可视面积。
与CRT显示器相比,LCD显示器的平面显示技术体现为较少的零件、占据较少的桌面及耗电量较小,但CRT技术较为稳定成熟。
单片机简易日历课程设计

单片机简易日历课程设计一、课程目标知识目标:1. 理解单片机的基础知识,掌握其内部结构和功能;2. 学习简易日历的原理,了解日期、时间与单片机编程的关系;3. 掌握C语言编程基础,运用其进行单片机程序设计。
技能目标:1. 能够独立完成单片机的硬件连接,进行基本的程序下载与调试;2. 运用C语言编写简易日历程序,实现日期、时间的显示与修改;3. 培养学生动手实践能力,提高问题分析及解决能力。
情感态度价值观目标:1. 培养学生对单片机编程的兴趣,激发创新意识;2. 培养学生的团队协作精神,提高沟通与交流能力;3. 培养学生严谨、细心的学习态度,养成良好的编程习惯。
分析课程性质、学生特点和教学要求,本课程旨在通过单片机简易日历的设计与实现,让学生掌握单片机基础知识、编程技能,并培养其团队协作和创新能力。
课程目标具体、可衡量,便于教学设计和评估。
通过本课程的学习,学生将能够独立完成单片机程序的编写与调试,为后续相关课程打下坚实基础。
二、教学内容1. 单片机基础知识:介绍单片机的内部结构、工作原理及功能,涉及教材第1章内容;- 单片机硬件结构及引脚功能;- 单片机工作原理及指令系统。
2. C语言编程基础:学习C语言基础知识,掌握基本语法,为单片机编程打下基础,涉及教材第2章内容;- 数据类型、变量与常量;- 运算符、表达式及语句;- 控制结构(顺序、选择、循环)。
3. 简易日历原理:学习日期、时间的计算方法,了解日历程序设计思路,涉及教材第3章内容;- 日期、时间的基本概念;- 日历程序设计思路及算法。
4. 单片机程序设计:结合C语言,学习单片机程序编写与调试,实现简易日历功能,涉及教材第4章内容;- 单片机程序框架及编程规范;- 简易日历程序的编写与调试;- 硬件连接及程序下载。
5. 实践操作:安排学生进行单片机简易日历的实践操作,巩固所学知识,涉及教材第5章内容;- 硬件连接与程序下载;- 程序调试与优化;- 团队合作、沟通交流。
单片机课程设计之万年历、闹钟与温度显示设计

本系统采用C语言编写,控制器采用单片机STC89C52,温度检测部分采用DS18B20温度传感器,时钟系统用时钟芯片DS1302,用八位数码管作为显示器。单片机通过时钟芯片DS1302获取时间数据;通过温度传感器DS18B20采集温度信号送给单片机处理,并在数码管中显示出来,键盘可以切换界面,调时和温度查询与设置闹钟的功能。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。电路图如图3-4所示。
6、数码管显示电路设计
数码管内部是由7个条形发光二极管与一个小圆点发光二极管组成,根据这八个二极管的亮暗组成不同的字符。本系统采用八位数码管作为显示模块,数码管相对其他LCD类的显示器来说,成本比较低廉,省电。两个四位共阴0.56英寸的数码管作为显示屏。如图3-6所示。
7、按键控制电路设计
本系统采用四个按键作为键盘控制实现界面切换的功能,如图3-7所示。能够实现界面切换、时间校正、闹钟设置等功能。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图3-8所示。抖动时间的长短与开关的机械特性有关,一般为5-10 ms。故软件编程时需要注意消除抖动。
单片机课程设计(可调式中文电子日历)

摘要万年历的功能可实现年、月、日、时、分、秒和星期的显示。
随着社会的发展日历的功能越来越强大,精确度越来越高。
本次设计的日历采用DS1302时钟芯片,该芯片精确度高,性能可靠。
用LCD12864液晶屏,既可以显示数字又可以显示汉字,方便了人们的生活。
本设计总体分为硬件部分和软件部分。
硬件部分可分为:时钟芯片DS1302、AT89C51和LCD12864等。
本设计非常适合家庭使用。
电源采用+5V电压供电。
走时精确,是现代家庭必备的设备之一。
关键词:单片机,万年历, DS1302,时钟芯片1引言可调式电子日历与时钟小巧便于携带,界面清爽,一目了然,方便的知晓当前时间,并可对时间做出修改,实在是居家旅行日常生活之必备用品。
在现今的可调式电子日历与时钟具有性能稳定、精确度高、成本低、易于产品化,以及方便、实用等特点。
2.总体设计2.1基本原理硬件主要涉及到:AT89C51、DS1302、LCD12864等。
软件通过框图编写出程序。
AT89C51主要功能是存储程序、根据程序的内容对各个端口进行判断并做出相应的处理。
LCD12864主要的功能是实现年、月、日、时、分、秒的显示效果。
实时时钟DS1302可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
2.2系统总体框图及设计思路3.详细设计3.1 硬件设计3.1.1 DS1302芯片及原理介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
单片机实现日历时钟课程设计

山东科技大学信息与电气工程学院07-1班学生卡号0701100517lfj;1键——可调日历;2键——结束返回;3键——秒加1/xx1;4键——分加1/月加1;5键——显示24小时制/时加1/年加1;6键——显示12小时制;7键——可调时间;8键——可调日期CLK BIT P1.6;时钟信号端DISP BIT P1.7;串出锁存端DBUF EQU 30H ;秒的最低位地址KCLK BIT P2.3KEY BIT P3.5PL BIT P1.7LED BIT P1.1CHANGE2 BIT 21H ;加12的标志位AD1 EQU 40H ;秒AD2 EQU 41H ;分AD3 EQU 42H ;小时AD4 EQU 43H ;天AD5 EQU 44H ;月AD6 EQU 45H ;年;定义结束ORG 0000HLJMP MAINORG 000BH ;T0xxxxLJMP INTORG 0030HMAIN:MOV R0,#AD1MOV R7,#06HLOOP0:MOV A,#00HMOV @R0,AINC R0DJNZ R7,LOOP0;R0~R7清零MOV IE,#82H ;允许T0xxMOV TMOD,#01H ;T0允许工作MOV TH0,#4CHMOV TL0,#00H ;送入计数初值0.5s MOV R5,#00H;初始化结束SETB TR0;T0使能LOOP:LCALL TEST ;扫描键盘CJNE A,#0FEH,NEXTD ;0FEH为1键LCALL DY1MSLCALL KEYDONENEXTD:SJMP LOOP ;扫描键盘看是否需要调整日历DISPLAY: LCALL TEST ;扫描键盘CJNE A,#0DFH,ERSHISI1;0DFH为6键SETB PSW.1;显示十二小时LJMP TIMEZHUANERSHISI1:CJNE A,#0EFH,ERSHISI2;0EFH为5键CLR PSW.1;显示二十四小时CLR CHANGE2LJMP TIMEZHUANERSHISI2:CJNE A,#0CFH,CHANGE;0CFH为5+6键CLR PSW.1SETB CHANGE2 ;CHANGE2=1表示把十二表示法转换成二十四小时LJMP TIMEZHUANCHANGE:CLR CHANGE2TIMEZHUAN:LCALL TESTCJNE A,#7FH,NEXTL;7FH为8键SETB PSW.5LJMP ZHUAN1NEXTL:CJNE A,#0BFH,ZHUAN1;0BFH为7键CLR PSW.5ZHUAN1:JB PSW.5,DAY ;PSW.5=0调整时间,为1则调整日期MOV A,AD1;调整时间键码分离MOV B,#0AHDIV ABMOV R0,#DBUFMOV @R0,BINC R0MOV @R0,AMOV A,AD2MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,AJB PSW.1,TIMEZHUAN1LJMP TIMEZHUAN2TIMEZHUAN1:;判断时间是否大于12 MOV A,AD3MOV B,#0CHSUBB A,BJC NORMALTMOV AD3,ALJMP NORMALTTIMEZHUAN2:JNB CHANGE2,NORMALT ;判断是否加12 MOV A,AD3ADD A,#12MOV AD3,ACLR CHANGE2NORMALT: MOV A,AD3MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,ASJMP DDISP DAY:MOV A,AD4 MOV B,#0AH DIV ABMOV R0,#DBUF MOV @R0,B INC R0MOV @R0,A MOV A,AD5 MOV B,#0AH DIV ABINC R0MOV @R0,B INC R0MOV @R0,A MOV A,AD6 MOV B,#0AH DIV ABINC R0MOV @R0,BINC R0MOV @R0,ADDISP:;调整日期键码分离;显示,串入并处的方式,上升沿写入MOV R0,#DBUFMOV R7,#06HLOOP2:MOV R6,#08HMOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTR ;显示秒CLR CLOOP3:RRC ACLR CLKMOV DISP,CSETB CLKDJNZ R6,LOOP3INC R0DJNZ R7,LOOP2RETKEYDONE:;人工手动调整日历AGAINB:LCALL DY250MS ;防抖250msLCALL TESTCJNE A,#7FH,NEXTL1;7FH为8键SETB PSW.5LJMP ZHUAN12NEXTL1:CJNE A,#0BFH,ZHUAN12CLR PSW.5;以上为扫描键盘并设置PSW.5ZHUAN12:JB PSW.5,NEXT6B ;判断调整日期还是时间CJNE A,#0FDH,NEXTA ;0FDH为2键,如果按键值为FDH则结束LJMP BACK NEXTA:CJNE A,#0FBH,NEXTB;0FBH为3键INC AD1;秒加1MOV A,AD1CJNE A,#3CH,AGAINAMOV AD1,#00HSJMP AGAINANEXTB:CJNE A,#0F7H,NEXTC;0F7H为4键INC AD2;分加1MOV A,AD2MOV AD2,#00HSJMP AGAINANEXTC:CJNE A,#0EFH,AGAINA;0EFH为5键INC AD3;时加1MOV A,AD3CJNE A,#18H,AGAINAMOV AD3,#00HNEXTT:SJMP AGAINANEXT6B:CJNE A,#0FDH,NEXTAB;JIESHUJIAN ;0FDH为2键LJMP BACKNEXTAB:CJNE A,#0FBH,NEXTBB;0FBH为3键INC AD4;xx1MOV A,AD4CJNE A,#20H,AGAINAMOV AD4,#01HSJMP AGAINANEXTBB:CJNE A,#0F7H,NEXTCB;0F7H为4键INC AD5;月加1MOV A,AD5MOV AD5,#01HSJMP AGAINANEXTCB:CJNE A,#0EFH,AGAINA;0EFH为5键INC AD6;年加1MOV A,AD6CJNE A,#64H,AGAINAMOV AD6,#00HAGAINA:LCALL DISPLAYLJMP AGAINBBACK:RETINT:INC R5CJNE R5,#20,NEXTS1;循环20次,每次循环为0.5秒,共0.05*20=1秒MOV R5,#00HLCALL DISPLAY ;满一秒后的显示LJMP MENDNEXTS1:LJMP NEXTS ;满一秒后的显示MEND:MOV A,AD1CJNE A,#0AH,LAREMENDSETB LED ;满十秒关灯,否则继续LAREMEND:INC AD1MOV A,AD1CJNE A,#3CH, NEXTS2LJMP MEND1NEXTS2:LJMP NEXTS ;以上为看是否修改秒,满60,分加一否则跳转继续MEND1:MOV AD1,#00HINC AD2MOV A,AD2CJNE A,#3CH,NEXTS3LJMP MEND2NEXTS3:LJMP NEXTS ;以上为看是否修改分,满60,时加一否则跳转继续MEND2:MOV AD2,#00HINC AD3MOV A,AD3CJNE A,#0Ah,ZAIJIANCHAAJMP BAOSHIZAIJIANCHA:CJNE A,#0Bh,ZHENGCHANGBAOSHI:CLR LED ;以上为两个报时开灯ZHENGCHANG:MOV A,AD3CJNE A,#18H,NEXTS4;不满二十四小时跳出LJMP MEND3;满二十四后跳到清零小时继续加天NEXTS4:LJMP NEXTSMEND3:MOV AD3,#00HINC AD4MOV A,AD5CJNE A,#02H,JIXUTIAN ;判断是否为二月份MOV A,AD6MOV B,#4HDIV ABMOV A,BJZ RUNNIAN ;判断是否为闰年PINGNIAN:MOV A,AD4;平年CJNE A,#1DH,NEXTSMOV AD4,#01HAJMP JIXUYUERUNNIAN: MOV A,AD4;闰年CJNE A,#1EH,NEXTSMOV AD4,#01HAJMP JIXUYUEJIXUTIAN:;不为二月,再查看是那个月MOV A,AD5CJNE A,#01H,PAN1LJMP SANSHIYIPAN1:CJNE A,#03H,PAN3 LJMP SANSHIYIPAN3:CJNE A,#04H,PAN4 LJMP SANSHIPAN4:CJNE A,#05H,PAN5 LJMP SANSHIYIPAN5:CJNE A,#06H,PAN6 LJMP SANSHIPAN6:CJNE A,#07H,PAN7 LJMP SANSHIYIPAN7:CJNE A,#08H,PAN8 LJMP SANSHIYIPAN8:CJNE A,#09H,PAN9 LJMP SANSHIPAN9 :CJNE A,#10H,PAN10 LJMP SANSHIYIPAN10:CJNE A,#11H,SANSHIYI LJMP SANSHI SANSHIYI:MOV A,AD4;月份:1,3,5,7,8,10,12 CJNE A,#20H,NEXTSMOV AD4,#01HAJMP JIXUYUESANSHI:MOV A,AD4;月份:2,4,6,8,11 CJNE A,#1FH,NEXTSMOV AD4,#01HJIXUYUE: INC AD5;满月后加年CJNE A,#0DH,NEXTSMOV AD5,#01HINC AD6MOV A,AD6CJNE A,#64H,NEXTS ;年满100后清零MOV AD6,#00HNEXTS:;再赋初值MOV TH0,#4CHMOV TL0,#00HRETIDY250MS:;延迟防抖250msMOV R4,#0FAHLOOP8:LCALL DY1MSDJNZ R4,LOOP8RETDY1MS:;延迟防抖1msMOV R5,#0FAHLOOP7:MOV R7,#70HDJNZ R5,LOOP7RET;键盘扫描子程序TEST:MOV R7,#08HSETB PLCLR PL ;低电平锁存NOPNOPSETB PL ;高电平输出MOV A,#0FFHAGAIN3:CLR KCLKNOPNOPMOV C,KEY ;把p3.5的状态存入C SETB KCLKRLC A ;键盘状态存入ADJNZ R7,AGAIN3;扫描八个按键RETTAB:DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,09H ;子程序功能xx:;TEST——扫描键盘;DDISP——显示;NEXTS——重新赋初值;DY1MS——延迟防抖1msEND。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计——日历时钟与键盘显示程序设计姓名:管曌学号:3081109003班级:J通信0801指导老师:熊书明日历时钟与键盘显示程序设计一、设计目的(1)能在LED显示器上实现正常的时分秒计时(2)能通过键盘输入当前时间,并从该时间开始计时(3)有校时、校分功能(4)有报时功能,通过指示灯表示(5)有闹时功能,闹时时间可以设定,通过指示灯表示二、设计内容该课程设计是利用MCS-51单片机内部的定时/计数器、中断系统、以及行列键盘和LED显示器等部件,设计一个单片机电子时钟。
设计的电子时钟通过数码管显示,并能通过按键实现设置时间和暂停、启动控制等。
三、MCS-51单片机系统简介单片机应用系统由硬件系统和软件系统两部分组成。
硬件系统是指单片机以及扩展的存储器、I\O接口、外围扩展的功能芯片以及接口电路。
软件系统包括监控程序和各种应用程序。
在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。
与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和I\O接口,使单片机应用系统能够运行。
在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。
在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。
配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个按键和几个LED指示灯就可以进行处理了。
在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。
显示器可以是LED指示灯,也可以是LED数码管,也可以是LCD显示器,还可以使用CRT显示器。
单片机应用系统中键盘一般用的比较多的是矩阵键盘,显示器用的比较多的是LED数码管还LCD显示器。
四、设计方案通过键盘输入,设置当前时间存入S-3530A,然后从S-3530A读取实时时间并显示在七段码LED显示上,键盘和LED显示通过键盘专用芯片HD7279A进行控制,7279A也是I2C总线接口的芯片,系统中采用并行口线模拟I2C实现C8051F020和HD7279A的通信,用硬件实现S-3530A和HD7279A的连接。
用定时/计数器T0,工作于定时,采用方式1,对系统时钟进行定时计数,初值设为23时59分50秒。
定时时间为50ms。
用片内RAM的7BH单元对50ms 计数,计20次产生秒计数器78H单元加1,秒计数器加到60则分计数器79H单元加1,分计数器加到60则时计数器7AH单元加1,时计数器加到24则时计数器清0。
然后把秒、分、时计数器分成十位和个位放到8个数码管的显示缓冲区,通过数码管显示出来。
显示格式为小时十位、小时个位---分十位、分个位---秒十位、秒个位。
在处理过程中加上了按键判断程序,能对按键处理,1是时加一,2是时减一,3是分加一,4是分减一,5是秒清零,D是闹钟时间的设定,E 是进行校时,F是暂停键。
五、系统软件设计流程:1.主程序流程如图所示:2.时间设定程序流程如图所示:3.闹铃设定流程图如图所示:六、程序#include "c8051f020.h"#include <intrins.h>#include "test7279.h"unsigned char Count1ms,set,set1,set2;// int count;static int time[3]={23,59,50};//current timestatic char disptime[6]={'2','3','5','9','5','0'};//显示时间int dertime[3]={00,00,01};int nowtime[3]={00,01,00};//闹钟时间void Delay1us(unsigned char us){while (us){_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //占用一个指令周期--us;}}void SYSCLK_Init (void){int i;OSCXCN = 0x67;for (i=0; i < 256; i++) ;while (!(OSCXCN & 0x80)) ;OSCICN = 0x88;}#define PRT0CF P0MDOUT#define PRT1CF P1MDOUT#define PRT2CF P2MDOUTvoid PORT_Init (void){XBR0 = 0x07;XBR1 = 0x00;XBR2 = 0x44;EMI0TC = 0x21;P74OUT = 0xFF;P0MDOUT = 0x15;P1MDOUT |= 0x3C;P1 &= 0xc3;}void SPI0_Init (void){SPI0CFG = 0x07;SPI0CFG|=0xC0;SPI0CN = 0x03;SPI0CKR = SYSCLK/2/8000000-1;}void Timer0_Init (void){CKCON&=0xf7;//12TMOD=0x01; //t0 1TR0 = 0;Count1ms=40;TL0 = 0x58;TH0 = (-SYSCLK/1000) >> 8;TL0 = -SYSCLK/1000;TR0 = 1;IE|= 0x2;}char GetKeyValue(void){char KeyValue;if (CPT1CN&0x40) return -1; //无键按下Send7279Byte(0x15); //发读键盘指令 0001 0101KeyValue=Receive7279Byte();NOSELECT7279; //置CS高电平return KeyValue;}void WaitKeyOff(void){while (!(CPT1CN&0x40));}void inputnum(void) //i=5开始,输入数字显示 disptime[5-i]i=5--0{char j,KeyValue,i;i=5;while(1){KeyValue=GetKeyValue();WaitKeyOff();if(((KeyValue%16)>=0) && ((KeyValue%16)<=9)) // i=5 4 3 2 1{disptime[5-i]=KeyValue;if(((disptime[0]<=1) || ((disptime[0]==2) && (disptime[1]<4))) && (disptime[2]<6) && (disptime[4]<6) ){ Send7279Byte(0xC8+i);Send7279Byte(KeyValue);NOSELECT7279;i--;}}if(i<0) break;}for (j=0;j<3;j++) //int-char{dertime[j]=disptime[2*j]*10+disptime[2*j+1];}if(set1){set1=!set1;// 设置时间}if(set2){set2=!set2;// 设置时间}}void FlashLED(unsigned char No){char i;Send7279Byte(0x88); //发闪烁指令i=0x1;while (No){i=i<<1;No--;}Send7279Byte(~i); //1闪烁NOSELECT7279; //置CS高电平}void main(void){char j,KeyValue;WDTCN = 0xde;WDTCN = 0xad; //关看门狗SYSCLK_Init (); //初始化时钟Timer0_Init(); //初始化定时器PORT_Init (); //初始化IO口SPI0_Init (); //初始化SPI0CPT1CN|=0x80; //使能比较器1REF0CN = 0x03; //使能片内参考电压DAC0CN |= 0x80; //使能DAC0DAC0H=0; DAC0L=0;EA=1; //开中断Delay1us(25000); //等待25ms复位时间Send7279Byte(0xA4); //发复位指令NOSELECT7279;DispLED(disptime,0); //显示初始时间while(1){KeyValue=GetKeyValue();WaitKeyOff();if((KeyValue%16)==0x0f){set=!set;}if(set) //起停*****{if((KeyValue%16)==0x0e){set1=!set1;// 设置时间}if((KeyValue%16)==0x0d){set2=!set2;// 设置闹钟}if(set1)//设置时间**********{DispLED("------",0);inputnum();for (j=0;j<3;j++) //int-char{time[j]=dertime[j];}}if(set2)// 设置闹钟********{ DispLED("------",0);inputnum();for (j=0;j<3;j++) //int-char{nowtime[j]=dertime[j];//nowtime[j]闹钟时间}}}else{switch (KeyValue%16)//校时{case 1:time[0]=(time[0]+1+24)%24;break;case 2:time[0]=(time[0]-1+24)%24;break;case 3:time[1]=(time[1]+1+60)%60;break;case 4:time[1]=(time[1]-1+60)%60;break;case 0xd:FlashLED(8);break;//暂停闪烁default:break;}}}}void Timer0_ISR (void) interrupt 1{int i;TH0 = 0x9e;TL0 = 0x58;if (set==1)return;Count1ms--; // unsigned char Count1ms会小于0,因为无符号会溢出,计数次数变大所以延迟大if (Count1ms==0) //秒{Count1ms=40;time[2]=time[2]+1;if((time[1]==59) && (time[2]==55))//报时功能*********** Send7279Byte(0xbf); //闹钟功能***********if((time[0]==nowtime[0]) && (time[1]==nowtime[1]) && (time[2]==nowtime[2]))Send7279Byte(0xbf);if(((time[1]*60+time[2]-nowtime[1]*60-nowtime[2])>10) && (time[0]==nowtime[0]))FlashLED(8);if (time[2]>=60) //分{time[2]=0;time[1]=time[1]+1;if (time[1]>=60) // 时{time[1]=0;time[0]=time[0]+1;if((time[1]==00) && (time[2]==00))FlashLED(8);if (time[0]>=24){time[0]=0;}}}if (set!=1){for (i=0;i<3;i++) //int-char{disptime[2*i]=time[i]/10;disptime[2*i+1]=time[i]%10;}DispLED(disptime,0); //显示时间************}}}test7279.h#include "c8051f020.h"#include <intrins.h>sbit HD7279_DAT=P1^7;sbit HD7279_CLK=P1^6;#define NOSELECT7279 P5 |= 0x80 //SPICS4(P57)=1#define SELECT7279 P5 &= ~(0x80) //SPICS4(P57)=0; #define Set7279DAT HD7279_DAT=1#define Clr7279DAT HD7279_DAT=0#define Set7279CLK HD7279_CLK=1#define Clr7279CLK HD7279_CLK=0// HD7279测试/演示程序// I/O口初始化void Delay1ms(unsigned char T);void Delay1s(unsigned char T);void Delay1us(unsigned char T);void Send7279Byte(unsigned char ch){char i;SELECT7279; //置CS低电平Delay1us(50); //延时50μfor (i=0;i<8;i++){if (ch&0x80) //输出7位到HD7279A的DATA端 1000 0000{Set7279DAT;}else{Clr7279DAT;}Set7279CLK; //置CLK高电平ch=ch<<1; //待发数据左移Delay1us(8); //延时8μClr7279CLK; //置CLK低电平Delay1us(8); //延时50μ}Clr7279DAT; //发送完毕,DATA端置低,返回}unsigned char Receive7279Byte(void){unsigned char i,ch;ch=0;Set7279DAT; //DATA端置为高电平,输入状态Delay1us(50); //延时50μfor (i=0;i<8;i++){Set7279CLK; //置CLK高电平Delay1us(8); //延时8μch=ch<<1; //接收数据左移1位if (HD7279_DAT)ch+=1; //接收1位数据Clr7279CLK; //置CLK低电平Delay1us(8); //延时8μ}Clr7279DAT; //接收完毕,DATA端重新置成低电平(输出状态)return ch;}void BlankLED(unsigned char ch){Send7279Byte(0x98); //发消隐指令Send7279Byte(ch); //1-显示 0-消隐NOSELECT7279; //置CS高电平}unsigned char code BdSeg[]={0x7e,0x30,0x6d,0x79, // 0 1 2 30x33,0x5b,0x5f,0x70, // 4 5 6 70x7f,0x7b,0x77,0x1f, // 8 9 a b0x4e,0x3d,0x4f,0x47, // c d e f0x00,0x01};/*; b6; ----; b1| b0 |b5; ---- small; b2| b3 |b4; ---- .b7*/void DispLED(char *DispBuf,char ShowDot)//ShowDot 显示小数点位{char i,ch;ShowDot--;for (i=0;i<6;i++){ch=DispBuf[i];if ((ch>='a') && (ch<='f')){ch-='a';ch+=0xa;}if ((ch>='A') && (ch<='F')){ch-='A';ch+=0xa;}Send7279Byte(0x90+5-i); //不译码if (ch==' ')Send7279Byte(0x00);elseif (ch=='-')Send7279Byte(0x01);else{if (ShowDot==i)Send7279Byte(0x80|BdSeg[ch&0x0f]);elseSend7279Byte(BdSeg[ch&0x0f]);}}NOSELECT7279; //置CS高电平}C8051F020.h#ifndef _C8051F020_#define _C8051F020_#define SYSCLK 11059200 // 系统时钟取自外部晶体/*---------------------------------------------------------------------------; Copyright (C) 2001 CYGNAL INTEGRATED PRODUCTS, INC.; All rights reserved.;;; FILE NAME : C8051F020.H; TARGET MCUs : C8051F020, 'F021, 'F022, 'F023; DESCRIPTION : Register/bit definitions for the C8051F02xproduct family.;; REVISION 1.0;;---------------------------------------------------------------------------*//* BYTE Registers */sfr P0 = 0x80; /* PORT 0 */sfr SP = 0x81; /* STACK POINTER */sfr DPL = 0x82; /* DATA POINTER - LOW BYTE */sfr DPH = 0x83; /* DATA POINTER - HIGH BYTE */sfr P4 = 0x84; /* PORT 4*/sfr P5 = 0x85; /* PORT 5 */sfr P6 = 0x86; /* PORT 6*/sfr PCON = 0x87; /* POWER CONTROL */sfr TCON = 0x88; /* TIMER CONTROL */sfr TMOD = 0x89; /* TIMER MODE */sfr TL0 = 0x8A; /* TIMER 0 - LOW BYTE */sfr TL1 = 0x8B; /* TIMER 1 - LOW BYTE */sfr TH0 = 0x8C; /* TIMER 0 - HIGH BYTE */sfr TH1 = 0x8D; /* TIMER 1 - HIGH BYTE */sfr CKCON = 0x8E; /* CLOCK CONTROL */sfr PSCTL = 0x8F; /* PROGRAM STORE R/W CONTROL */sfr P1 = 0x90; /* PORT 1 */sfr TMR3CN = 0x91; /* TIMER 3 CONTROL */sfr TMR3RLL = 0x92; /* TIMER 3 RELOAD REGISTER - LOW BYTE */sfr TMR3RLH = 0x93; /* TIMER 3 RELOAD REGISTER - HIGH BYTE */sfr TMR3L = 0x94; /* TIMER 3 - LOW BYTE */sfr TMR3H = 0x95; /* TIMER 3 - HIGH BYTE */sfr P7 = 0x96; /* PORT 7 */sfr SCON0 = 0x98; /* SERIAL PORT 0 CONTROL */sfr SBUF0 = 0x99; /* SERIAL PORT 0 BUFFER */sfr SPI0CFG = 0x9A; /* SERIAL PERIPHERAL INTERFACE 0CONFIGURATION */sfr SPI0DAT = 0x9B; /* SERIAL PERIPHERAL INTERFACE 0 DATAsfr ADC1 = 0x9C; /* ADC 1 DATA */sfr SPI0CKR = 0x9D; /* SERIAL PERIPHERAL INTERFACE 0 CLOCK RATECONTROL */sfr CPT0CN = 0x9E; /* COMPARATOR 0 CONTROL */sfr CPT1CN = 0x9F; /* COMPARATOR 1 CONTROL */sfr P2 = 0xA0; /* PORT 2 */sfr EMI0TC = 0xA1; /* EMIF TIMING CONTROL */sfr EMI0CF = 0xA3; /* EXTERNAL MEMORY INTERFACE (EMIF)CONFIGURATION */sfr P0MDOUT = 0xA4; /* PORT 0 OUTPUT MODE CONFIGURATION */sfr P1MDOUT = 0xA5; /* PORT 1 OUTPUT MODE CONFIGURATION */sfr P2MDOUT = 0xA6; /* PORT 2 OUTPUT MODE CONFIGURATION */sfr P3MDOUT = 0xA7; /* PORT 3 OUTPUT MODE CONFIGURATION */sfr IE = 0xA8; /* INTERRUPT ENABLE */sfr SADDR0 = 0xA9; /* SERIAL PORT 0 SLAVE ADDRESS */sfr ADC1CN = 0xAA; /* ADC 1 CONTROL */sfr ADC1CF = 0xAB; /* ADC 1 ANALOG MUX CONFIGURATION */sfr AMX1SL = 0xAC; /* ADC 1 ANALOG MUX CHANNEL SELECT */sfr P3IF = 0xAD; /* PORT 3 EXTERNAL INTERRUPT FLAGS */sfr SADEN1 = 0xAE; /* SERIAL PORT 1 SLAVE ADDRESS MASK */sfr EMI0CN = 0xAF; /* EXTERNAL MEMORY INTERFACE CONTROL */sfr P3 = 0xB0; /* PORT 3 */sfr OSCXCN = 0xB1; /* EXTERNAL OSCILLATOR CONTROL */sfr OSCICN = 0xB2; /* INTERNAL OSCILLATOR CONTROLsfr P74OUT = 0xB5; /* PORTS 4 - 7 OUTPUT MODE */sfr FLSCL = 0xB6; /* FLASH MEMORY TIMING PRESCALER */sfr FLACL = 0xB7; /* FLASH ACESS LIMIT */sfr IP = 0xB8; /* INTERRUPT PRIORITY */sfr SADEN0 = 0xB9; /* SERIAL PORT 0 SLAVE ADDRESS MASK */sfr AMX0CF = 0xBA; /* ADC 0 MUX CONFIGURATION */sfr AMX0SL = 0xBB; /* ADC 0 MUX CHANNEL SELECTION */sfr ADC0CF = 0xBC; /* ADC 0 CONFIGURATION */sfr P1MDIN = 0xBD; /* PORT 1 INPUT MODE */sfr ADC0L = 0xBE; /* ADC 0 DATA - LOW BYTE */sfr ADC0H = 0xBF; /* ADC 0 DATA - HIGH BYTE */sfr SMB0CN = 0xC0; /* SMBUS 0 CONTROL */sfr SMB0STA = 0xC1; /* SMBUS 0 STATUS */sfr SMB0DAT = 0xC2; /* SMBUS 0 DATA */sfr SMB0ADR = 0xC3; /* SMBUS 0 SLAVE ADDRESS */sfr ADC0GTL = 0xC4; /* ADC 0 GREATER-THAN REGISTER - LOW BYTE */sfr ADC0GTH = 0xC5; /* ADC 0 GREATER-THAN REGISTER - HIGH BYTE */sfr ADC0LTL = 0xC6; /* ADC 0 LESS-THAN REGISTER - LOW BYTE */sfr ADC0LTH = 0xC7; /* ADC 0 LESS-THAN REGISTER - HIGH BYTE */sfr T2CON = 0xC8; /* TIMER 2 CONTROL */sfr T4CON = 0xC9; /* TIMER 4 CONTROL */sfr RCAP2L = 0xCA; /* TIMER 2 CAPTURE REGISTER - LOW BYTEsfr RCAP2H = 0xCB; /* TIMER 2 CAPTURE REGISTER - HIGH BYTE */sfr TL2 = 0xCC; /* TIMER 2 - LOW BYTE */sfr TH2 = 0xCD; /* TIMER 2 - HIGH BYTE */sfr SMB0CR = 0xCF; /* SMBUS 0 CLOCK RATE */sfr PSW = 0xD0; /* PROGRAM STATUS WORD */sfr REF0CN = 0xD1; /* VOLTAGE REFERENCE 0 CONTROL */sfr DAC0L = 0xD2; /* DAC 0 REGISTER - LOW BYTE */sfr DAC0H = 0xD3; /* DAC 0 REGISTER - HIGH BYTE */sfr DAC0CN = 0xD4; /* DAC 0 CONTROL */sfr DAC1L = 0xD5; /* DAC 1 REGISTER - LOW BYTE */sfr DAC1H = 0xD6; /* DAC 1 REGISTER - HIGH BYTE */sfr DAC1CN = 0xD7; /* DAC 1 CONTROL */sfr PCA0CN = 0xD8; /* PCA 0 COUNTER CONTROL */sfr PCA0MD = 0xD9; /* PCA 0 COUNTER MODE */sfr PCA0CPM0 = 0xDA; /* CONTROL REGISTER FOR PCA 0 MODULE 0 */sfr PCA0CPM1 = 0xDB; /* CONTROL REGISTER FOR PCA 0 MODULE 1 */sfr PCA0CPM2 = 0xDC; /* CONTROL REGISTER FOR PCA 0 MODULE 2 */sfr PCA0CPM3 = 0xDD; /* CONTROL REGISTER FOR PCA 0 MODULE 3 */sfr PCA0CPM4 = 0xDE; /* CONTROL REGISTER FOR PCA 0 MODULE 4 */sfr ACC = 0xE0; /* ACCUMULATOR */sfr XBR0 = 0xE1; /* DIGITAL CROSSBAR CONFIGURATION REGISTER0 */sfr XBR1 = 0xE2; /* DIGITAL CROSSBAR CONFIGURATION REGISTER1 */sfr XBR2 = 0xE3; /* DIGITAL CROSSBAR CONFIGURATION REGISTER2 */sfr RCAP4L = 0xE4; /* TIMER 4 CAPTURE REGISTER - LOW BYTE */sfr RCAP4H = 0xE5; /* TIMER 4 CAPTURE REGISTER - HIGH BYTE */sfr EIE1 = 0xE6; /* EXTERNAL INTERRUPT ENABLE 1 */sfr EIE2 = 0xE7; /* EXTERNAL INTERRUPT ENABLE 2 */sfr ADC0CN = 0xE8; /* ADC 0 CONTROL */sfr PCA0L = 0xE9; /* PCA 0 TIMER - LOW BYTE */sfr PCA0CPL0 = 0xEA; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 0 - LOW BYTE */sfr PCA0CPL1 = 0xEB; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 1 - LOW BYTE */sfr PCA0CPL2 = 0xEC; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 2 - LOW BYTE */sfr PCA0CPL3 = 0xED; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 3 - LOW BYTE */sfr PCA0CPL4 = 0xEE; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 4 - LOW BYTE */sfr RSTSRC = 0xEF; /* RESET SOURCE */sfr B = 0xF0; /* B REGISTER */sfr SCON1 = 0xF1; /* SERIAL PORT 1 CONTROL */sfr SBUF1 = 0xF2; /* SERAIL PORT 1 DATA */sfr SADDR1 = 0xF3; /* SERAIL PORT 1 */sfr TL4 = 0xF4; /* TIMER 4 DATA - LOW BYTE */sfr TH4 = 0xF5; /* TIMER 4 DATA - HIGH BYTE */sfr EIP1 = 0xF6; /* EXTERNAL INTERRUPT PRIORITY REGISTER 1 */sfr EIP2 = 0xF7; /* EXTERNAL INTERRUPT PRIORITY REGISTER 2 */sfr SPI0CN = 0xF8; /* SERIAL PERIPHERAL INTERFACE 0 CONTROL*/sfr PCA0H = 0xF9; /* PCA 0 TIMER - HIGH BYTE */sfr PCA0CPH0 = 0xFA; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 0 - HIGH BYTE */sfr PCA0CPH1 = 0xFB; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 1 - HIGH BYTE */sfr PCA0CPH2 = 0xFC; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 2 - HIGH BYTE */sfr PCA0CPH3 = 0xFD; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 3 - HIGH BYTE */sfr PCA0CPH4 = 0xFE; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 4 - HIGH BYTE */sfr WDTCN = 0xFF; /* WATCHDOG TIMER CONTROL *//* BIT Registers *//* TCON 0x88 */sbit TF1 = TCON ^ 7; /* TIMER 1 OVERFLOW FLAG */sbit TR1 = TCON ^ 6; /* TIMER 1 ON/OFF CONTROL */sbit TF0 = TCON ^ 5; /* TIMER 0 OVERFLOW FLAG */sbit TR0 = TCON ^ 4; /* TIMER 0 ON/OFF CONTROL */sbit IE1 = TCON ^ 3; /* EXT. INTERRUPT 1 EDGE FLAG */sbit IT1 = TCON ^ 2; /* EXT. INTERRUPT 1 TYPE */sbit IE0 = TCON ^ 1; /* EXT. INTERRUPT 0 EDGE FLAG */sbit IT0 = TCON ^ 0; /* EXT. INTERRUPT 0 TYPE *//* SCON0 0x98 */sbit SM00 = SCON0 ^ 7; /* SERIAL MODE CONTROL BIT 0*/sbit SM10 = SCON0 ^ 6; /* SERIAL MODE CONTROL BIT 1*/sbit SM20 = SCON0 ^ 5; /* MULTIPROCESSOR COMMUNICATIONENABLE */sbit REN0 = SCON0 ^ 4; /* RECEIVE ENABLE*/sbit TB80 = SCON0 ^ 3; /* TRANSMIT BIT 8*/sbit RB80 = SCON0 ^ 2; /* RECEIVE BIT 8*/sbit TI0 = SCON0 ^ 1; /* TRANSMIT INTERRUPT FLAG*/sbit RI0 = SCON0 ^ 0; /* RECEIVE INTERRUPT FLAG *//* IE 0xA8 */sbit EA = IE ^ 7; /* GLOBAL INTERRUPT ENABLE*/sbit ET2 = IE ^ 5; /* TIMER 2 INTERRUPT ENABLE*/sbit ES0 = IE ^ 4; /* SERIAL PORT INTERRUPT ENABLE*/sbit ET1 = IE ^ 3; /* TIMER 1 INTERRUPT ENABLE*/sbit EX1 = IE ^ 2; /* EXTERNAL INTERRUPT 1 ENABLE*/sbit ET0 = IE ^ 1; /* TIMER 0 INTERRUPT ENABLE*/sbit EX0 = IE ^ 0; /* EXTERNAL INTERRUPT 0 ENABLE*//* IP 0xB8 */sbit PT2 = IP ^ 5; /* TIMER 2 PRIORITY*/sbit PS = IP ^ 4; /* SERIAL PORT PRIORITY*/sbit PT1 = IP ^ 3; /* TIMER 1 PRIORITY*/sbit PX1 = IP ^ 2; /* EXTERNAL INTERRUPT 1 PRIORITY*/sbit PT0 = IP ^ 1; /* TIMER 0 PRIORITY*/sbit PX0 = IP ^ 0; /* EXTERNAL INTERRUPT 0 PRIORITY*//* SMB0CN 0xC0 */sbit BUSY = SMB0CN ^ 7; /* SMBUS 0 BUSY*/sbit ENSMB = SMB0CN ^ 6; /* SMBUS 0 ENABLE*/sbit STA = SMB0CN ^ 5; /* SMBUS 0 START FLAG*/sbit STO = SMB0CN ^ 4; /* SMBUS 0 STOP FLAG*/sbit SI = SMB0CN ^ 3; /* SMBUS 0 INTERRUPT PENDING FLAG*/sbit AA = SMB0CN ^ 2; /* SMBUS 0 ASSERT/ACKNOWLEDGE FLAG */sbit SMBFTE = SMB0CN ^ 1; /* SMBUS 0 FREE TIMER ENABLE */sbit SMBTOE = SMB0CN ^ 0; /* SMBUS 0 TIMEOUT ENABLE *//* T2CON 0xC8 */sbit TF2 = T2CON ^ 7; /* TIMER 2 OVERFLOW FLAG*/sbit EXF2 = T2CON ^ 6; /* EXTERNAL FLAG*/sbit RCLK = T2CON ^ 5; /* RECEIVE CLOCK FLAG*/sbit TCLK = T2CON ^ 4; /* TRANSMIT CLOCK FLAG*/sbit EXEN2 = T2CON ^ 3; /* TIMER 2 EXTERNAL ENABLE FLAG*/sbit TR2 = T2CON ^ 2; /* TIMER 2 ON/OFF CONTROL*/sbit CT2 = T2CON ^ 1; /* TIMER OR COUNTER SELECT*/sbit CPRL2 = T2CON ^ 0; /* CAPTURE OR RELOAD SELECT*//* PSW */sbit CY = PSW ^ 7; /* CARRY FLAG */sbit AC = PSW ^ 6; /* AUXILIARY CARRY FLAG */sbit F0 = PSW ^ 5; /* USER FLAG 0 */sbit RS1 = PSW ^ 4; /* REGISTER BANK SELECT 1 */sbit RS0 = PSW ^ 3; /* REGISTER BANK SELECT 0 */sbit OV = PSW ^ 2; /* OVERFLOW FLAG */sbit F1 = PSW ^ 1; /* USER FLAG 1 */sbit P = PSW ^ 0; /* ACCUMULATOR PARITY FLAG *//* PCA0CN D8H */sbit CF = PCA0CN ^ 7; /* PCA 0 COUNTER OVERFLOW FLAG*/sbit CR = PCA0CN ^ 6; /* PCA 0 COUNTER RUN CONTROL BIT*/sbit CCF4 = PCA0CN ^ 4; /* PCA 0 MODULE 4 INTERRUPT FLAG*/sbit CCF3 = PCA0CN ^ 3; /* PCA 0 MODULE 3 INTERRUPT FLAG*/sbit CCF2 = PCA0CN ^ 2; /* PCA 0 MODULE 2 INTERRUPT FLAG*/sbit CCF1 = PCA0CN ^ 1; /* PCA 0 MODULE 1 INTERRUPT FLAG*/sbit CCF0 = PCA0CN ^ 0; /* PCA 0 MODULE 0 INTERRUPT FLAG*//* ADC0CN E8H */sbit AD0EN = ADC0CN ^ 7; /* ADC 0 ENABLE */sbit AD0TM = ADC0CN ^ 6; /* ADC 0 TRACK MODE */sbit AD0INT = ADC0CN ^ 5; /* ADC 0 CONVERISION COMPLETEINTERRUPT FLAG */sbit AD0BUSY = ADC0CN ^ 4; /* ADC 0 BUSY FLAG */sbit AD0CM1 = ADC0CN ^ 3; /* ADC 0 START OF CONVERSION MODEBIT 1 */sbit AD0CM0 = ADC0CN ^ 2; /* ADC 0 START OF CONVERSION MODEBIT 0 */sbit AD0WINT = ADC0CN ^ 1; /* ADC 0 WINDOW COMPARE INTERRUPTFLAG */sbit AD0LJST = ADC0CN ^ 0; /* ADC 0 RIGHT JUSTIFY DATA BIT *//* SPI0CN F8H */sbit SPIF = SPI0CN ^ 7; /* SPI 0 INTERRUPT FLAG*/sbit WCOL = SPI0CN ^ 6; /* SPI 0 WRITE COLLISION FLAG*/sbit MODF = SPI0CN ^ 5; /* SPI 0 MODE FAULT FLAG*/sbit RXOVRN = SPI0CN ^ 4; /* SPI 0 RX OVERRUN FLAG*/sbit TXBSY = SPI0CN ^ 3; /* SPI 0 TX BUSY FLAG*/sbit SLVSEL = SPI0CN ^ 2; /* SPI 0 SLAVE SELECT*/sbit MSTEN = SPI0CN ^ 1; /* SPI 0 MASTER ENABLE*/sbit SPIEN = SPI0CN ^ 0; /* SPI 0 SPI ENABLE*/sbit P10 = P1^0;sbit P11 = P1^1;sbit P12 = P1^2;sbit P13 = P1^3;sbit P14 = P1^4;sbit P15 = P1^5;sbit P16 = P1^6;sbit P17 = P1^7;sbit P20 = P2^0;sbit P21 = P2^1;sbit P22 = P2^2;sbit P23 = P2^3;sbit P24 = P2^4;sbit P25 = P2^5;sbit P26 = P2^6;sbit P27 = P2^7;sbit P30 = P3^0;sbit P31 = P3^1;sbit P32 = P3^2;sbit P33 = P3^3;sbit P34 = P3^4;sbit P35 = P3^5;sbit P36 = P3^6;sbit P37 = P3^7;#endif七、调试过程及分析将编写好的源程序输入电脑,编译后呈现很多错误,这些错误有很多时平时的实验碰到过的,例如:输入的分号格式不正确,零和字母O弄混杂了,删改头文件时出现问题等等,幸好这些错误在平时的实验中碰到了,所以改错误很轻易,但同时也阐明了,平时的错误现在还在换,证实错误我还没有完整的改正,这点我以后必定要留意了,争取错误换了两次就不能在换了。