C51单片机课设报告(进制转换)

合集下载

C51单片机课程设计报告

C51单片机课程设计报告

内容提要单片微型计算机简称单片机,是典型的嵌入式微控制器,常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。

单片机由芯片内仅有CPU的专用处理器发展而来。

最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。

单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。

相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。

概括的讲:一块芯片就成了一台计算机。

它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。

同时,学习使用单片机是了解计算机原理与结构的最佳选择。

单片机是靠程序运行的,并且可以修改。

通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。

一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。

更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。

所以说对于单片机课程的学习对于我们电子信息工程专业的学生来说至关重要,然而学习单片机课程设计是其一个极为重要的实践环节,无论是硬件扩展、接口应用还是编程方法、程序调试,都离不开该环节。

单片机课程设计过程中,学生通过查阅资料、接口设计、程序设计、安装调试等环节,完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用。

c进制转换课程设计

c进制转换课程设计

c 进制转换课程设计一、课程目标知识目标:1. 理解进制转换的基本概念,掌握二进制、八进制、十进制和十六进制之间的转换方法。

2. 学会使用数学原理进行进制转换的计算,并能够运用到实际问题中。

3. 了解进制转换在日常生活中的应用,如计算机编程、数字电路等领域。

技能目标:1. 能够熟练运用进制转换公式,正确完成不同进制之间的转换。

2. 培养学生的逻辑思维能力和计算能力,提高解决进制转换问题的效率。

3. 学会运用进制转换知识解决实际问题的方法,提高学生的应用能力。

情感态度价值观目标:1. 激发学生对计算机科学的兴趣,培养学习积极性和主动性。

2. 培养学生的团队合作精神,让学生在合作交流中共同成长。

3. 引导学生认识到进制转换在科技发展中的重要性,增强学生的社会责任感和使命感。

课程性质:本课程为计算机科学基础知识课程,以理论讲解和实践操作相结合的方式进行教学。

学生特点:学生处于初中阶段,具有一定的数学基础和逻辑思维能力,但对进制转换概念可能较为陌生。

教学要求:注重理论与实践相结合,以生动形象的方式进行讲解,激发学生的学习兴趣,提高学生的实际操作能力。

通过课程学习,使学生掌握进制转换的知识点,并能将其应用于实际问题中。

同时,关注学生的情感态度价值观的培养,提升学生的综合素质。

在教学过程中,分解课程目标为具体的学习成果,便于教学设计和评估。

二、教学内容1. 教学大纲:a. 进制概念介绍:二进制、八进制、十进制、十六进制的定义及特点。

b. 进制转换方法:重点讲解各进制之间的转换技巧和步骤。

c. 实践应用:结合实际案例,让学生动手操作进制转换,提高应用能力。

d. 总结与拓展:总结进制转换的知识点,拓展相关知识,激发学生学习兴趣。

2. 教学内容安排与进度:a. 第一课时:介绍进制概念,讲解二进制与十进制的转换方法。

b. 第二课时:讲解八进制、十六进制与十进制的转换方法。

c. 第三课时:实践操作,让学生进行进制转换的练习,巩固所学知识。

单片机(C51)实验报告汇总

单片机(C51)实验报告汇总

实验一熟悉ADEK单片机教学实验系统一、实验目的1.熟悉ADEK 单片机教学实验系统和仿真器的结构和功能。

2.了解如何安装51MINI 仿真器驱动程序。

二、ADEK 单片机教学实验系统组成图1-1 AEDK 单片机教学实验系统外观图如图1-1 所示,ADEK-EAT598 单片机教学实验系统遵循了模块化的设计思路,有丰富的接口,并且具有良好的扩展性,以下为组成模块和使用的主要芯片。

