51单片机课程设计源程序
MCS51单片机原理及嵌入式系统应用课程设计 (2)

MCS51单片机原理及嵌入式系统应用课程设计一、课程设计背景嵌入式系统是一个以计算机技术为基础,集成了计算机硬件和软件系统的设备。
随着信息技术的飞速发展,嵌入式系统已经成为各种各样产品的重要组成部分,如家电、汽车、医疗器械等。
因此,对嵌入式系统的研究和开发也变得越来越重要。
MCS51是一种被广泛应用于嵌入式系统设计的单片机。
MCS51拥有稳定的性能和丰富的硬件资源,同时使用起来也非常方便。
在本课程设计中,我们将探究MCS51单片机的原理以及其在嵌入式系统中的应用,旨在帮助学生更好地理解嵌入式系统,提高其技能水平,为未来就业做好准备。
二、课程设计内容2.1 MCS51单片机原理MCS51单片机由CPU、存储器、输入输出接口及其它外设组成。
本部分内容主要包括以下几个方面:•MCS51的CPU结构和工作原理•存储器及存储器扩展方式•输入输出接口及其应用•定时器和中断控制器的原理2.2 嵌入式系统应用MCS51单片机在嵌入式系统中的应用非常广泛,包括控制电路、仪器设备、工业控制等领域。
本部分内容将侧重于MCS51单片机在嵌入式系统中的具体应用,主要包括以下几个方面:•定时器的应用•中断的应用•A/D转换的应用•串口通信的应用•基于MCS51的嵌入式系统设计案例2.3 课程设计实践课程设计实践环节是本设计的重点部分。
学生将按照以下流程完成实践:•组建小组,编写嵌入式系统设计方案•搭建硬件平台,包括MCS51单片机和相关外设•编写程序,完成设计方案的实现•测试程序,调试错误并进行优化三、课程设计评估本课程设计采用绩效考核制度。
学生将分小组完成课程设计,小组成员之间责任明确,根据完成情况和实现效果,将对小组进行绩效评估。
评估方案主要从以下方面考虑:•设计方案的合理性•实现方案的正确性及完整性•程序的优化程度及代码质量四、总结本课程设计旨在通过MCS51单片机的原理和应用让学生更好地理解嵌入式系统的设计和开发过程。
51单片机毕业课程设计功率因数计

51单片机毕业课程设计功率因数计(完整版)51单片机毕业课程设计—功率因数计1. 概述本文档介绍了一种基于51单片机的毕业课程设计方案,即功率因数计。
本设计旨在实现对电网中功率因数的测量和监控,从而提高电能的利用效率。
2. 设计原理本设计主要基于功率因数的定义和计算公式来实现。
功率因数定义为有功功率与视在功率之比,通过测量电网中的电压和电流,并使用适当的算法进行计算,可以获得功率因数的数值。
3. 硬件设计3.1 电路元件本设计所需的电路元件包括:- 51单片机- 电流传感器- 电压传感器- 显示屏3.2 电路连接将电流传感器和电压传感器连接到51单片机的相应引脚上,以实时获取电流和电压值。
通过数字转模拟转换器(DAC)将获取的模拟数据转换为数字形式,然后使用适当的算法计算功率因数,并将结果显示在显示屏上。
4. 软件设计4.1 主程序流程主程序的流程如下:1. 初始化电路连接和显示屏。
2. 循环执行以下步骤:- 读取电流和电压值。
- 使用计算公式计算功率因数。
- 将计算结果显示在显示屏上。
3. 结束程序。
4.2 算法设计本设计中使用的算法主要是根据功率因数的计算公式进行计算。
具体步骤如下:1. 读取电流和电压值。
2. 使用下述公式计算功率因数:- 功率因数 = 有功功率 / 视在功率3. 将计算结果保存,并根据需要进行显示或记录。
5. 总结本文档介绍了一种基于51单片机的毕业课程设计方案,即功率因数计。
通过测量电流和电压,并使用适当的算法进行计算,可以实现对电网中功率因数的测量和监控。
该设计有助于提高电能的利用效率,具有一定的实用性和应用前景。
51单片机期末课程设计

