日历时钟单片机课程设计

合集下载

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

单片机电子万年历课程设计
1.1.2、显示电路
就时钟而言,通常可采用数码管显示。由于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。另外,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章内容;- 硬件连接与程序下载;- 程序调试与优化;- 团队合作、沟通交流。

单片机课程设计之万年历、闹钟与温度显示设计

单片机课程设计之万年历、闹钟与温度显示设计
根据方案的选择,数码管时钟温度系统由51单片机、时钟芯片DS1302、测温芯片DS1802、数码管显示电路、键盘电路组成,如图3-1所示。
本系统采用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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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弄混杂了,删改头文件时出现问题等等,幸好这些错误在平时的实验中碰到了,所以改错误很轻易,但同时也阐明了,平时的错误现在还在换,证实错误我还没有完整的改正,这点我以后必定要留意了,争取错误换了两次就不能在换了。

相关文档
最新文档