1.步进电机2.直流电机3.温度控制(DS18B20、热敏电阻B3470)4.模数转换(ADC0809)5.串行实验区(EEPROM X25045、AT24C08、时钟芯片HT1380、数模转换TLC5615、模数转换TLC1543)6.RAM(HM62256)7.ROM(M27C512)8.地址译码(74LS138)9.数模转换(DAC0832)10.仿真机通讯口:原厂仿真器的串口通信口,这部分功能已不用。

11.串并转换(74LS164)12.频率源(CD4020)213.扩展输出(74LS273)14.扩展输入(74LS244)15.电源开关16.液晶显示(MSC-G12232DYEW-7N)17.语音录放(ISD1730)18.扩展通信口(D8251、HIN232)19.八位开关20.交通灯21.单脉冲(HD74LS240)22.继电器(946H-1C-5D)23.电子音调(9012)24.蜂鸣器25.光耦(TLC521)26.电位器27.点阵显示28.PS2 接口29.并行接口(8255)30.键盘显示(8279)31.扩展实验区32.打印机接口33.单片机核心板(EA T598_31)34.带USB 接口的51MINI 仿真器三、实验内容1.熟悉整个实验箱的硬件资源。

2.使用51MINI仿真器连接电脑,在电脑的设备管理器中可找到下图所示的COM口。

实验二Keil集成开发环境练习一、实验目的1.掌握开发环境Keil的安装方法。

进制转换c课程设计

进制转换c课程设计

进制转换c 课程设计一、课程目标知识目标:1. 理解进制转换的基本概念,掌握二进制、八进制、十进制和十六进制之间的转换方法;2. 学会使用数学原理和逻辑推理进行不同进制间的转换;3. 掌握在实际问题中运用进制转换解决计算和存储等相关问题。

技能目标:1. 能够准确、迅速地进行不同进制间的转换,提高计算和逻辑思维能力;2. 能够运用所学进制转换知识解决实际生活中的问题,培养学以致用的能力;3. 通过小组合作和讨论,提高团队协作和沟通能力。

情感态度价值观目标:1. 培养学生对计算机科学的兴趣,激发学习积极性;2. 培养学生勇于探索、敢于创新的精神,增强解决问题的信心;3. 增强学生对科技发展对社会进步的作用的认识,提高社会责任感。

本课程针对的学生特点是具备一定的数学基础和逻辑思维能力,对计算机科学感兴趣。

通过本课程的学习,旨在让学生掌握进制转换的知识和技能,培养他们在实际问题中运用所学知识解决问题的能力,同时提高他们的团队协作和沟通能力,激发对科学技术的热爱和探索精神。

在教学过程中,注重理论与实践相结合,关注学生的个体差异,因材施教,确保课程目标的实现。

二、教学内容1. 引入进制概念:介绍不同进制的定义和特点,如二进制、八进制、十进制和十六进制;相关教材章节:第一章 计算机基础知识 第3节 进制与编码2. 进制转换方法:a. 二进制与十进制的转换;b. 八进制与十进制的转换;c. 十六进制与十进制的转换;d. 不同进制间的转换方法。

相关教材章节:第一章 计算机基础知识 第4节 进制转换3. 实际问题中的应用:a. 计算机存储单位与进制转换的关系;b. 网络地址进制转换的实际应用;c. 编程中进制转换的应用。

相关教材章节:第一章 计算机基础知识 第5节 进制转换的应用4. 教学大纲:第一课时:进制概念及二进制与十进制的转换;第二课时:八进制与十进制、十六进制与十进制的转换;第三课时:不同进制间的转换方法及实际问题中的应用。

单片机实验二数制转换类程序设计

单片机实验二数制转换类程序设计

单片机实验二数制转换类程序设计【实验目的】1.了解数制转换的基本概念及原理。

2.掌握单片机对数制转换的程序设计方法。

【实验器材】1.STC89C52单片机实验箱2. Keil C51开发环境3.电源、连接线等【实验原理】数制转换是将一个数值在不同进制间互相转换的过程。

常见的进制包括二进制、八进制、十进制和十六进制。