51单片机期末课程设计一、课程目标知识目标:1. 理解并掌握51单片机的基本原理和结构组成,包括内部资源、指令系统及编程方法。
2. 学会使用51单片机的开发工具和编程环境,如Keil C及ISP下载线。
3. 掌握51单片机在嵌入式系统中的应用,能够阅读并分析相关电路图。
技能目标:1. 能够独立设计并编写简单的51单片机程序,实现基础的外围设备控制,如LED灯、蜂鸣器等。
2. 能够运用所学的知识解决实际的51单片机编程问题,进行基本的程序调试和故障排查。
3. 通过课程设计项目,培养动手实践能力和团队协作能力。
情感态度价值观目标:1. 培养学生对于电子技术和编程的兴趣,激发其主动探索和创新的热情。
2. 增强学生的工程意识,培养严谨、细致、负责的学习态度和职业素养。
3. 通过课程学习,使学生认识到技术对生活的影响,增强社会责任感和使命感。
本课程针对高年级学生,在已有电子技术和C语言编程基础的前提下,进一步深化对51单片机的理解与应用。
课程性质为理论与实践相结合,强调知识的应用性和实践性。
在教学过程中,注重培养学生的自主学习和问题解决能力,以项目驱动教学,确保学生能够达到预设的学习成果。
通过期末课程设计,巩固所学知识,提高综合运用能力。
二、教学内容本课程教学内容紧密围绕课程目标,结合教材以下章节展开:1. 51单片机原理概述:包括内部结构、工作原理、资源分布等,重点理解时钟电路、复位电路的作用。
- 教材章节:第1章 51单片机基础2. 51单片机指令系统与编程:学习汇编语言编程,掌握常用指令,理解程序执行流程。
- 教材章节:第2章 51单片机指令系统与编程3. 开发工具使用:介绍Keil C集成开发环境和ISP下载线的使用方法,学会创建、编译、下载程序。
- 教材章节:第3章 51单片机开发工具4. 外围设备控制:学习51单片机与LED灯、蜂鸣器、数码管等外围设备的接口与编程控制。
- 教材章节:第4章 51单片机外围设备编程5. 传感器应用:结合实际案例,学习传感器与51单片机的连接和数据处理。
51单片机课程设计报告

51单片机课程设计报告一、课程目标知识目标:1. 理解51单片机的硬件结构、工作原理及其功能特点;2. 学会使用51单片机的指令系统进行程序设计;3. 掌握51单片机与外围电路的接口技术,能实现简单的硬件控制功能;4. 了解51单片机在嵌入式系统中的应用及发展趋势。
技能目标:1. 能够运用C语言编写51单片机的程序,实现基础控制功能;2. 能够运用仿真软件对51单片机程序进行调试,分析并解决简单问题;3. 能够设计简单的51单片机硬件系统,进行电路连接和功能测试;4. 培养学生的动手能力、创新能力和团队协作能力。
情感态度价值观目标:1. 培养学生对电子技术的兴趣,激发学习热情;2. 培养学生严谨、务实的科学态度,提高自主学习能力;3. 培养学生关注社会发展,了解科技在生活中的应用,增强社会责任感;4. 培养学生团队合作精神,尊重他人意见,善于沟通交流。
课程性质:本课程为实践性较强的电子技术课程,以51单片机为核心,结合硬件和软件,培养学生的实际操作能力和创新能力。
学生特点:学生具备一定的电子技术基础知识,对单片机有一定了解,但实践经验不足。
教学要求:结合学生特点,注重理论与实践相结合,强调动手实践,提高学生的实际操作能力和解决问题的能力。
通过课程学习,使学生能够独立完成简单的51单片机控制系统设计。
二、教学内容根据课程目标,教学内容分为以下几个部分:1. 51单片机硬件结构及原理- 熟悉51单片机的内部结构、引脚功能;- 掌握51单片机的工作原理及性能特点。
2. 51单片机指令系统与编程- 学习51单片机的指令集,理解各指令的功能和使用方法;- 掌握C语言在51单片机编程中的应用。
3. 51单片机外围接口技术- 学习51单片机与常见外围电路(如LED、LCD、键盘等)的接口技术;- 掌握外围设备的控制原理及编程方法。
4. 仿真软件的使用- 学习使用Keil、Proteus等仿真软件进行51单片机程序设计和调试;- 掌握仿真软件的操作方法,提高程序调试效率。
简单51单片机课程设计

简单51单片机课程设计一、课程目标知识目标:1. 理解51单片机的基本结构、工作原理及功能特点;2. 学会使用51单片机的开发环境,掌握相关编程语言及语法;3. 掌握51单片机外围电路的连接方法,了解常见传感器的使用;4. 掌握51单片机在实际应用中的调试与优化方法。
技能目标:1. 能够运用51单片机编写简单的程序,实现基本的功能;2. 能够分析并解决51单片机在实际应用中出现的问题;3. 能够运用所学知识,设计并实现简单的51单片机控制系统;4. 培养学生的动手能力、创新能力和团队协作能力。
情感态度价值观目标:1. 培养学生对单片机及嵌入式系统的兴趣,激发学习热情;2. 培养学生严谨、求实的科学态度,养成良好的学习习惯;3. 培养学生具备积极向上的心态,面对困难和挑战时保持乐观;4. 培养学生具备团队协作精神,学会与他人共同解决问题。
本课程针对初中学段学生,结合课程性质、学生特点和教学要求,明确以上课程目标。
通过本课程的学习,学生将能够掌握51单片机的基本知识和技能,培养实际应用能力,同时培养良好的情感态度价值观。
后续教学设计和评估将围绕这些具体的学习成果展开。
本章节教学内容依据课程目标,紧密结合教材,确保科学性和系统性。
具体教学内容如下:1. 51单片机基础知识:介绍51单片机的结构、原理及功能特点,包括内部资源、外部接口等,对应教材第一章。
2. 开发环境与编程语言:学习51单片机的开发环境搭建,掌握C语言编程基础,包括数据类型、运算符、控制语句等,对应教材第二章。
3. 基本I/O口操作:学习51单片机I/O口编程,实现LED灯、蜂鸣器等基本控制,对应教材第三章。
4. 中断与定时器:介绍中断系统、定时器原理及应用,学会编写中断服务程序,对应教材第四章。
5. 外围电路与传感器:学习51单片机与外围电路的连接方法,了解常见传感器的工作原理及使用,对应教材第五章。
6. 实际应用案例分析:分析51单片机在实际应用中的案例,如温度控制系统、智能家居等,对应教材第六章。
基于51单片机的课程设计

