单片机综合设计
- 格式:doc
- 大小:303.00 KB
- 文档页数:19
第一章单片机/ISP综合设计实验装置简介1.1 概述由于计算机科学和电路集成技术的迅猛发展,电子系统日趋数字化、复杂化和大规模集成化,且电子系统设计原理和大型软件设计的原理极为接近。
这些都要求电子类专业的教学重点应由传统的基础功能模块设计转向对大规模复杂系统的分析和管理,加强对学生系统概念的培养。
电子信息系列实验装置便是为了满足这种需要而开始研发的。
它包含有电子技术实验装置,计算机组成/网际服务实验装置,微机系统与接口实验装置及单片机/ISP综合设计实验装置。
该系列实验装置提供了集演示、验证和综合设计的新一代教学平台,并按照教学大纲的要求配置了实验项目和实验内容,此外,用户还可根据自己的需要安排实验内容,发挥创造性才能。
单片机技术是一门很实用的技术,单片机在工业控制中独占鳌头,故又称为微控制器。
迄今为止,8位单片机仍占有单片机市场的60%以上份额,促进了8位单片机朝着高性能和多功能化方向发展。
随着CPLD技术的不断发展,也越来越被广大设计人员重视、应用。
单片机/ISP综合设计实验装置实质上是构建了一个以CPLD/FPGA和MCU为中心,能与微机子系统进行通信的综合设计实验平台,它采用的是CPLD/FPGA和MCU双系统核心架构,再与外围设备通过总线方式连接起来。
可以完成有关单片机,微机接口,逻辑设计等众多实验,可作为“计算机结构与逻辑设计”,“单片机原理与应用”,“在系统编程技术”,“VHDL 设计”,“微型计算机测控技术”和“电子系统综合设计”等课程的综合实验装置。
该实验装置在教学实践中的应用,为提高学生的动手能力,加深学生对单片机、CPLD/FPGA技术的理解提供了良好的实验平台,为以后电子系统设计开发打下坚实的基础。
除具有单片机,CPLD/FPGA双系统核心构架外,提供了极其丰富的功能单元电路,如A/D、D/A、RTC及通讯接口等,并可根据学生应用的需要方便地扩展其它电路,使其完全能够做出具有复杂性和创造性的综合性实验,另外配置的一些工具模块也能为学生做实验提供方便。
单片机综合实验课程设计一、课程目标知识目标:1. 学生能理解单片机的基本工作原理,掌握其内部结构和功能模块;2. 学生能掌握单片机编程的基本语法和常用指令,具备编写简单程序的能力;3. 学生能了解并运用单片机接口技术,实现与外围设备的通信和控制。
技能目标:1. 学生能运用所学知识,设计并实现简单的单片机控制系统;2. 学生能熟练使用编程软件和开发工具,进行单片机的程序编写、调试与优化;3. 学生能通过实验操作,培养动手能力和团队协作能力,提高问题解决能力。
情感态度价值观目标:1. 学生通过课程学习,增强对电子技术和编程的兴趣,培养主动探索和创新的意识;2. 学生在学习过程中,树立正确的价值观,认识到单片机技术在现实生活中的应用价值;3. 学生通过团队协作,培养沟通与协作能力,增强集体荣誉感和责任感。
课程性质:本课程为单片机原理与应用的综合实验课程,注重理论与实践相结合,以培养学生的动手能力和创新能力为主。
学生特点:学生具备一定的电子技术和编程基础,对单片机有一定了解,但实践经验不足。
教学要求:教师应结合学生特点和课程性质,采用任务驱动、案例教学等方法,引导学生主动参与实验,提高实践操作能力和创新能力。
同时,注重个体差异,因材施教,确保每位学生都能在课程中学有所获。
通过课程目标的分解与实现,为后续教学设计和评估提供依据。
二、教学内容本课程教学内容主要包括以下三个方面:1. 单片机原理与结构- 熟悉单片机的内部结构,掌握其功能模块;- 了解单片机的工作原理,理解指令执行过程;- 学习单片机编程语言,掌握基本语法和常用指令。
教学大纲:参照教材第1章至第3章,共计6学时。
2. 单片机编程与接口技术- 学习单片机程序设计方法,掌握程序编写、调试与优化技巧;- 了解单片机接口技术,掌握I/O口、定时器、中断等应用;- 学习外围设备与单片机的通信协议,实现数据交换和控制。
教学大纲:参照教材第4章至第6章,共计10学时。
xxxxxx大学课程设计报告课程设计名称:单片机系统综合课程设计课程设计题目:电子时钟院(系):专业:班级:学号:姓名:指导教师:完成日期:xxxxxx大学课程设计报告目录第1章总体设计方案 (1)1.1设计原理 (1)1.2设计思路 (1)1.3实验环境 (2)第2章详细设计方案 (3)2.1硬件电路设计 (3)2.2主程序设计 (3)2.3功能模块的设计与实现 (4)第3章结果测试及分析 (11)3.1结果测试 (11)3.2结果分析 (11)参考文献 (12)附录 A (13)附录 B (21)附录 C (22)第1章总体设计方案1.1 设计原理根据课程设计任务书的内容,要求实现在MCS51单片机上对数字电子钟的基本功能设计,对当前时间正确显示,并可根据需要对时间进行更改,以完成时间的校对和闹钟的设置。
时钟时间以时、分、秒在6位数码管上显示,小时以24小时计时模式,分秒均为60进位。
用6MHz晶振产生振荡脉冲,定时器进行秒计时。
调整设置时间的过程运用可编程键盘上的按键进行控制,共设有5个按键,首先按键A进入校时模式或E进入闹钟模式,再分别按键B对小时或C分钟进行更改,每按键一次数码管计数显示加一,更改结束后按键D退出设置,时钟正常显示。
闹钟时间到时,蜂鸣器鸣响10秒后时钟正常显示。
1.2 设计思路采用C语言程序设计结合硬件电路设计方法,利用Lab6000实验箱来实现数字电子钟的设计。
1)提出方案根据设计要求,可将本次设计分为3个模块进行:1)时钟显示模块:主要用于时间的正确显示。
2)校时模块:此模块用于时钟的校对,以完成用户更改时间的需求。
3)闹钟模块:用于实现闹钟的时间设置和定点闹铃的功能。
2)方案论证时钟显示模块中,利用可编程定时器中断进行秒计时,将时间显示在6位数码管上。
校时模块主要利用键盘上5个键的控制完成各项功能,并在数码管上动态显示改变结果,完成设置后进入时钟显示模块。
闹钟模块的设置过程与校时模块相似,但设置完成进入时间显示模块后则等待闹铃时间,到规定时间后,通过数码管闪烁及蜂鸣器的鸣响来实现定点闹铃提醒功能。
单片机综合实训教案一、教学目标1. 了解单片机的基本概念、结构和原理。
2. 掌握单片机的编程方法和应用技巧。
3. 能够独立完成单片机系统的设计和调试。
二、教学内容1. 单片机概述单片机的定义和发展历程单片机的结构和组成部分2. 单片机编程基础单片机的指令系统编程语言和开发工具程序结构和编程规范3. 单片机应用系统设计系统需求分析硬件选型和电路设计软件设计和编程4. 单片机系统调试与优化调试方法和工具常见问题和解决方案系统性能优化技巧5. 单片机应用案例解析温度控制器设计智能家居系统设计控制系统设计三、教学方法1. 讲授法:讲解单片机的基本概念、原理和编程方法。
2. 实践法:动手操作单片机开发板,进行编程和系统设计。
3. 案例分析法:分析实际应用案例,理解单片机的应用场景。
4. 讨论法:分组讨论,解决实际问题和难点。
四、教学资源1. 教材:单片机原理与应用2. 实验设备:单片机开发板、编程器、调试器等3. 软件工具:Keil、MPLAB等编程软件4. 在线资源:相关教程、案例和答疑论坛五、教学评价1. 平时成绩:考察学生的出勤、提问和讨论情况。
2. 实验报告:评估学生的实践操作能力和编程水平。
3. 课程设计:评价学生的系统设计和调试能力。
4. 期末考试:测试学生对单片机知识的掌握程度。
六、教学安排1. 课时:共计32课时,其中理论讲授16课时,实验操作16课时。
2. 教学计划:第1-4课时:单片机概述及结构原理第5-8课时:单片机编程基础第9-12课时:单片机应用系统设计第13-16课时:单片机系统调试与优化第17-20课时:单片机应用案例解析第21-24课时:实践操作与实验第25-28课时:课程设计第29-32课时:期末复习与考试七、教学重点与难点1. 教学重点:单片机的基本概念、结构和原理。
单片机的编程方法和应用技巧。
单片机系统的设计、调试与优化。
2. 教学难点:单片机指令系统的理解与应用。
硬件电路设计与故障排除。
单片机综合实验课程设计一、课程目标知识目标:1. 学生能理解单片机的基本原理,掌握其内部结构及相关功能模块的使用方法。
2. 学生能掌握单片机编程的基本语法和技巧,能独立完成简单的程序设计。
3. 学生能了解单片机在现实生活中的应用,并学会分析实际案例。
技能目标:1. 学生能运用所学知识,完成单片机的基本操作和程序编写。
2. 学生能通过实验,学会使用相关开发工具和调试技巧,具备一定的故障排查能力。
3. 学生能运用单片机技术解决实际问题,提高创新实践能力。
情感态度价值观目标:1. 学生通过单片机综合实验课程,培养对电子信息科学的兴趣和热情。
2. 学生在团队协作中,学会沟通、分享和合作,提高解决问题的能力。
3. 学生能认识到单片机技术对社会发展的作用,树立正确的价值观和责任感。
课程性质:本课程为实践性课程,侧重于培养学生的动手能力和创新能力。
学生特点:学生已具备一定的单片机基础知识,对实际操作感兴趣,但编程能力和问题解决能力有待提高。
教学要求:结合学生特点,注重理论与实践相结合,强调动手实践和团队协作,提高学生的综合能力。
通过课程目标分解,使学生在知识、技能和情感态度价值观方面取得具体的学习成果,为后续教学设计和评估提供依据。
二、教学内容本课程教学内容主要包括以下几部分:1. 单片机基础理论:回顾单片机的基本原理、内部结构、工作原理等,重点讲解中断系统、定时器/计数器、串行通信等模块的功能和应用。
2. 单片机编程语言:以C语言为基础,介绍单片机编程的基本语法、数据类型、运算符、控制语句等,并通过实例进行讲解。
3. 单片机实验操作:结合教材章节,进行以下实验:- 基本输入输出实验:学习单片机I/O口控制,实现LED灯、蜂鸣器等设备的控制。
- 中断控制实验:掌握中断系统的使用,实现外部中断控制。
- 定时器/计数器实验:学习定时器/计数器的配置,完成定时控制等功能。
- 串行通信实验:了解串行通信原理,实现单片机之间的数据传输。
单片机课程设计实验报告设计题目:基于单片机的多功能综合应用系统的设计专业:电子信息工程班级:姓名:指导老师:目录第一章设计说明1.1 设计目的 (3)1.2 设计内容及要求 (3)第二章硬件电路仿真实现2.1 硬件结构分析 (5)2.2基本功能仿真电图 (6)2.3扩展功能仿真电路图 (10)2.4 实物电路图 (15)第三章软件设计实现3.1软件程序内容 (16)3.2模块分析 (16)3.3 程序流程图 (17)第四章系统测试4.1 软件调试 (19)4.2硬件调试 (19)第五章心得体会 (20)第六章参考文献 (21)附录 (21)第一章设计说明1.1 设计目的单片机在许多领域使用十分广泛,如智能仪器仪表、实时工控、通讯设备、导航系统、家用电器等。
各科任老师们经常说“学好单片机,工作就不成问题了。
”可见学好单片意义之重大。
单片机作为一门基础学科,既是对前期学习C语言的综合运用,也是理论与实践相结合的一大体现。
本次课程设计通过基础部分,拓展功能以及整体电路的实现能很好地锻炼我们的动手及编程能力。
1.2 设计内容及要求内容:1.设计并实现具有复位功能的单片机小系统。
2.利用单片机进行灯光的场景开关控制、循环点亮控制、花样变化控制及速度变化控制(如:左右循环、扩散收缩式移动、流星雨、舞台灯光综合效果、名曲名句跟随显示等。
至少应做两项:前两项选一并有速度变化控制功能,后三项选一或自创特色花样)。
3. 炫彩音乐显示(依据3秒以上某名曲名句,模拟高、中、低音三分频,彩色LED随音频变化而起伏显示的效果,进一步地,LED 亮度跟随音乐响度闪烁)。
4.利用单片机进行灯光的色彩连续变化效果控制。
5.利用单片机进行灯光的三色联动定时控制(以交通灯为例)。
(说明:3、4中二选一,1、2、5必选)6. 配合2至5项中功能,实现液晶屏输出功能或状态信息。
7. 以调节5或4项中的时间为例实现基于4X4键盘的输入功能。
51单片机设计实例
1. 电子钟:使用51单片机设计一个数字时钟,可以显示小时和分钟,并能够设置闹钟功能。
2. 温度监控器:使用51单片机设计一个温度监控器,可以实时监测当前温度,并根据设定的阈值发出警报。
3. 电子秤:使用51单片机设计一个电子秤,可以精确测量物体的重量,并显示在LCD屏幕上。
4. 电子门锁:使用51单片机设计一个电子门锁系统,可以使用密码或者指纹进行解锁,并记录进出门的时间。
5. 智能家居控制器:使用51单片机设计一个智能家居控制器,可以通过手机APP控制家庭中的灯光、空调、窗帘等设备。
6. 智能车:使用51单片机设计一个智能车,可以根据传感器检测到的环境信息进行自主导航和避障。
7. 电子琴:使用51单片机设计一个简单的电子琴,可以通过按键发出不同的音符。
8. 电子游戏机:使用51单片机设计一个简单的电子游戏机,可以玩一些简单的游戏如打砖块、赛车等。
9. 电子宠物:使用51单片机设计一个虚拟宠物,可以通过按钮和
显示屏与宠物进行互动,喂食、玩耍等。
10. 无线遥控器:使用51单片机设计一个无线遥控器,可以控制电视、空调、音响等家电设备。
大连理工大学本科设计报告题目:基于7290的LED时钟系统设计课程名称:单片机综合设计学院(系):电子信息与电气工程学部专业:电子信息工程班级电子0804学号:200801204学生姓名:宋陆阳成绩:2011 年05 月23 日题目:基于7290的LED时钟系统设计1 设计要求1)显示功能:a.用开关K1\K2切换用8位数码管显示当前“时-分-秒”;b.用开关K1\K2切换用8位数码管显示当前“年-月-分”;c.用开关K1\K2切换用8位数码管显示报警“日.时-分”。
2)修改功能:a.能够通过按键操作修改当前时、分、秒并显示;b.能够通过按键操作修改报警时、分并显示。
3)错误提示功能:当输入修改值不符合时间合法数值时即时大于24,分大于60,秒大于60,提示"Error"错误,并返回正常走表。
4)报警功能:a.整点报时功能:59分55秒开始每秒响一下,且00秒频率提高;b.定时报警:当当前走表时间与所设置的报警时间一致时,驱动蜂鸣器产生“.XI.DUO.”的铃音进行定时报警。
2 设计分析及系统方案设计1.主程序结构:无限循环结构.完成初始化功能:进行7290复位,初始化PCF8563T的时间数据,对中断INT0,INT1进行工作方式设置,开中断,并进入无限循环且等待中断产生.2.中断INT0:顺序结构每秒钟PCF8567的CLKOUT产生一个中断,从PCF8563T中读入数据进行调整拆分送入内存,时钟秒加一并显示,当K1=1,K2=1时,8位数码管显示当前“时-分-秒”;当K1=0时,8位数码管显示当前“年-月-分”;K1=1,K2=0时,8位数码管显示报警“日.时-分”.判断当前时间是否为整点,若是,则从59分55秒开始每秒钟驱动蜂鸣器每秒响1000HZ铃音0.5秒,00秒频率提高;判断当前时间是否与所设置报警时间相同,若满足要求,则驱动蜂鸣器产生一个“.XI.DUO.”的铃声。
3.中断INT1:顺序结构当有按键操作时产生中断。
读取键值,当按链介于“A—E”选择需修改的内容:A:修改当前时间“时”;B:修改当前时间“秒”;C:修改当前时间“分”;D:修改报警时间“时”;E:修改报警时间“分”,然后等待输入2次按键"0-9"所修改数据,当输入数据部符合时间格式时,即时大于24,分大于60,秒大于60,显示提示“Error”并返回主程序,当输入数据符合正常时间格式时,回显,并退出中断;若输入其它键则无操作退出中断.3 系统电路图ZLG7290BPCF8563T4 外围接口模块硬件电路功能描述P3.2接PC8567的CLKOUT,每秒产生一次中断;P3.3接ZLG7290B,当有按键操作时产生中断;P1.3接蜂鸣器;P1.2接开关K1,选择切换显示当前“时分秒”或“年月日”;P1.4接开关K2,选择切换显示当前时间或报警“日时分”;P1.7接ZLG7290复位键;P1.0接I2C通讯线SDA;P1.1接I2C通讯线SCK。
89C51:89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。
89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。
89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
ZLG7290B:ZLG7290B是广州周立功单片机发展有限公司自行设计的数码管动态显示驱动、建键盘扫描管理芯片。
能够驱动8位共阴极结构的LED数码管或64位独立的LED,同时还能扫描管理多达64个按键(S1-S56、F0-F7)的扫描识别。
其中8只健(F0-F7)可以作为功能键使用就像电脑键盘上的Ctrl、Shift、Alt键一样。
另外ZLG7290B 内部还设置有连击计数器,能够使某些按键按下后不松手而连续有效。
接口采用I2C结构。
该芯片为工业级芯片,被广泛运用于仪器仪表等工业测量领域的电路设计中。
特点:直接驱动1英寸以下的8位LED共阴极数码管或独立的64位LED ;能够管理多达64只按键。
具有自动去抖,其中8只按键可直接作为功能键使用;段电流可达20mA。
位电流可达100mA以上;利用外接功率驱动器可以驱动一英寸以上的大型数码管;具有闪烁、段点亮、段熄灭、功能键、连击计数等功能;提供10种数字、21种字母的译码显示功能,也可以将字形码写入显示寄存器直接显示数据;系统仅使用键盘电路时,工作电流为1mA;与主控器之间采用I2C 接口,仅需两条信号线;工作电压范围:+3.3~+5.5V;工作温度范围:-40℃~+85℃;封装:DIP24(窄体) 或SOP-24.PCF8563T:PCF8563T 是低功耗CMOS实时时钟/日历芯片,它具有一个可编程的时钟输出,一个中断输出和掉电检测电路,与外部主控器之间通过I2C总线连接。
最大总线速度为400KHZ。
每次对其的读写操作内部的地址寄存器都会自动产生增量。
PCF8563T内部具有16个8位的寄存器;一个可自动增量的地址寄存器;一个32.768KHZ的振荡器(具有集成的补偿电容),一个用与为实时时钟RTC提供时钟源的分频器;一个可编程的时钟输出电路;一个定时器;一个报警器;一个掉电检测电路和一个400KHZ的I2C总线接口5 主程序中主要变量定义变量名称RAM单元/寄存器功能当前时间值10H-1DH 程序初始时存储初始时间,当运行后存当前时间PC8563时间20H-29H 存储从PC8563中读出当前的时间参数当前时间1 30H-37H 存储处理无效位后当前日、月、年信息当前时间2 38H-3FH 存储处理无效位后当前秒、时、分信息报警时间40H-47H 存储处理无效位后报警日、时、分信息Data 50H-57H 存储“Error”的查表信息数据个数R7 I2C操作时读入数据个数目标地址R0 I2C操作时目标数据块首址器件地址R2 I2C操作时器件内部从地址写地址R3 I2C写操作时地址读地址R4 I2C读操作时地址6 系统软件中各个子程序的功能描述子程序名称入口参数出口参数功能描述INT_RCT 无无走表中断子程序,并且判断整点闹铃以及报警INT_7290 无无按键中断子程序,修改当前“时分秒”或者报警“时分”可以进行输入错误提示,回显等功能ALARM 无无产生0.5秒1000HZ音频ALARM1 R5、R6 无产生指定频率音频0.5秒CHAFEN 20H-2AH 30H-47H 对20H-2AH数据进行拆分CF A R3、R4 把A拆分成独立BCD码ADJUST 20H-26H 20H-26H 屏蔽PCF8563读出无关位DIS_ERR 无无LED显示“Error”RDKEY 无 A 读按键值WR8563 写8563操作DELAY 无无延时子程序7主程序程序流程图主程序开辟一个数据区10H-1DH存储时间、data-data+7存储显示命令参数将10H-1DH存储时间、命令参数送PCF8563T中等待中断主程序流程图A 键?查询按键?按键定义 A 键:修改小时 B 键:修改分; C 键:修改秒;D 键:修改按键时;E 键:修改按键分;YYNYINT1 读取键值查询按键?N读取键值 送小时的位RETINC 键?B 键?当前分钟处理( 同小时 处理 )当前秒处理 ( 同小时 处理 )开中断YN关中断YYN 调拆分、查表送28H-2FH送7290调显示N将51的10H-1DH 的数据送PCF8563TD 键?报警时处理 ( 同小时 处理 )D 键?报警时处理 ( 同小时 处理 )NYYN 数据合法NY读取键值 送小时的时位数据合法YN按键中断INT_7290调程序显示"Error"终端服务INT0 闹铃1000HZ,0.5ms ALARM:8 程序清单SDA BIT P1.0 ;定义I2C 信号引脚 SCL BIT P1.1 WSLA EQU 070H RSLA EQU 071HDISDA EQU 20H ;源数据块首地址DISCON EQU 08H ;写入数据个数 DATA_1 EQU 50H ;变量区首地址WSLA_8563 EQU 0A2H ;PCF8563口地址 RSLA_8563 EQU 0A3HWSLA_7290 EQU 70H ;ZLG7290口地址 RSLA_7290 EQU 71H ORG 8000HLJMP 8100HYYY利用RDADD 从PCF8563T 中读出时间参数送20H-2AH利用ADJUST 屏蔽掉参数中的无用的位 中断服务调CHAFEN 子程序将时间分别送28H-2FH 、38H-3FH缓冲区P1.2=1?RETI显示时分秒显示年月日NY报警时间到整点时间到P1.4=1?显示报警日时分产生报警闹铃产生整点闹铃YYNNN程序入口 PUSH PSW PUSH 07H T0.T1初始化 R7←10 启动T0.T1TF0=1?T0初值,TF0←0驱动BUZZTF1=1?T1初值,TF1←0R7-1→R7关闭T0.T1 POP 07HPOP PSWNNORG 8003HLJMP INT_RCTORG 8100HORG 8013HLJMP INT_7290ORG 8100HSTART: MOV SP,#60HCLR P1.7 ;7290复位LCALL DELAYSETB P1.7;***********************************************************;设定PCF8563的时间和命令参数(参数和控制命令缓冲区10H-1DH);*********************************************************** MOV 10H,#00H ;启动控制字MOV 11H,#1FH ;设置报警及定时器中断MOV 12H,#55H ;秒单元MOV 13H,#37H ;分单元MOV 14H,#10H ;小时单元MOV 15H,#26H ;日期单元MOV 16H,#03H ;星期单元MOV 17H,#05H ;月单元MOV 18H,#10H ;年单元MOV 19H,#36H ;设定分报警MOV 1AH,#10H ;设定小时报警MOV 1BH,#26H ;设定日报警MOV 1CH,#03H ;设定星期报警MOV 1DH,#83H ;设定CLKOUT的频率(1S)MOV DATA_1, #13H ;变量缓冲区(显示 "Error " )MOV DATA_1+1,#13H ;注意:MOV DATA_1+2,#13H ;变量取值范围0-FMOV DATA_1+3,#11HMOV DATA_1+4,#12HMOV DATA_1+5,#11HMOV DATA_1+6,#11HMOV DATA_1+7,#10H;************************************************************ MOV R7,#0EH ;写入参数个数(时间和控制字)MOV R0,#10H ;参数和控制命令缓冲区首地址MOV R2,#00H ;从器件内部从地址MOV R3,#WSLA_8563 ;准备向PCF8563T写入数据串LCALL WRNBYT ;写入时间、控制命令到8563SETB EAMOV TCON,#00HSETB EX0CLR IT0SETB EX1SETB IT1SJMP $ ;等待中断;************************************************************* ; 中断服务INT_RCT子程序;*************************************************************** INT_RCT:MOV R7,#0AH ;读出数个数MOV R0,#20H ;目标数据块首址MOV R2,#02H ;从器件内部从地址MOV R3,#WSLA_8563MOV R4,#RSLA_8563;准备读PCF8563T的时间参数LCALL RDADD ;调读数据子程序,将读出的数据;存放于单片机20-26H中LCALL ADJUST ;调时间调整子程序MOV 12H,20HMOV 13H,21HMOV 14H,22HMOV 19H,27HMOV 1AH,28HMOV 1BH,29HLCALL CHAFEN ;调拆分子程序(包含查表)MOV A,22H ;判断是否到定时时间CJNE A,28H,MMBUYMOV A,21HCJNE A,27H,MMBUYMOV A,#00HCJNE A,20H,MJ_1MOV R5,#21HMOV R6,#0F9HCALL ALARM1MJ_1: MOV A,#01HCJNE A,20H,MJ_2MOV R5,#0E0HMOV R6,#0F9HCALL ALARM1MJ_2: MOV A,#02HCJNE A,20H,MJ_3MOV R5,#8BHMOV R6,#0FAHCALL ALARM1MJ_3: MOV A,#03HCJNE A,20H,MJ_4MOV R5,#0D7HMOV R6,#0FAHCALL ALARM1MJ_4: MOV A,#04HCJNE A,20H,MJ_5MOV R5,#67HMOV R6,#0FBHCALL ALARM1MJ_5: MOV A,#05HCJNE A,20H,MJ_6MOV R5,#0E8HMOV R6,#0FBHCALL ALARM1MJ_6: MOV A,#06HCJNE A,20H,MJ_7MOV R5,#5BHMOV R6,#0FCHCALL ALARM1MJ_7: MOV A,#07HCJNE A,20H,MMBUYMOV R5,#8EHMOV R6,#0FCHCALL ALARM1MMBUY: MOV A,#59H ;判断是否整点CJNE A,21H,LCMOV A,#55HCJNE A,20H,LC_1LCALL ALARMLC_1: MOV A,#56HCJNE A,20H,LC_2CALL ALARMLC_2: MOV A,#57HCJNE A,20H,LC_3CALL ALARMLC_3: MOV A,#58HCJNE A,20H,LC_4CALL ALARMLC_4: MOV A,#59HCJNE A,20H,LCCALL ALARMLC: MOV A,#00HCJNE A,21H,LCCCJNE A,20H,LCCMOV R5,#44HMOV R6,#0FEHCALL ALARM1LCC: MOV R7,#08HMOV R2,#10HMOV R3,#WSLA_7290JNB P1.2,YEARS ;使用P1.2控制显示内容JNB P1.4,BAOJINMOV R0,#38H ;显示小时、分钟和秒SJMP DISPYEARS: MOV R0,#30H ;显示年、月和日期SJMP DISPBAOJIN: MOV R0,#40HDISP: LCALL WRNBYT ;调7290显示JNB P3.2,$RETI;************************************************************** ;ALARM;************************************************************** ALARM: PUSH PSW ;产生0.5秒1000HZ音频PUSH 07HMOV TMOD,#11HMOV TL0,#33HMOV TH0,#0FEHMOV TL1,#0FCHMOV TH1,#4BHSETB TR0SETB TR1LOOPC: JNB TF0,$MOV TL0,#33HMOV TH0,#0FEHCLR TF0CPL P1.3JB TF1,LOOPCMOV TL1,#0FCHMOV TH1,#4BHCLR TF1DJNZ R7,LOOPCCLR TR0CLR TR1POP 07HPOP PSWRETALARM1:PUSH PSW ;产生指定频率音频0.5秒PUSH 07HMOV TMOD,#11HMOV TL0,R5MOV TH0,R6MOV TL1,#0FCHMOV TH1,#4BHSETB TR0SETB TR1LOOPD: JNB TF0,$MOV TL0,R5MOV TH0,R6CLR TF0CPL P1.3JB TF1,LOOPDMOV TL1,#0FCHMOV TH1,#4BHCLR TF1DJNZ R7,LOOPDCLR TR0CLR TR1POP 07HPOP PSWRET;************************************************************ ;各子程序;************************************************************* ORG 8300HCHAFEN: PUSH PSW ;对20H-2AH单元的参数拆分, PUSH ACC ;查表后送28H-2FH(年月日)PUSH 03H ;和38H-3FH (时分秒)PUSH 04HMOV A,20H ;取秒参数LCALL CF ;拆分、查表在R4(H)、R3中MOV 38H,R3 ;送秒的个位MOV 39H,R4 ;送秒的十位MOV 3AH,#02H ;送分隔符-MOV A,21H ;取分参数LCALL CF ;拆分、查表在R4(H)、R3中MOV 3BH,R3 ;送分的个位MOV 3CH,R4 ;送分的十位MOV 3DH,#02H ;送分隔符-MOV A,22H ;取小时参数LCALL CF ;拆分、查表在R4(H)、R3中MOV 3EH,R3 ;送小时的个位MOV 3FH,R4 ;送小时的十位MOV A,23H ;取日起参数LCALL CFMOV A,R3ORL A,#01HMOV R3,AMOV 30H,R3MOV 31H,R4MOV A,25H ;取月参数LCALL CFMOV A,R3ORL A,#01HMOV R3,AMOV 32H,R3MOV 33H,R4MOV A,26H ;取年参数LCALL CFMOV A,R3ORL A,#01HMOV R3,AMOV 34H,R3MOV 35H,R4MOV 36H,#0FCH ;年的高两位处理MOV 37H,#0DAHMOV A,27H ;报警分LCALL CFMOV 40H,R3MOV 41H,R4MOV 42H,#02HMOV A,28H ;报警时LCALL CFMOV 43H,R3MOV 44H,R4MOV 45H,#01MOV A,29H ;报警日LCALL CFMOV 46H,R3MOV 47H,R4POP 04HPOP 03HPOP ACCPOP PSW;******************************************************************* CF: PUSH 02H ;将A中的数据拆分为两个独立的PUSH DPH ; BCD码并查表PUSH DPL ; 结果分别存于R4、R3中MOV DPTR,#LEDSEGMOV R2,AANL A,#0FHMOVC A,@A+DPTRMOV R3,AMOV A,R2SWAP AANL A,#0FHMOVC A,@A+DPTRMOV R4,APOP DPLPOP DPHPOP 02HRET;*******************************************************************;将20H -26H中从PCF8563中读出的7个字节参数的无关位屏蔽掉(参见表8.7);******************************************************************* ADJUST: PUSH ACCMOV A,20H ;处理秒单元ANL A,#7FHMOV 20H,AMOV A,21H ;处理分单元ANL A,#7FHMOV 21H,AMOV A,22H ;处理小时单元ANL A,#3FHMOV 22H,AMOV A,23H ;处理日期单元ANL A,#3FHMOV 23H,AMOV A,24H ;处理星期单元ANL A,#07HMOV 24H,AMOV A,25H ;处理月单元ANL A,#1FHMOV 25H,APOP ACCRET;*************************************************************;中断服务INT_7290子程序;***************************************************************INT_7290:PUSH 00HPUSH 02HPUSH 03HPUSH 04HPUSH 07HPUSH ACCPUSH PSWLCALL RDKEY ;读取第一个按键值(功能键)CJNE A,#0AH,MINUTE ;判断是A键吗?;是A键时开始处理小时数据AKEY_1: JB P3.3,$ ;以查询的方式等待下一次按键操作LCALL RDKEY ;读取第二个按键值(小时的十位数?SWAP A ;处理输入的数据(十位)CJNE A,#00H,X_1SJMP XXX_1: CJNE A,#10H,X_2SJMP XXX_2: CJNE A,#20H,X_3SJMP XXX_3: LJMP DIS_ERRXX: ANL 14H,#0FHORL 14H,AJB P3.3,$ ;以查询的方式等待下一次按键操作LCALL RDKEY ;读取第三个按键值(小时的个位数)CJNE A,#00H,Y_1LJMP YYY_1: CJNE A,#01H,Y_2LJMP YYY_2: CJNE A,#02H,Y_3LJMP YYY_3: CJNE A,#03H,Y_4LJMP YYY_4: CJNE A,#04H,Y_5LJMP YYY_5: LJMP DIS_ERRYY: ANL 14H,#0F0H ;处理输入的数据(个位)ORL 14H,ALCALL WR8563LJMP BACKMINUTE: CJNE A,#0BH,SECOND ;判断是B键吗?是B键时开始处理分数据AKEY_2: JB P3.3,$ ;以查询的方式等待下一次按键操作LCALL RDKEY ;读取第二个按键值(分钟的十位数?SWAP A ;处理输入的数据(十位)CJNE A,#00H,Z_1SJMP ZZZ_1: CJNE A,#10H,Z_2SJMP ZZZ_2: CJNE A,#20H,Z_3SJMP ZZZ_3: CJNE A,#30H,Z_4SJMP ZZZ_4: CJNE A,#40H,Z_5SJMP ZZZ_5: CJNE A,#50H,Z_6SJMP ZZZ_6: LJMP DIS_ERRZZ: ANL 13H,#0FHORL 13H,AJB P3.3,$ ;以查询的方式等待下一次按键操作LCALL RDKEY ;读取第三个按键值(分钟的个位数)ANL 13H,#0F0H ;处理输入的数据(个位)ORL 13H,ALCALL WR8563 ;将修改后的时间参数送PCF8563LJMP BACKSECOND: CJNE A,#0CH,HOUR_1 ;判断是C键吗?是C键时开始处理秒数据AKEY_3: JB P3.3,$ ;以查询的方式等待下一次按键操作LCALL RDKEY ;读取第二个按键值(秒的十位数?SWAP A ;处理输入的数据(十位)CJNE A,#00H,Q_1SJMP QQQ_1: CJNE A,#10H,Q_2SJMP QQQ_2: CJNE A,#20H,Q_3SJMP QQQ_3: CJNE A,#30H,Q_4SJMP QQQ_4: CJNE A,#40H,Q_5SJMP QQQ_5: CJNE A,#50H,Q_6SJMP QQQ_6: LJMP DIS_ERRQQ: ANL 12H,#0FHORL 12H,AJB P3.3,$ ;以查询的方式等待下一次按键操作LCALL RDKEY ;读取第三个按键值(秒的个位数)ANL 12H,#0F0H ;处理输入的数据(个位)ORL 12H,ALCALL WR8563 ;将修改后的时间参数送PCF8563LJMP BACKHOUR_1: CJNE A,#0DH,MIN_1 ;判断是D键吗?;是D键时开始处理报警小时数据AKEY_4: JB P3.3,$ ;以查询的方式等待下一次按键操作LCALL RDKEY ;读取第二个按键值(小时的十位数?SWAP A ;处理输入的数据(十位)CJNE A,#00H,E_1SJMP EEE_1: CJNE A,#10H,E_2SJMP EEE_2: CJNE A,#20H,E_3SJMP EEE_3: LJMP DIS_ERREE: ANL 1AH,#0FHORL 1AH,AJB P3.3,$ ;以查询的方式等待下一次按键操作LCALL RDKEY ;读取第三个按键值(小时的个位数)CJNE A,#00H,F_1LJMP FFF_1: CJNE A,#01H,F_2LJMP FFF_2: CJNE A,#02H,F_3LJMP FFF_3: CJNE A,#03H,F_4LJMP FFF_4: CJNE A,#04H,F_5LJMP FFF_5: LJMP DIS_ERRFF: ANL 1AH,#0F0H ;处理输入的数据(个位)ORL 1AH,ALCALL WR8563SJMP BACKMIN_1: CJNE A,#0EH,BACK ;判断是E键吗?;是E键时开始处理报警分数据AKEY_5: JB P3.3,$ ;以查询的方式等待下一次按键操作LCALL RDKEY ;读取第二个按键值(分钟的十位数?SWAP A ;处理输入的数据(十位)CJNE A,#00H,S_1SJMP SSS_1: CJNE A,#10H,S_2SJMP SSS_2: CJNE A,#20H,S_3SJMP SSS_3: CJNE A,#30H,S_4SJMP SSS_4: CJNE A,#40H,S_5SJMP SSS_5: CJNE A,#50H,S_6SJMP SSS_6: LJMP DIS_ERRSS: ANL 19H,#0FHORL 19H,AJB P3.3,$ ;以查询的方式等待下一次按键操作LCALL RDKEY ;读取第三个按键值(分钟的个位数)ANL 19H,#0F0H ;处理输入的数据(个位)ORL 19H,ALCALL WR8563 ;将修改后的时间参数送PCF8563SJMP BACKBACK: CJNE A,#0FH,DOWNDOWN: CLR IE0 ;清标志POP PSWPOP ACCPOP 07HPOP 04HPOP 03HPOP 02HPOP 00HRETI;***************************************************; DISPAY "Error";***************************************************DIS_ERR:PUSH 07HPUSH 00HPUSH 01HPUSH 02HPUSH 03HMOV DPTR,#LEDSEG ;开始对变量查表MOV R7,#DISCON ;写入数据个数MOV R0,#DISDA ;源数据块首地址MOV R1,#DATA_1LOOP1: MOV A,@R1MOVC A,@A+DPTR ;查表得对应的字形码MOV @R0,A ;送显示缓冲区INC R1INC R0DJNZ R7,LOOP1MOV 28H,#00HLOOP: MOV R7,#DISCONMOV R2,#10HMOV R3,#WSLAMOV R0,#DISDALCALL WRNBYT ;调显示子程序LCALL DELAYLCALL DELAYPOP 03HPOP 02HPOP 01HPOP 00HPOP 07HSJMP DOWN;*********************************************************; 读键值子程序(;出口参数累加器A---获取到的键值);*********************************************************RDKEY: MOV R0,#1FH ;键值缓冲单元MOV R7,#01H ;取一个数据(键值)MOV R2,#01H ;指向内部数据键值寄存器地址MOV R3,#WSLA_7290 ;取器件地址(写)MOV R4,#RSLA_7290 ;取器件地址(读)LCALL RDADD ;读出7290的01H单元中的键值MOV A,1FH ;取健值送缓冲单元DEC ARET;****************************************************************** ; 向日历芯片写入时间参数子程序;将RAM的10H-1DH中的时间参数(含控制字)写入芯片的00H-0DH单元;****************************************************************** WR8563: MOV R7,#0EH ;写入参数个数(时间和控制字)MOV R0,#10H ;参数和控制命令缓冲区首地址MOV R2,#00H ;从器件内部从地址MOV R3,#WSLA_8563 ;准备向PCF8563T写入数据串LCALL WRNBYT ;写入时间、控制命令到8563RET ;******;***************************************************************** LEDSEG: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4HDB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHDB 9EH,18H,3AH,00H ;E,r,o;******************************************************************* ; 延时子程序;******************************************************************* DELAY: PUSH 00HPUSH 01HMOV R0,#00HDELAY1: MOV R1,#00HDJNZ R1,$DJNZ R0,DELAY1POP 01HPOP 00HRET;**********************************************************;由汇编语言编制的I2C通讯子程序;**********************************************************;通用的I2C通讯子程序(多字节写操作);入口参数R7字节数,R0:源数据块首地址;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写);*********************************************************** WRNBYT: PUSH PSWPUSH ACCWRADD: MOV A,R3 ;取外围器件地地址(包含r/w=0)LCALL STA ;发送起始信号SLCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应MOV A,R2LCALL WRBYT ;发送内部寄存器首地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应答不正确返回重来WRDA: MOV A,@R0LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应答不正确返回重来INC R0DJNZ R7,WRDALCALL STOPPOP ACCPOP PSWRET;*******************************************************************;(2)带有内部单元地址的多字节读操作子程序 RDADD;*******************************************************************;通用的I2C通讯子程序(多字节读操作);入口参数R7字节数;;R0目标数据块首地址;R2从器件内部子地址;;R3器件地址(写);R4器件地址(读);WRBYT、STOP、CACK、STA、MNACK;******************************************************************* RDADD: PUSH PSW ;从PCF8563的02H单元读入7个参数PUSH ACC ;存放于20H-26H单元RDADD1: LCALL STAMOV A,R3 ;取器件地址(写)LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来MOV A,R2 ;取内部地址LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来LCALL STAMOV A,R4 ;取器件地址(读)LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来RDN: LCALL RDBYTMOV @R0,ADJNZ R7,ACKLCALL MNACKLCALL STOPPOP ACCPOP PSWRETACK: LCALL MACKINC R0SJMP RDN;3)I2C各个信号子程序;********************************************************************** ; 启动信号子程序S;********************************************************************** STA: SETB SDA ;启动信号SSETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPCLR SDANOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLRET;********************************************************************** ; 停止信号子程序P;********************************************************************** STOP: CLR SDA ;停止信号PSETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPSETB SDANOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLCLR SDARET;********************************************************************** ; 应答信号子程序 MACK;********************************************************************** MACK: CLR SDA ;发送应答信号ACKSETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLSETB SDARET;********************************************************************** ; 非应答法信号子程序MNACK;********************************************************************** MNACK: SETB SDA ;发送非应答信号NACKSETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLCLR SDARET;********************************************************************** ; 应答检测子程序CACK;********************************************************************** CACK: SETB SDA ;应答位检测子程序SETB SCLCLR F0MOV C,SDA ;采样SDAJNC CEND ;应答正确时转CENDSETB F0 ;应答错误时F0置一CEND: CLR SCLRET;********************************************************************** ; 发送一个字节子程序WRBYT;********************************************************************** WRBYT: PUSH 06HMOV R6,#08H ;发送一个字节子程序WLP: RLC A ;(入口参数A)MOV SDA,CSETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLDJNZ R6,WLPPOP 06HRET;********************************************************************** ; 接收一个字节子程序RDBYT;********************************************************************** RDBYT: PUSH 06HMOV R6,#08H ;接收一个字节子程序RLP: SETB SDASETB SCL; *******************************************NOP ;!!!!!产生大于15微秒的延时!!!!!!NOP ;注意这是专门为ZLG7290NOP ;添加的20微秒延时部分NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOP; ********************************************MOV C,SDAMOV A,R2RLC AMOV R2,ACLR SCLDJNZ R6,RLP ;(出口参数R2)POP 06HRETEND9 系统调试运行结果说明、分析所出现得问题,设计体会与建议系统调试硬件环境:单片机综合仿真实验仪型号:DP-51PROC51仿真器型号:TKSMonitor系统调试软件环境:KeilC51 μVsion2系统设计语言:汇编语言系统调试中遇到的主要问题和解决方法:1,整点报时:当判断分为59秒为55秒时进行报时,但是00秒总地法有响声,后来发现是因为当00秒时,分已经不再是59,无法进入判断的程序,增加00,00报时后即解决了问题;2,存储区交叉:因为定义变量增多,把报警以及其修改功能增加以后,对报警时间进行处理拆分需占用内存,与原程序定义的内存区存在重叠,因为修改报警时间后回显的数是随机的,虽然已经将更改后的数字写入,不过依然会被覆盖,更改内存地址后即正常了,不过还是不太明白这个是不是随机的。