在程序设计中,经常需要进行不同进制间的转换,例如从二进制转换为十进制、从十进制转换为十六进制等。

【程序设计】本实验设计一个数制转换类的程序,实现二进制、八进制、十进制和十六进制之间的转换。

基本思路:1.输入数字和当前进制。

2.根据当前进制将输入的数字转换为十进制。

3.根据目标进制将十进制数转换为目标进制并输出。

【程序示例】```#include <reg52.h>#include <stdio.h>//二进制转十进制int binaryToDecimal(char *binary)int length = 0;while (binary[length] != '\0')length++;}int decimal = 0;int base = 1;for (int i = length - 1; i >= 0; i--) if (binary[i] == '1')decimal += base;}base *= 2;}return decimal;//十进制转二进制void decimalToBinary(int decimal, char *binary) int index = 0;while (decimal > 0)binary[index++] = (decimal % 2 == 1) ? '1' : '0'; decimal /= 2;}binary[index] = '\0';//反转二进制字符串int i = 0;int j = index - 1;while (i < j)char temp = binary[i];binary[i] = binary[j];binary[j] = temp;i++;j--;}//十进制转八进制void decimalToOctal(int decimal, char *octal)int index = 0;while (decimal > 0)octal[index++] = (decimal % 8) + '0';decimal /= 8;}octal[index] = '\0';//反转八进制字符串int i = 0;int j = index - 1;while (i < j)char temp = octal[i];octal[i] = octal[j];octal[j] = temp;i++;j--;}//十进制转十六进制void decimalToHexadecimal(int decimal, char *hexadecimal)int index = 0;while (decimal > 0)int remainder = decimal % 16;if (remainder < 10)hexadecimal[index++] = remainder + '0';} elsehexadecimal[index++] = remainder - 10 + 'A'; }decimal /= 16;}hexadecimal[index] = '\0';//反转十六进制字符串int i = 0;int j = index - 1;while (i < j)char temp = hexadecimal[i];hexadecimal[i] = hexadecimal[j]; hexadecimal[j] = temp;i++;j--;}void maichar input[100];int currentBase; // 当前进制int targetBase; // 目标进制printf("请输入一个数字:");scanf("%s", input);printf("请输入当前进制:");scanf("%d", &currentBase);printf("请输入目标进制:");scanf("%d", &targetBase);printf("转换结果为:");switch (currentBase)case 2://二进制转十进制int decimal = binaryToDecimal(input); //十进制转目标进制switch (targetBase)case 8:char octal[100];decimalToOctal(decimal, octal);printf("%s\n", octal);break;}case 10:printf("%d\n", decimal);break;}case 16:char hexadecimal[100]; decimalToHexadecimal(decimal, hexadecimal); printf("%s\n", hexadecimal);break;}}break;case 8://八进制转十进制decimal = atoi(input);//十进制转目标进制switch (targetBase)case 2:char binary[100];decimalToBinary(decimal, binary);printf("%s\n", binary);break;}case 10:printf("%d\n", decimal);break;}case 16:char hexadecimal[100]; decimalToHexadecimal(decimal, hexadecimal); printf("%s\n", hexadecimal);break;}}break;case 10://十进制转目标进制switch (targetBase)case 2:char binary[100];decimalToBinary(atoi(input), binary); printf("%s\n", binary);break;}case 8:char octal[100];decimalToOctal(atoi(input), octal); printf("%s\n", octal);break;}case 16:char hexadecimal[100];decimalToHexadecimal(atoi(input), hexadecimal); printf("%s\n", hexadecimal);break;}}break;case 16://十六进制转十进制decimal = atoi(input);//十进制转目标进制switch (targetBase)case 2:char binary[100];decimalToBinary(decimal, binary);printf("%s\n", binary);break;}case 8:char octal[100];decimalToOctal(decimal, octal);printf("%s\n", octal);break;}case 10:printf("%d\n", decimal);break;}}break;}```【实验结果】1.运行程序后,程序会提示输入一个数字、当前进制和目标进制。