-探索51单片机在智能家居中的应用,如家居环境监测与控制;
-介绍并实践51单片机与蓝牙模块的连接,实现无线数据通信;
-分析并设计一个简易的抢答器系统,涉及按键扫描、状态机设计等;
-结合课堂所学,开展创新设计竞赛,鼓励学生自主设计并实现具有实际应用价值的单片机控制系统。
-开展综合实训,要求学生团队协作,完成一个综合性的单片机控制系统设计,如智能家居控制系统,提升学生的实际操作能力和项目实践能力。
-汇编语言程序设计
- C语言程序设计
3.《单片机原理与应用》第六章:51单片机的I/O接口及应用
- I/O口的控制方法
-基本输入/输出应用实例
4.《单片机原理与应用》第七章:51单片机的定时器/计数器与中断系统
-定时器/பைடு நூலகம்数器的工作原理及应用
-中断系统的原理及应用
5.《单片机原理与应用》第八章:51单片机的串行通信
-串行通信的原理
-串行通信接口的编程与应用
本章节将以上述内容为基础,结合实际案例,引导学生掌握51单片机的原理、编程及应用。
2、教学内容
本节课程设计将具体包括以下教学内容:
- 51单片机的最小系统构成及其功能分析;
-基本I/O口操作,实现LED灯的闪烁与控制;
-定时器/计数器的编程,实现精确延时及脉冲产生;
5、教学内容
-专题讨论:51单片机在工业控制中的应用,如自动化生产线上的传感器数据采集与处理;
-介绍并实践51单片机与各类传感器(如温湿度、光照、红外等)的接口技术;
-深入讲解51单片机的电源管理,探讨低功耗设计方法;
-通过项目案例,学习如何使用51单片机进行数据加密与解密,增强系统安全性;
MCS51单片机原理及嵌入式系统应用2007年版课程设计
MCS51单片机原理及嵌入式系统应用2007年版课程设计一、课程设计背景MCS51单片机是一种广泛使用的嵌入式系统芯片,它具有体积小、功能丰富、易于编程等特点。
因此,MCS51单片机在工业控制、电子设备、通信等领域得到广泛应用。
为了培养学生的嵌入式系统设计能力,提高学生的实践能力,本课程设计旨在让学生深入了解MCS51单片机的原理,学习其编程技术,掌握嵌入式系统的设计和应用。
二、课程设计目标本课程设计的主要目标是:•理解MCS51单片机的基本原理和结构;•掌握MCS51单片机的编程技术,包括指令系统、寄存器、中断等;•运用MCS51单片机设计和实现简单的嵌入式系统,如LED灯控制、温度测量、蜂鸣器控制等。
三、课程设计内容3.1 原理部分1.MCS51单片机概述–单片机的定义和历史–MCS51单片机的特点和应用范围2.MCS51单片机的硬件结构–CPU、存储器、I/O控制器、定时器等模块–内存映射和端口地址3.MCS51单片机的指令系统–指令结构和格式–常用指令介绍4.MCS51单片机的中断系统–中断的概念和原理–中断的类型和优先级–编程实现中断处理程序3.2 编程部分1.MCS51单片机的汇编语言–汇编语言的概述和特点–MCS51单片机的汇编语言语法2.MCS51单片机的编程工具–Keil C51集成环境–编译、烧录和调试技术3.MCS51单片机的编程实践–简单的LED灯控制–温度测量和显示–蜂鸣器的控制和实现四、课程设计要求1.学生需主动参与课程设计过程,积极探索MCS51单片机的原理和编程技术;2.学生需按时提交实验报告,并在班级或教师指导下进行课程设计展示;3.学生可以结合自身兴趣和实际需求,开发嵌入式系统应用,如智能家居、智能车载、工业自动化等,实现MCS51单片机技术的应用。
五、实验器材和设备1.MCS51单片机开发板2.LED灯、电阻、电容、温度传感器等元器件3.Keil C51集成环境软件六、课程设计评价本课程设计评价主要从以下几个方面考虑:1.设计的难度是否适合本课程水平;2.报告和展示是否清晰明了,实验结果是否准确;3.学生在课程设计过程中的主动性和创新性。
51单片机温度课程设计
51单片机温度课程设计一、课程目标知识目标:1. 理解51单片机的结构与原理,掌握温度传感器与单片机的连接方法;2. 学会编写程序,实现温度的采集、处理和显示;3. 了解温度控制系统的基本原理及其在实际应用中的重要性。
技能目标:1. 能够正确使用万用表、编程器等工具,进行单片机与温度传感器的连接;2. 掌握C语言编程,实现温度数据的采集、处理和显示;3. 能够分析温度控制系统的性能,提出优化方案。
情感态度价值观目标:1. 培养学生动手实践能力,激发创新精神,增强解决实际问题的自信心;2. 培养团队合作精神,提高沟通与协作能力;3. 增强学生对我国电子产业的了解,提高国家认同感和自豪感。
课程性质:本课程为实践性较强的课程,结合理论教学,注重培养学生的动手能力和实际操作技能。
学生特点:学生具备一定的电子基础知识,对单片机有一定了解,但实际操作经验不足。
教学要求:教师需采用讲解、示范、指导相结合的教学方法,引导学生主动参与实践,提高学生的实际操作能力。
同时,注重培养学生分析问题和解决问题的能力,达到学以致用的目的。
通过本课程的学习,使学生能够将所学知识应用于实际项目中,为未来的职业发展打下坚实基础。
二、教学内容1. 理论知识:- 51单片机基础知识:介绍51单片机的结构、工作原理及特点;- 温度传感器原理:讲解温度传感器的工作原理、种类及其与单片机的连接方法;- C语言编程:复习C语言基础知识,重点讲解与51单片机相关的编程技巧。
2. 实践操作:- 硬件连接:指导学生使用万用表等工具,完成温度传感器与51单片机的连接;- 软件编程:编写程序实现温度数据采集、处理和显示,通过实践操作熟悉编程过程;- 系统调试:分析温度控制系统的性能,引导学生提出优化方案并进行调试。
3. 教学大纲:- 第一周:51单片机基础知识学习,了解温度传感器原理;- 第二周:C语言编程复习,学习与51单片机相关的编程技巧;- 第三周:进行硬件连接,学习温度传感器与单片机的连接方法;- 第四周:编写程序,实现温度数据采集、处理和显示;- 第五周:系统调试,分析性能并提出优化方案。
51单片机相关课程设计
51单片机相关课程设计一、课程目标知识目标:1. 理解51单片机的硬件结构,掌握其工作原理;2. 学习并掌握51单片机的指令系统,能进行基本的编程操作;3. 了解并掌握51单片机在嵌入式系统中的应用。
技能目标:1. 能够运用C语言编写简单的51单片机程序,实现基础功能;2. 学会使用仿真软件对51单片机程序进行调试,解决常见问题;3. 能结合实际需求,设计并实现简单的51单片机控制系统。
情感态度价值观目标:1. 培养学生对电子技术及编程的兴趣,激发其创新意识;2. 培养学生团队协作精神,使其在项目实践中学会沟通与分享;3. 强化学生的工程意识,使其认识到技术对社会发展的作用。
课程性质:本课程为实践性较强的课程,旨在帮助学生将理论知识与实际应用相结合,培养其动手能力和创新能力。
学生特点:学生处于高年级阶段,已具备一定的电子技术和编程基础,对单片机有一定了解,但实践经验不足。
教学要求:结合学生特点,注重理论与实践相结合,通过项目驱动教学,使学生在实践中掌握知识,提高技能。
同时,关注学生的情感态度价值观培养,引导其形成积极的学习态度和正确的价值观。
将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容1. 51单片机硬件结构及原理:介绍51单片机的内部结构,包括CPU、存储器、I/O口、定时器等模块,分析其工作原理及相互关系。
相关教材章节:第一章 51单片机概述与硬件结构2. 51单片机指令系统及编程:讲解51单片机的指令集,学习C语言编程基础,编写简单的程序实现基础功能。
相关教材章节:第二章 51单片机指令系统与编程3. 仿真软件使用与程序调试:学习使用Keil、Proteus等仿真软件,进行51单片机程序的编写、编译、调试及下载。
相关教材章节:第三章 51单片机程序开发与调试4. 51单片机应用实例:分析并实践51单片机在嵌入式系统中的应用,如温度控制、灯光调节等。
相关教材章节:第四章 51单片机应用实例5. 课程项目实践:分组进行项目实践,设计并实现一个简单的51单片机控制系统,如智能小车、智能家居等。
51单片机C语言程序设计-图文
/* 名称:8 只 LED 左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
*/ #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) {
case 2: //东西向黄灯闪烁,绿灯关闭 DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) return; //闪烁 5 次 Flash_Count=0; Operation_Type=3; break;
case 3: //东西向红灯,南北向绿灯亮 RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type=4; break;
3 Ykcsh 呈献
0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff }; //延时 void DelayMS(uint x) {
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; while(1) { //从数组中读取数据送至 P0 和 P2 口显示
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; P2=0x01; while(1) {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TIME0_DOWN EQU F0 ;将F0设置为定时器0定时到标志FINISH_ID EQU 30H ;学号发送标志KEY_FLAG BIT 00H ;有键按下标志KEY_LONG BIT 01H ;键长按KEY_D EQU 31H ;键值存放地址ADC0809_AD EQU 8000H ;设置ADC0809地址DAC0832_AD EQU 0000H ;设置DAC0832地址ADC_FLAG BIT 02H ;设置ADC0809读数据标志ADC_DATE EQU 32H ;设置ADC0809数据地址ADC_0 EQU 33H ;ADC0809转化为BCD码后个位存放地址ADC_1 EQU 34H ;十分位存放地址ADC_2 EQU 35H ;百分位存放地址ADC_3 EQU 36H ;千分位存放地址ORG 0000H ;程序开始,跳转至主程序0000 020030 LJMP MAINORG 0003H ;外部中断0入口0003 020141 LJMP INT0_INORG 000BH ;设置定时器0中断入口地址000B 020132 LJMP TIME0ORG 0013H ;外部中断1入口0013 020151 LJMP INT1_INORG 0030H ;主程序开始地址0030 758169 MAIN: MOV SP,#69H ;初始化堆栈指针0033 C292 CLR P1.2 ;显示器清零0035 D292 SETB P1.20037 753000 MOV FINISH_ID,#0 ;将标志位清零003A C2D5 C LR TIME0_DOWN003C C200 CLR KEY_FLAG003E C201 CLR KEY_LONG0040 753100 MOV KEY_D,#00043 C202 CLR ADC_FLAG0045 753200 MOV ADC_DATE,#00048 753300 MOV ADC_0,#0004B 753400 MOV ADC_1,#0004E 753500 MOV ADC_2,#00051 753600 MOV ADC_3,#00054 C291 CLR P1.1 ;初始化键盘,行线置零,有键按下触发中断0056 C293 CLR P1.30058 D2B8 S ETB PX0 ;设置键盘中断为高级中断005A D28A SETB IT1 ;设置外部中断1为下降沿触发方式005C 758901 MOV TMOD,#01H ;设置定时器0工作方式005F 75A887 MOV IE,#10000111B ;开中断;*************显示学号******************0062 7A05 MOV R2,#5 ;显示学号程序,设置发送数据的个数0064 EA DIS_ID: MOV A,R20065 C3 CLR C0066 9401 SUBB A,#10068 900232 MOV DPTR,#TAB_ID ;查断码表表得到发送的数据值006B 93 MOVC A,@A+DPTR006C F599 MOV SBUF,A ;发送数据006E 109902 CONT: JBC TI,NEXT ;等待数据发完,发完清除中断标志继续发送0071 80FB SJMP CONT0073 DAEF NEXT: DJNZ R2,DIS_ID ;判断第一段发完没有,发完后继续发送下一段0075 7A05 MOV R2,#5 ;重赋发送数据的个数0077 0530 INC FINISH_ID ;递增学号显示标志,判断是否发送完成0079 E530 MOV A,FINISH_ID007B B40306 CJNE A,#3,NEXT1 ;没有完成则先延时后继续发送007E 753000 MOV FINISH_ID,#00081 02009F LJMP OTHER ;发送完成后执行其他程序0084 758C3C NEXT1: MOV TH0,#3CH ;定时器0定时初值,延时50ms,计算方法:0087 758AB0 MOVTL0,#0B0H ;TH0=(65536-50000)/256,TL0=(65536-50000)%25 6008A 7B1E MOV R3,#30 ;设置软件计数器,计30次,即1.5s008C D28C S ETB TR0 ;启动定时器0008E E582 MOV A,DPL ;发完一次后DPTR加5,指向下一页数据0090 2405 ADD A,#50092 F582 MOV DPL,A0094 E583 MOV A,DPH0096 3400 ADDC A,#00098 F583 MOV DPH,A009A 10D5C7 L1: JBC TIME0_DOWN,DIS_ID ;等待计时时间到,时间到继续下步显示009D 80FB SJMP L1;************判断按键执行其他功能**************009F 3000C2 OTHER: JNB KEY_FLAG,DIS_ID ;判断是否有键按下,没有则继续显示学号00A2 C2A8 CLR EX0 ;如果有键按下,则关闭键盘中断,以免再次中断导致键值读错00A4 758C3C M OV TH0,#3CH ;开启定时器0,计算是否为长按键00A7 758AB0 M OV TL0,#0B0H00AA 7B1E M OV R3,#3000AC D28C SETB TR000AE 1200D0 L CALL KEYSCAN ;键盘扫描,以确定按键值和长按键00B1 200103 JB KEY_LONG,SEC_FUN ;判断是否为长按键,若是,则调用第二功能00B4 020064 LJMP DIS_ID ;否则继续显示学号00B7 C201 SEC_FUN:CLR KEY_LONG ;清楚长按键标志00B9 900252 MOV DPTR,#TAB_FUN ;利用查转向地址表法执行对应第二功能程序00BC E531 MOV A,KEY_D00BE 2531 ADD A,KEY_D00C0 73 JMP @A+DPTR;*********delay10ms子程序**************00C1 D2D3 DELAY_10MS: SETB PSW.3 ;10MS延时子程序00C3 780A DL0: MOV R0,#1000C5 797D DL1: MOV R1,#7DH00C7 00 NOP00C8 00 NOP00C9 D9FA DJNZ R1,DL100CB D8F6 DJNZ R0,DL000CD C2D3 CLR PSW.300CF 22 RET;**********键盘扫描子程序**************00D0 5390FD KEYSCAN: ANL P1,#11111101B ;键盘扫描子程序,先将P1.1赋0,P1.3赋100D3 439008 ORL P1,#00001000B00D6 E590 MOV A,P1 ;读回P1.5,P1.7的值,若P1.5为0,则键值为000D8 20E506 JB ACC.5,K100DB 753100 MOV KEY_D,#000DE 020104 LJMP OUT_KS1 ;若P1.7为1,则键值为100E1 20E706 K1: JB ACC.7,KS00E4 753101 MOV KEY_D,#100E7 020104 LJMP OUT_KS100EA 5390F7 KS: ANL P1,#11110111B ;再将P1.3赋0,P1.1赋1 00ED 439042 ORL P1,#01000010B00F0 E590 MOV A,P1 ;读回P1.5,P1.7的值,若P1.5为0,则键值为200F2 20E506 JB ACC.5,K200F5 753102 MOV KEY_D,#200F8 020104 LJMP OUT_KS100FB 20E706 K2: JB ACC.7,OUT_KS1 ;若P1.7为0,则键值为300FE 753103 MOV KEY_D,#30101 020104 LJMP OUT_KS1 ;读出键值后判断松手0104 E590 OUT_KS1: MOV A,P1 ;读回P1值0106 445F ORL A,#5FH ;屏蔽不相干位0108 F4 CPL A ;变0有效为1有效0109 600B JZ OUT_KS2 ;判断是否继续为0,若为0,则说明松手了,继续判断是否为长按键010B E531 MOV A,KEY_D ;若不为0,则显示键值010D 900241 MOV DPTR,#TAB_NUM ;查表法显示键值0110 93 MOVC A,@A+DPTR0111 120126 LCALL DIS_NUM ;调用显示键值程序0114 80EE SJMP OUT_KS1 ;循环判断是否松手0116 30D504 OUT_KS2: JNB TIME0_DOWN,OUT_KS3 ;判断定时器0是否定时完,若完,则置长按键标志0119 C2D5 CLR TIME0_DOWN ;否则,直接返回011B D201 SETB KEY_LONG011D C200 OUT_KS3: CLR KEY_FLAG ;先清除按键标志,关闭蜂鸣器,关闭定时器0,再返回011F C28C CLR TR00121 D2A8 SETB EX00123 D290 SETB P1.00125 22 RET;************显示键值子程序***************0126 7C05 DIS_NUM: MOV R4,#50128 F599 DIS_NUM1: MOV SBUF,A012A 109902 LP: JBC TI,DIS_NUM2012D 80FB SJMP LP012F DCF7 DIS_NUM2: DJNZ R4,DIS_NUM10131 22 RET;*********定时器0中断服务程序*************0132 758C3C TIME0: MOV TH0,#3CH ;重复初值0135 758AB0 MOV TL0,#0B0H0138 DB06 D JNZ R3,OUT_TIME0 ;递减软件计数器,若减为0,说明计数时间到013A 7B1E MOV R3,#30 ;否则,直接返回013C C28C CLR TR0 ;计数时间到后,重赋软件计数器初值,关闭计数器013E D2D5 SETB TIME0_DOWN ;设定计数时间到标志0140 32 OUT_TIME0: RETI;*********外部中断0中断服务程序**********0141 C0D0 INT0_IN: PUSH PSW ;保护现场0143 1200C1 LCALL DELAY_10MS ;出现中断信号后,先延时10ms0146 A2B2 MOV C,P3.2 ;读回P3.2引脚状态0148 4006 JC OUT_INT0 ;若继续为低电平,则确定有键按下,置按键标志,开启蜂鸣器后返回014A D200 SETB KEY_FLAG ;若为高电平,说明为干扰信号,标志位不置位直接返回014C C290 CLR P1.0014E D0D0 POP PSW ;恢复现场0150 32 OUT_INT0: RETI;*********外部中断1中断服务程序**********0151 C0E0 INT1_IN: PUSH ACC ;保护现场0153 908000 MOV DPTR,#ADC0809_AD ;给ADC0809地址,读回AD转换值0156 E0 MOVX A,@DPTR0157 F532 MOV ADC_DATE,A0159 D202 SETB ADC_FLAG ;AD读完数据标志置位015B D0E0 POP ACC ;恢复现场015D 32 RETI;*********AD功能程序*********************015E 908000 FUN_AD: MOV DPTR,#ADC0809_AD ;DPTR赋值为ADC0809地址0161 F0 MOVX @DPTR,A ;打开AD0162 100202 L3: JBC ADC_FLAG,NEXT2 ;等待AD是读数完成0165 80FB SJMP L30167 E532 NEXT2: MOV A,ADC_DATE ;将AD读数送A 0169 75F013 MOV B,#19 ;将读到的值乘以19得到应该显示的读数值016C A4 MUL AB016D D2D4 SETB PSW.4 ;保护第0组工作寄存器016F FA MOV R2,A ;先把该显示的值暂存0170 ABF0 MOV R3,B0172 C3 AD0: CLR C ;把暂存的值转化为4位BCD码0173 EA MOV A,R2 ;利用减法,先减1000,够减则相应位加1,否则,恢复原值0174 94E8 SUBB A,#0E8H ;继续减100,得到百位值,同上的方法0176 FA MOV R2,A ;十位和个位利用除法得到0177 EB MOV A,R30178 9403 SUBB A,#03H017A FB MOV R3,A017B 4004 JC AD01017D 0533 INC ADC_0017F 80F1 SJMP AD00181 EA AD01: MOV A,R20182 24E8 ADD A,#0E8H0184 FA MOV R2,A0185 EB MOV A,R30186 3403 ADDC A,#03H0188 FB MOV R3,A0189 EA AD1: MOV A,R2018A C3 CLR C018B 9464 SUBB A,#64H018D FA MOV R2,A018E EB MOV A,R3018F 9400 SUBB A,#00191 FB MOV R3,A0192 4004 JC AD110194 0534 INC ADC_10196 80F1 SJMP AD10198 EA AD11: MOV A,R20199 2464 ADD A,#64H019B 75F00A MOV B,#10019E 84 DIV AB019F F535 MOV ADC_2,A01A1 85F036 MOV ADC_3,B01A4 E536 MOV A,ADC_3 ;判断最后一位的值大小,若小于5,舍掉01A6 B40500 CJNE A,#5,AD2 ;否则,向高位进101A9 401C AD2: JC SHE01AB E535 MOV A,ADC_201AD 2401 ADD A,#101AF D4 DA A01B0 FC MOV R4,A01B1 540F ANL A,#0FH01B3 F535 MOV ADC_2,A01B5 EC MOV A,R401B6 C4 SWAP A01B7 540F ANL A,#0FH01B9 2534 ADD A,ADC_101BB D4 DA A01BC FC MOV R4,A01BD 540F ANL A,#0FH01BF F534 MOV ADC_1,A01C1 EC MOV A,R401C2 C4 SWAP A01C3 540F ANL A,#0FH01C5 2433 ADD A,#ADC_001C7 753600 SHE: MOV ADC_3,#001CA 1201D8 LCALL DIS_AD ;转换后显示转换值01CD C2D4 CLR PSW.4 ;恢复第0组工作寄存器01CF 200003 JB KEY_FLAG,AD_OUT ;等待其他键按下01D2 02015E LJMP FUN_AD01D5 02009F AD_OUT: LJMP OTHER;***********AD显示功能********************01D8 E535 DIS_AD: MOV A,ADC_2 ;先发送最后一位01DA 900241 MOV DPTR,#TAB_NUM ;查表得到段码01DD 93 MOVC A,@A+DPTR01DE F599 MOV SBUF,A ;发送段码01E0 109902 A_0: JBC TI,DIS_AD0 ;等待发完,未完继续等待,完成后发送下一个01E3 80FB SJMP A_001E5 E534 DIS_AD0: MOV A,ADC_101E7 900241 MOV DPTR,#TAB_NUM01EA 93 MOVC A,@A+DPTR01EB F599 MOV SBUF,A01ED 109902 A_1: JBC TI,DIS_AD101F0 80FB SJMP A_101F2 E533 DIS_AD1: MOV A,ADC_001F4 90024C MOV DPTR,#TAB_DOT01F7 93 MOVC A,@A+DPTR01F8 F599 MOV SBUF,A01FA 109902 A_2: JBC TI,DIS_AD201FD 80FB SJMP A_201FF 7400 DIS_AD2: MOV A,#00H0201 F599 MOV SBUF,A0203 109902 A_3: JBC TI,DIS_AD30206 80FB SJMP A_30208 7400 DIS_AD3: MOV A,#00H020A F599 MOV SBUF,A020C 109902 A_4: JBC TI,OUT_DIS_AD020F 80FB SJMP A_40211 22 OUT_DIS_AD: RET;************DA功能************************0212 900000 FUN_DA: MOV DPTR,#DAC0832_AD ;赋DA地址0215 7400 MOV A,#00H ;发送数据给DAC08320217 F0 UP: MOVX @DPTR,A0218 04 INC A ;A加1后继续传0219 00 NOP ;等待时间到021A 00 NOP021B 00 NOP021C 00 NOP021D 00 NOP021E 70F7 JNZ UP0220 14 DOWN: DEC A ;A加完后开始减1 0221 F0 MOVX @DPTR,A ;传送数据给DAC08320222 00 NOP0223 00 NOP0224 00 NOP0225 00 NOP0226 00 NOP0227 70F7 JNZ DOWN0229 200003 JB KEY_FLAG,DA_OUT ;判断是否有其他键按下,有即跳出DA功能,无则继续跳回DA功能022C 04 INC A022D 80E8 SJMP UP022F 02009F DA_OUT: LJMP OTHER0232 0000800235 8080 TAB_ID: DB 00H,00H,80H,80H,80H ;学号显示断码表0237 404046023A C686 DB 40H,40H,46H,0C6H,86H023C 6060FC023F FEDA DB 60H,60H,0FCH,0FEH,0DAH0241 FC60DA0244 F266B60247 BEE0FE024A F600 TAB_NUM: DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,00H ;数字断码表024C FD61DB024F F367B7 TAB_DOT: DB 0FDH,61H,0DBH,0F3H,67H,0B7H ;带小数点数字断码表0252 0164 TAB_FUN: AJMPDIS_ID ;第二功能转向地址表0254 0164 AJMP DIS_ID0256 215E AJMP FUN_AD0258 4112 AJMP FUN_DAEND符号值类型AC = 00D6H CONST 常量ACC = 00E0H CONST 常量AD0 = 0172H CODE 标号AD01 = 0181H CODE 标号AD1 = 0189H CODE 标号AD11 = 0198H CODE 标号AD2 = 01A9H CODE 标号ADC0809_AD = 8000H CONST 常量ADC_0 = 0033H CONST 常量ADC_1 = 0034H CONST 常量ADC_2 = 0035H CONST 常量ADC_3 = 0036H CONST 常量ADC_DATE = 0032H CONST 常量ADC_FLAG = 0002H CONST 常量AD_OUT = 01D5H CODE 标号A_0 = 01E0H CODE 标号A_1 = 01EDH CODE 标号A_2 = 01FAH CODE 标号A_3 = 0203H CODE 标号A_4 = 020CH CODE 标号B = 00F0H CONST 常量CONT = 006EH CODE 标号CY = 00D7H CONST 常量DAC0832_AD = 0000H CONST 常量DA_OUT = 022FH CODE 标号DELAY_10MS = 00C1H CODE 标号DIS_AD = 01D8H CODE 标号DIS_AD0 = 01E5H CODE 标号DIS_AD1 = 01F2H CODE 标号DIS_AD2 = 01FFH CODE 标号DIS_AD3 = 0208H CODE 标号DIS_ID = 0064H CODE 标号DIS_NUM = 0126H CODE 标号DIS_NUM1 = 0128H CODE 标号DIS_NUM2 = 012FH CODE 标号DL0 = 00C3H CODE 标号DL1 = 00C5H CODE 标号DOWN = 0220H CODE 标号DPH = 0083H CONST 常量DPL = 0082H CONST 常量EA = 00AFH CONST 常量ES = 00ACH CONST 常量ET0 = 00A9H CONST 常量ET1 = 00ABH CONST 常量EX0 = 00A8H CONST 常量EX1 = 00AAH CONST 常量F0 = 00D5H CONST 常量F1 = 00D1H CONST 常量FINISH_ID = 0030H CONST 常量FUN_AD = 015EH CODE 标号FUN_DA = 0212H CODE 标号IE = 00A8H CONST 常量IE0 = 0089H CONST 常量IE1 = 008BH CONST 常量INT0_IN = 0141H CODE 标号INT1_IN = 0151H CODE 标号IP = 00B8H CONST 常量IT0 = 0088H CONST 常量IT1 = 008AH CONST 常量K1 = 00E1H CODE 标号K2 = 00FBH CODE 标号KEYSCAN = 00D0H CODE 标号KEY_D = 0031H CONST 常量KEY_FLAG = 0000H CONST 常量KEY_LONG = 0001H CONST 常量KS = 00EAH CODE 标号L1 = 009AH CODE 标号L3 = 0162H CODE 标号LP = 012AH CODE 标号MAIN = 0030H CODE 标号NEXT = 0073H CODE 标号NEXT1 = 0084H CODE 标号NEXT2 = 0167H CODE 标号OTHER = 009FH CODE 标号OUT_DIS_AD = 0211H CODE 标号OUT_INT0 = 0150H CODE 标号OUT_KS1 = 0104H CODE 标号OUT_KS2 = 0116H CODE 标号OUT_KS3 = 011DH CODE 标号OUT_TIME0 = 0140H CODE 标号OV = 00D2H CONST 常量P = 00D0H CONST 常量P0 = 0080H CONST 常量P1 = 0090H CONST 常量P2 = 00A0H CONST 常量P3 = 00B0H CONST 常量PCON = 0087H CONST 常量PS = 00BCH CONST 常量PSW = 00D0H CONST 常量PT0 = 00B9H CONST 常量PT1 = 00BBH CONST 常量PX0 = 00B8H CONST 常量PX1 = 00BAH CONST 常量RB8 = 009AH CONST 常量REN = 009CH CONST 常量RI = 0098H CONST 常量RS0 = 00D3H CONST 常量RS1 = 00D4H CONST 常量SBUF = 0099H CONST 常量SCON = 0098H CONST 常量SEC_FUN = 00B7H CODE 标号SHE = 01C7H CODE 标号SM0 = 009FH CONST 常量SM1 = 009EH CONST 常量SM2 = 009DH CONST 常量SP = 0081H CONST 常量TAB_DOT = 024CH CODE 标号TAB_FUN = 0252H CODE 标号TAB_ID = 0232H CODE 标号TAB_NUM = 0241H CODE 标号TB8 = 009BH CONST 常量TCON = 0088H CONST 常量TF0 = 008DH CONST 常量TF1 = 008FH CONST 常量TH0 = 008CH CONST 常量TH1 = 008DH CONST 常量TI = 0099H CONST 常量TIME0 = 0132H CODE 标号TIME0_DOWN = 00D5H CONST 常量TL0 = 008AH CONST 常量TL1 = 008BH CONST 常量TMOD = 0089H CONST 常量TR0 = 008CH CONST 常量TR1 = 008EH CONST 常量UP = 0217H CODE 标号公有符号: 125 私有符号: 0。