日历时钟单片机课程设计
单片机电子万年历课程设计
就时钟而言,通常可采用数码管显示。由于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。另外,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。
单片机万年历课程设计说明书
单片机万年历课程设计说明书第一章设计原理功能:电子时钟能够显示时、分、秒显示时间的功能,还可以进行时和分的校对,而且其片选的灵活性强。
并且是以单片机为核心来设计的。
28BYJ48步进电机主要技术参数如表1-1所示。
表1-1 28BYJ48步进电机主要技术参数第二章硬件电路设计总体硬件原理图如图2-1所示。
AT89C51因为其含一个可擦除的ROM,以及其存储数据的时间长度可达10年之久所以选其作为该设计的核心控制部件。
图2-1 系统电路原理图2.1键盘电路设计该设计只用了一个键盘,但实现的功能却是比较完善,减少了硬件资源的损耗,该键盘可以实现小时和分钟的调节以及控制是否进入省电模式。
当按键按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。
达到时间调节的目的。
选择的多功能按键如图2-2所示。
图2-2 多功能控制键2.2主控模块89C5189C51是一个8位单片机,片ROM全部采用FLASH ROM技术,晶振时钟为12MHz。
89C51是标准的40引脚双列直插式集成电路芯片,有4个八位的并行双向I/O端口,分别记作P0、P1、P2、P3。
第31引脚需要接高电位使单片机选用部程序存储器;第40脚为电源端VCC,接+5V电源,第20引脚为接地端VSS,通常在VCC和VSS引脚之间接0.1μF高频滤波电容。
第三章软件设计在主程序的开始定义了一组固定单元用来存储计数的分、秒、时的存储单元。
在主程序中,对不同的按键进行扫描,实现秒表,时间调整。
系统总体流程图如图4-1所示。
图3-1 总体流程图第四章系统测试本系统的软件系统主要可分为主程序、定时计数中断程序、时间调整程序、延时程序四大模块。
在程序设计过程中,加强了部分软件抗干扰措施,下面对部分模块作介绍。
系统开始仿真的仿真图如图4-1系统仿真图所示。
单片机课程设计实验报告(时钟、日历)..
基于单片机的电子钟设计目录第一章电子时钟设计--—--—----————-—-—-—----—-—-——-——21.1 设计原理简介--————-—----—---——---———-----——-—-—-—21.2 设计功能-——--—-—————-———-—----————---——--——-——---—3第二章主要电路元器件介绍-—-———-———-—------———---32。
1 STC89C52 单片机简介—--—--—-—-—-—-—-—---—-——-———32。
1.1 单片机简介--——--——--——---—-—--————----—————--——-—-32。
1.2 主要特性---——-------—---—-—---————-—--—--———-—-—-—32.1.3 管脚功能说明—---———-———-———-——---—-————-—-—-—-————42.1。
4 LCD1602-—------——---—--—-——--———--——------——-—-—5第三章单元电路的硬件设计—-----————————————————--63.1 硬件原理框图—-———--—--——---—--—-—---------—--———-—-63。
2 单片机 STC89C52 系统的设计-—-—-—-—-————-—————-—----63。
3 时钟电路—————-----———-—---—-——---—--—-—-—-—--————--73.4 复位电路-----——-——--———-————-———-—----———---—--—-—-------—-—--—-——---—-—————-—---——--73。
5 键盘接口电路--—---—-———--—--——--——--——----———---——-83.6 LCD1602显示——---——————--—-—-——--——----—----———-————8第四章设计总原理图—-—-—---——-----—-———-9 第五章心得体会---—-------—————--——-—-——9第六章源程序---—-—-——-—-------———---—-——————-——----10前言:摘要数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便.由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
单片机课程设计--基于51单片机的万年历
单片机课程设计--基于51单片机的万年历单片机课程设计基于 51 单片机的万年历一、引言在现代生活中,时间的准确记录和显示对于我们的日常生活和工作具有重要意义。
万年历作为一种能够同时显示年、月、日、星期、时、分、秒等信息的设备,给人们带来了极大的便利。
本次课程设计旨在利用 51 单片机实现一个简单实用的万年历系统。
二、系统设计方案(一)硬件设计1、单片机选型选择经典的 51 单片机,如 STC89C52 单片机,其具有性能稳定、价格低廉、资源丰富等优点,能够满足本设计的需求。
2、显示模块采用液晶显示屏(LCD1602)作为显示设备,能够清晰地显示数字和字符信息。
3、时钟芯片选用DS1302 时钟芯片,它可以提供精确的实时时钟数据,包括年、月、日、星期、时、分、秒等。
4、按键模块设置三个按键,分别用于调整时间、选择调整项(年、月、日、时、分、秒等)以及切换显示模式(正常显示和设置模式)。
(二)软件设计1、主程序流程系统初始化后,首先读取 DS1302 中的时间数据,并将其显示在LCD1602 上。
然后进入循环,不断检测按键状态,根据按键操作进行相应的时间调整和显示模式切换。
2、时间读取与显示程序通过与 DS1302 进行通信,读取实时时间数据,并将其转换为适合LCD1602 显示的格式进行显示。
3、按键处理程序检测按键的按下状态,根据不同的按键执行相应的操作,如调整时间、切换显示模式等。
三、硬件电路设计(一)单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。
晶振电路为单片机提供时钟信号,复位电路用于系统初始化时将单片机的状态恢复到初始值。
(二)显示电路LCD1602 显示屏通过数据总线和控制总线与单片机相连。
数据总线用于传输要显示的数据,控制总线用于控制显示屏的读写操作和显示模式。
(三)时钟电路DS1302 时钟芯片通过串行通信接口与单片机进行通信。
单片机通过发送特定的指令和数据,对 DS1302 进行读写操作,获取或设置时间信息。
电子实时时钟万年日历系统-单片机课程设计(含电路图、流程图、汇编语言)
一、题目:电子实时时钟/万年日历系统二、功能要求:1.基本要求:⑴显示准确的北京时间(时、分、秒),可用24小时制式;⑵随时可以调校时间。
2.发挥要求:⑴增加公历日期显示功能(年、月、日),年号只显示最后两位;⑵随时可以调校年、月、日;⑶允许通过转换功能键转换显示时间或日期。
三、方案考虑:1、硬件方案:⑴显示器采用6位LED数码管(共阳),可分别显示时间或日期。
⑵显示器的驱动采用动态扫描电路形式,以达到简化电路的目的。
但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。
可采用74LS244或者晶体管;其中74ls244是用来驱动段选码,晶体管是驱动位选码。
⑶采用“一键多用方案”,以减少按键数目。
本方案采用了4按键。
⑷整体上要考虑:结构简单、布局美观、操作方便、成本低廉。
2、设计电路图如下:3、元件清单:(我们使用的是TX-1C开发板)⑴ 89C52 1个⑵IC座(40脚) 3个(其中1个用于接插89C51、2个用于接插LED段数码管)。
⑶ 74LS244 1个(用于驱动6个共阳的LED段数码管)。
⑷ IC座(20脚) 1个(用于接插74LS244)。
(5)显示器:LED_8段数码管(共阳型)6个三极管:(6)PNP(8550)6个(用于驱动6个共阳型LED段数码管)。
(7)微型开关:3个(其中1个用于复位电路、其它用于键盘)。
(8)晶体振荡器(12MHz):1个(用于振荡电路)。
(9)电阻器:⑴ 3KΩ 1个(用于系统复位电路)。
⑵ 1KΩ 6个(用作PNP三极管基极电阻)。
⑶ 100Ω 7个(驱动器用作74LS244输出限流电阻)。
(10)电容器:⑴ 10μF1个(用于系统复位电路)。
⑵ 30 pF 2个(用于系统振荡电路)。
(11)其它:⑴万能电路板(10×15):1块⑵焊锡条: 2米⑶带插头、座的电源端子: 1条⑷各种颜色外皮的导线:各1米(12)工具:1.电烙铁:1把2.剪钳:1把3.镊子:1把4.万用表:1个(13)设备:编程器(MEP300或TOP851)6个4、软件方案:(1)使用全汇编编写(2)时钟基准时间由单片机内部定时中断来提供,定时时间应该乘以一个整数得到,且不宜太长或太短,最长不能超过16位定时器的最长定时时间,最短不能少于定时中断服务程序的执行时间。
基于单片机的日历设计方案
基于单片机的日历设计方案基于单片机的日历设计方案一、设计背景随着社会的发展,人们的生活节奏越来越快,很容易忽略一些重要的时间节点。
为了方便人们管理时间,并准确地知道日期和时间,设计一款基于单片机的日历是很有必要的。
二、设计目标本设计方案旨在设计一款简单易用、功能全面的基于单片机的日历,具有日期显示、时间显示、闹钟设置等功能。
三、设计方案1. 硬件设计:(1)单片机选择:选择一款具有丰富外设和易于编程的单片机,如STC89C52系列。
(2)显示模块:选择具有较大尺寸和清晰度的液晶显示屏作为日期和时间显示模块。
(3)输入设备:选择合适的按键开关作为用户输入设备,用于设置日期、时间和闹钟等参数。
(4)控制电路:根据单片机引脚接口和外设引脚的要求设计相应的控制电路,实现单片机与显示模块、输入设备的连接和控制。
2. 软件设计:(1)主控程序设计:编写主控程序,主要包括日期和时间的自动更新、闹钟的设置和响铃、功能菜单和参数设置等功能。
(2)日期和时间显示:通过单片机控制液晶显示屏以特定的格式显示当前日期和时间。
(3)闹钟设置:利用按键开关在特定的时间设定闹钟,并在设定的时间到达时触发闹钟响铃。
(4)功能菜单和参数设置:通过按键开关选择不同的功能菜单,如日期设置、时间设置、闹钟设置等,然后根据要求进行参数设置。
四、预期效果该基于单片机的日历设计方案具有以下预期效果:1. 简单易用:用户可以通过按键进行日期、时间和闹钟等参数的设置。
2. 功能全面:可以显示日期、时间,并且具备闹钟设置和响铃的功能。
3. 可靠稳定:硬件电路稳定可靠,软件程序运行准确无误。
五、实施计划1. 准备所需材料和器件,并组装硬件电路。
2. 编写单片机控制程序,实现主控功能。
3. 测试硬件电路和软件程序,确保功能正常。
4. 对设计进行优化和完善,改善用户体验。
5. 编写设计文档,总结设计经验。
六、总结本设计方案基于单片机的日历设计,具备日期显示、时间显示、闹钟设置等功能,能够方便人们管理时间,并提醒重要的时间节点。
基于51单片机电子闹钟或万年历的设计课程设计(精)
目录目录 (1)1.项目背景 (3)1.1 项目研究的目的和意义 (3)1.2课题研究的内容 (3)2.方案的选择和和论证 (4)2.1 单片机型号的选择 (4)2.2 按键的选择 (4)2.3 显示器的选择 (4)2.4 计时部分的选择 (5)2.5 发音部分的设计 (5)2.6电路设计最终方案 (5)3. AT89C52单片机简介 (6)3.1单片机基本特性 (6)3.2单片机内部结构图 (6)3.3 单片机I/O引脚结构 (6)3.3.1 P0口 (6)3.3.2 P1口 (7)3.3.3 P2口 (7)3.3.4 P3口 (7)3.4单片机最小系统板 (8)4. 数字电子钟的设计原理和方法 (9)4.1 设计原理 (9)4.2 硬件电路的设计 (9)4.2.1 DS1302时钟芯片 (9)4.2.2 1602 液晶简介 (11)4.2.3 蜂鸣器驱动电路 (12)4.2.4 独立键盘电路 (13)5.软件部分的设计 (14)5.1程序流程图 (14)5.1.1 系统总流程图 (14)5.1.2 DS1302时钟程序流程图 (15)5.1.3 LCD显示程序流程图 (16)5.2程序的设计 (17)5.2.1 DS1302读写程序 (17)5.2.2液晶显示程序 (17)7.心得体会 (20)参考文献 (21)附录一系统原理图 (22)附录二系统程序 (23)1.项目背景1.1 项目研究的目的和意义20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间等造成的。
#日历时钟单片机课程设计(附汇编程序+方案图+模块图+ddb模拟图)
;山东科技大学信电通信07-1 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 ;秒的最低位地址LED 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 AD1,#37HMOV AD2,#22HMOV AD3,#0CHMOV AD4,#08HMOV AD5,#08HMOV AD6,#08H ;初始化时间为12:34:56,日期为08年08月08日MOV IE,#82H ;允许T0中断MOV TMOD,#01H ;T0允许工作MOV TH0,#4CHMOV TL0,#00H ;送入计数初值0.05sMOV 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 ;判断是否加12MOV A,AD3ADD A,#MOV 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.05秒,共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,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: ; 延迟防抖250ms MOV R4,#0FAHLOOP8: LCALL DY1MSDJNZ R4,LOOP8RETDY1MS: ; 延迟防抖1ms MOV R5,#0B0HLOOP7: MOV R7,#2AHDJNZ R7,$DJNZ R5,LOOP7RET;键盘扫描子程序TEST: MOV R7,#08HSETB P1.7CLR P1.7 ;低电平锁存NOPNOPSETB P1.7 ;高电平输出MOV A,#0FFHAGAIN3: CLR P2.3NOPNOPMOV C, P3.5 ;把p3.5的状态存入CSETB P2.3RLC A ;键盘状态存入ADJNZ R7,AGAIN3 ;扫描八个按键RETTAB:DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,09H;子程序功能索引:;TEST——扫描键盘;DDISP——显示;NEXTS——重新赋初值;DY1MS——延迟防抖1msEND。
单片机课程设计报告 日历与数字钟
封面一.课程设计报告内容:1、课题名称及封面:2、课程设计任务书;3、总体设计方案;4、硬件设计:介绍本系统所选用的各种芯片功能、引脚、相应的命令控制字格式等,绘出硬件接线图;各子模块电路图、需要用到的芯片及工作原理描述;5、软件设计:有程序设计的思路;介绍本系统的主程序、子程序、和终端服务的程序流程图;带有注释的程序清单;6、验证过程及结果、现象:完整的功能测试图、测试过程和结果说明、以及过程中出现的问题以及解决的方案,如有仿真则附仿真截图;7、结束语:简书课程设计的收获、体会以及本教学环节的课程意见与建议;8、参考文献二、课程设计报告格式要求:1、A4纸打印输出,左侧装订。
2、报告内容一级标题四号宋体加粗,其他标题小四号宋体加粗,正文小四宋体;3、行距无文档网格1.5倍行距,页边距左2.5cm,上、下、右2cm;4、正文加页码靠右,顺序1、2、3…。
5、标题左侧顶格排版,正文首行缩进2字符。
6、必须有硬件系统总体组成方框图,程序必须先有流程图,各种情况实物测试图,硬件工作现象照片贴图等,图表都要有图名表名,图名位于图片下方居中,表名位于表格上方居中,图名表名及图表中的文字都用小五号宋体。
正文中内容每页排版满页,下方不能留有空行,结尾除外。
一.课程设计任务与具体内容 1. 题目与内容:日历和数字钟的设计与实现:(1)数字钟:时、分,小时用二十四进制,分钟用六十进制显示。
(2)每月日历为30天,并显示星期几。
(3)可用1602液晶显示屏显示所有功能。
(4)有清零的功能,且能够对小时、分钟进行调整(校时)。
(5)具有整点、半点报时功能,整点用声音次数报时,半点特殊声音报时。
二.硬件设计9、硬件设计:介绍本系统所选用的各种芯片功能、引脚、相应的命令控制字格式等,绘出硬件接线图;各子模块电路图、需要用到的芯片及工作原理描述;1.硬件接线图图2.1 51单片机硬件接线图接线时,需要用到51单片机与1602液晶屏。
- 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弄混杂了,删改头文件时出现问题等等,幸好这些错误在平时的实验中碰到了,所以改错误很轻易,但同时也阐明了,平时的错误现在还在换,证实错误我还没有完整的改正,这点我以后必定要留意了,争取错误换了两次就不能在换了。