课程设计报告--汇编程序设计(进制转换)

课程设计报告--汇编程序设计(进制转换)

课程设计报告--汇编程序设计(进制转换)汇编语言课程设计报告:代码与数制之间的转换内容提要:本课程设计的主要内容是代码与数制之间的转换~程序的主要功能如下:1. 将十六进制数转换成其对应的ASCII码2. 将ASCII码转换成其对应的十六进制数3. 实现二进制数与十六进制数之间相互转换4. 实现十进制数与二进制数之间相互转换5. 实现十六进制数与十进制数之间相互转换数制转换是计算机科学技术中最为基础的运算~在日常生活中~人们习惯性地使用十进制数进行计算。

而在计算机内部~所有的信息,数、字符、汉字、计算机的指令、状态,都是用二进制数来表示的。

在计算机中~二进制数的运算、处理比十进制数的更容易实现。

有时为了缩短书写~在计算机中还采用十六进制数。

所以~我们需要把数从二进制数形式转换成其他进制的形式~甚至在不同的进位制之间进行转换。

- 1 -汇编语言课程设计报告:代码与数制之间的转换目录一、前言〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃3 1.1 程设计的目的〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃3 1.2 代码与数制之间的转换程序的意义〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃3 1.3 数制之间的转换程序的主要功能〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃3正文〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃3 二、2.1 代码与数制之间相互转换程序的设计大纲〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃3 2.2 代码与数制之间相互转换程序的结构图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃4 2.3 友好交互界面结构图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃5 2.4 程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃62.4.1 主程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃62.4.2 键盘输入子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃62.4.3 ASC码转16进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃72.4.4 16进制转ASC进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃82.4.5 2,16进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃82.4.6 2?16进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃92.4.7 16?2进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃92.4.8 2~10进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃102.4.9 2?10进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃102.4.10 10?2进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃112.4.11 10~16进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃112.4.12 10?16进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃122.4.13 16?10进制子程序流程图〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃12三、源程序及其注释〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃13四、课程设计体会〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃29五、参考文献〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃29- 2 -汇编语言课程设计报告:代码与数制之间的转换课程设计题目:代码与数制之间的转换一、前言1.1 课程设计的目的, 加深对汇编语言课程理论方面的理解, 通过编写一定规模和难度的程序,进行一次较全面的汇编编程训练,提高分析问题和解决问题的能力, 提高调试程序的能力1.2 代码与数制之间的转换程序的意义数制转换是计算机科学技术中最为基础的运算,在日常生活中,人们习惯性地使用十进制数进行计算。

51单片机整数二_十进制转换的快速算法

51单片机整数二_十进制转换的快速算法

51单片机整数二—十进制转换的快速算法※■西北矿冶研究院 陈国照 摘 要旨在提高89C51系列单片机编程中经常用到的整数二—十进制转换的代码执行效率。

提出的快速算法思路是,首先求出整数中包含的1000的个数,方法是采用二进制整数的高6位作为其预估,再通过2次校正得到准确值。

算法的关键是充分利用89C51单片机的两条特殊指令———单字节乘和单字节除。

其耗费时间不及使用sprintf()函数的1/10。

 关键词89C51 单片机 二—十进制转换 快速算法 89C51系列单片机历经20多年的发展,仍然长盛不衰,在工业控制及仪器仪表中得到广泛应用;用于89C51单片机软件开发的Keil C51编译系统也日臻成熟,成为89C51系列单片机软件开发的优先选择。

在单片机系统开发中,经常遇到整数二—十进制转换的问题,一般可以采用C语言中的标准函数sprintf()来实现;但由于该函数是通用格式输出函数,代码量大(超过1K B),用于整数二-十进制转换的运算时间过长(在12M Hz晶振频率下超过1ms),这在计算密集(computation intensive)的应用中是一个影响系统性能的重要因素。

在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。

经常有网友询问如何高效地实现这种转换。

笔者通过对二进制整数的深入分析,巧妙运用89C51单片机的特殊单字节乘除指令,成功地实现了整数二—十进制转换的快速算法。

本文将详细介绍快速算法,给出颇具实用性的优化代码,并与使用sprintf()函数的实现及传统的汇编代码实现进行性能比较。

1 传统的汇编代码实现要实现快速运算,很自然地想到教科书中提到的双字节二进制整数转换成3字节BCD码整数的子程序。

其采用的算法是,依次将整数的每位左移至CY位,再把CY 位左移至一个3字节队列中,并进行十进制调整。

通过16次移位完成运算,结果为压缩格式的3字节BCD编码。

汇编子程序如下:入口:双字节十六进制整数在R6、R7中。

C51单片机课设报告(进制转换)

C51单片机课设报告(进制转换)

单片机原理课程设计报告题目:51单片机实现进制转换专业:信息工程班级:信息101学号:1004020307小组成员:1004020103指导教师:吴叶兰北京工商大学计算机与信息工程学院题目:51单片机实现进制转换1、设计目的1)熟悉51单片机的编程;2)熟悉单片机开发的基本焊接;3)熟悉单片机元件的使用方法;4)熟悉C51的软件开发环境(编程软件Keil、烧录软件STC_ISP_v4792、设计要求1)按键输入数据,具有确定和清零功能;2)1602液晶屏幕显示,具有显示输入输出和提示功能;3)2,、8、10、16进制数可任意互相转化;3、硬件电路设计(包括电路图及说明)1)控制模块:控制模块是由1块STC89C52 1个12MHz无源晶振、1个复位电路22uF电容、1个1k欧姆电阻、1个8位1k欧姆排阻组成。

STC89C52是STC公司生产的一种低功耗、高性能CMOS位微控制器,具有8K在系统可编程Flash存储器。

STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。

在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

具有以下标准功能:8k字节Flash,512字节RAM 32位I/O 口线,看门狗定时器,内置4KBEEPRQMIAX810 复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。

另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

最高运作频率35MHz 6T/12T可选。

芯片实际选用的STC89C5与protues模拟电路图中的AT89C52功能基本相同,区别在于烧录程序的方式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机原理课程设计报告题目:51单片机实现进制转换专业:信息工程班级:信息101学号:**********小组成员: 1004020103指导教师:***北京工商大学计算机与信息工程学院题目:51单片机实现进制转换1、设计目的1)熟悉51单片机的编程;2)熟悉单片机开发的基本焊接;3)熟悉单片机元件的使用方法;4)熟悉C51的软件开发环境(编程软件Keil、烧录软件STC_ISP_v479)2、设计要求1)按键输入数据,具有确定和清零功能;2)1602液晶屏幕显示,具有显示输入输出和提示功能;3)2,、8、10、16进制数可任意互相转化;3、硬件电路设计(包括电路图及说明)1)控制模块:控制模块是由1块STC89C52、1个12MHz无源晶振、1个复位电路22uF电容、1个1k欧姆电阻、1个8位1k欧姆排阻组成。

STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。

STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。

另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

最高运作频率35MHz,6T/12T可选。

芯片实际选用的STC89C52与 protues模拟电路图中的AT89C52功能基本相同,区别在于烧录程序的方式。

2)显示模块:显示模块由1块1602液晶显示屏、16根数据线组成。

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

液晶显示屏际实际选用的是QC1602A与 protues模拟电路图中的LM016功能基本相同。

3)按键输入模块:按键输入模块由1块4*4矩阵键盘、8根数据线组成、2个独立按键。

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。

这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。

行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。

实际电路中使用的是集成的1块4*4矩阵键盘,跟protues模拟电路图中的16个独立按键相比体积更小,实现的功能相同。

电路图(protues)4)全局设计:通过STC89C52的P3.0-P3.7口读入4*4矩阵键盘的按键输入数据,STC89C52的P0.0-P0.7先接入8位1k欧姆排阻作上拉电阻,再接入1602液晶屏幕的数据口D01-D07,输出数据到1602液晶屏幕,液晶屏幕显示读到的数据。

P2.1-P2.3口分别接入1602的RS、RW、E控制读写。

P2.4-P2.5口分别接入1独立按键最为“确定”键和“清零”键。

STC89C52的RST接VCC电源,即上点就复位。

XTAL1,XTAL2接12MHz无源晶振。

4、软件设计(包括流程图及程序)1)程序流程图:2)程序代码:#include<reg52.h> //#include<intrins.h>sbit RS = P2^1; //定义端口sbit RW = P2^2;sbit EN = P2^3;sbit QL = P2^4; //外接清零端口sbit QD = P2^5; //外接确定端口sbit wela=P2^7;//锁存器控制端定义unsigned int qlbz=0;unsigned int qdbz=0;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0#define KeyPort P3unsigned char code asc_code[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//转换成液晶显示的字符/*------------------------------------------------uS延时函数------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------ mS延时函数------------------------------------------------*/ void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com){while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/void LCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/*------------------------------------------------按键扫描函数0,返回小键盘扫描键值------------------------------------------------*/unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法{unsigned char cord_h,cord_l;//行列值中间变量KeyPort=0x0f; //行线输出全为0cord_h=KeyPort&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{DelayMs(100); //去抖if((KeyPort&0x0f)!=0x0f){cord_h=KeyPort&0x0f; //读入列线值KeyPort=cord_h|0xf0; //输出当前列线值cord_l=KeyPort&0xf0; //读入行线值while((KeyPort&0xf0)!=0xf0);//等待松开并输出return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}/*------------------------------------------------按键扫描函数1,返回确定键扫描键值------------------------------------------------*/ unsigned char KeyScanQD(void) //键盘扫描函数{if(QD != 1) //先检测有无按键按下{DelayMs(100); //去抖if(QD != 1){while(QD == 0);//等待松开并输出}qdbz=1;}return(0); //返回该值}/*------------------------------------------------ 按键扫描函数2,返回清零键扫描键值------------------------------------------------*/ unsigned char KeyScanQL(void) //键盘扫描函数{if(QL != 1) //先检测有无按键按下{DelayMs(100); //去抖if(QL != 1){while(QL == 0);//等待松开并输出}qlbz=1;}return(0); //返回该值}/*------------------------------------------------ 按键值处理函数,返回扫键值------------------------------------------------*/ unsigned char KeyPro(void){switch(KeyScan()){case 0x7e:return 1;break;//0 按下相应的键显示相对应的码值 case 0x7d:return 2;break;//1case 0x7b:return 3;break;//2case 0x77:return 4;break;//3case 0xbe:return 5;break;//4case 0xbd:return 6;break;//5case 0xbb:return 7;break;//6case 0xb7:return 8;break;//7case 0xde:return 9;break;//8case 0xdd:return 0;break;//9case 0xdb:return 10;break;//acase 0xd7:return 11;break;//bcase 0xee:return 12;break;//ccase 0xed:return 13;break;//dcase 0xeb:return 14;break;//ecase 0xe7:return 15;break;//fdefault:return 0xff;break;}}/*------------------------------------------------主函数------------------------------------------------*/void main(void){unsigned int i,j,k,kk,Jz,num,n,t1,t2,a,b,x,y;unsigned char jinzhishu1[2],jinzhishu2[2];unsigned char dushu[16];unsigned char dushu2[16];LCD_Init();wela=1;P0=0Xff;wela=0;//关闭数码管LCD_Write_Com(0x0F);//光标开,光标闪烁开while (1){LCD_Clear();/*下为输入部分 *******************************************/A1:jinzhishu1[1]=' ';jinzhishu1[2]=' ';LCD_Write_String(0,0,"Enter IN system");i=0;while(qdbz==0){Jz=KeyPro();if(Jz!=0xff){LCD_Write_Char(i,1,asc_code[Jz]);//依次显示输入字符 jinzhishu1[i]=asc_code[Jz];i++;}KeyScanQD();KeyScanQL();if (qlbz==1){qlbz=0; LCD_Clear(); i=0; j=0;goto A1;}if(i==2) qdbz=1;}qdbz=0;LCD_Write_String(0,1," ");if (jinzhishu1[0]=='1'&&jinzhishu1[1]=='0') a=10;else if (jinzhishu1[0]=='2'&&jinzhishu1[1]==' ') a=2;else if (jinzhishu1[0]=='8'&&jinzhishu1[1]==' ') a=8;else if (jinzhishu1[0]=='1'&&jinzhishu1[1]=='6') a=16;else{LCD_Write_String(0,0,"Wrong IN system");while(qdbz==0){KeyScanQD();}qdbz=0;goto A1;}A2:for(i=0;i<16;i++){dushu2[i]=' ';dushu[i]=' ';}LCD_Write_String(0,0,"Enter IN number");i=0;while(qdbz==0){num=KeyPro();if(num!=0xff){LCD_Write_Char(i,1,asc_code[num]);//依次显示输入字符dushu2[i]=num;i++;}KeyScanQD();KeyScanQL();if (qlbz==1){qlbz=0; LCD_Clear(); i=0; j=0;goto A2;}if(i==15) qdbz=1;}n=i;qdbz=0;LCD_Write_String(0,1," ");A3:jinzhishu2[1]=' ';jinzhishu2[2]=' ';LCD_Write_String(0,0,"Enter OUT system");i=0;while(qdbz==0){Jz=KeyPro();if(Jz!=0xff){LCD_Write_Char(i,1,asc_code[Jz]);//依次显示输入字符jinzhishu2[i]=asc_code[Jz];i++;}KeyScanQD();KeyScanQL();if (qlbz==1){qlbz=0; LCD_Clear(); i=0; j=0;goto A3;}if(i==2) qdbz=1;}qdbz=0;LCD_Write_String(0,1," ");if (jinzhishu2[0]=='1'&&jinzhishu2[1]=='0') b=10;else if (jinzhishu2[0]=='2'&&jinzhishu2[1]==' ') b=2;else if (jinzhishu2[0]=='8'&&jinzhishu2[1]==' ') b=8;else if (jinzhishu2[0]=='1'&&jinzhishu2[1]=='6') b=16;else{LCD_Write_String(0,0,"Wrong OUT system");while(qdbz==0){KeyScanQD();}qdbz=0;goto A3;}/*下为运算部分 *******************************************/ n=n-1;t2=dushu2[0];for(j=0;j<n;j++){t1=t2*a;t2=t1+dushu2[j+1];}x=t2; //输入的10进制数先转为10进制for(j=0;x>=b;j++){y=x%b;x=x/b;dushu[j]= asc_code[y];}y=x;dushu[j]= asc_code[y];k=j;kk=j;for(i=0;i<=kk;i++,k--){dushu2[i]=dushu[k];}for(i=0;i<=kk;i++){dushu[i]=dushu2[i];}/*下为输出部分 *******************************************/ LCD_Write_String(0,0,"The OUT number");LCD_Write_String(0,1," ");LCD_Write_String(0,1,dushu);while(qdbz==0){KeyScanQD();KeyScanQL();}qdbz=0;}}5、调试过程(包括出现的问题及解决的方法,以及要改进的地方,体会)1)硬件调试:焊接最小系统板完成之后就开始测试是否有焊接错误,首先是检验单片机的底座针脚是否联通,通过LED灯测试证明了所有的底座针脚焊接无误。

相关文档
最新文档