独立按键实现简单计数器
- 格式:doc
- 大小:265.00 KB
- 文档页数:1
基于51单片机的简易计算器设计【摘要】单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。
本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除八位数范围内的基本四则运算,并在LCD上显示相应的结果。
设计电路采用AT89S51单片机为主要控制电路,利用4*4矩阵键盘作为计算器的数字以及运算符的输入。
显示采用字符LCD静态显示。
软件方面使用C语言编程,并用开发板制作并演示。
【关键词】计算器,单片机,LCD,矩阵键盘AbstractThe emergence of computer chip manufacturing technology, rapid development of the product, which is the core of embedded control systems, and now, it has been widely applied to all areas of our lives, electronics, technology, communications, automotive, industrial and so on. The design is based on the 51 computers for digital system design calculator, you can complete the calculator keyboard, to add, subtract, multiply, and divide within the scope of the basic six-digit arithmetic, and the corresponding results on the LCD display . AT89C51 microcontroller circuit design as the main control circuit, use MM74C922 4 * 4 keypad as a calculator scan IC to read keyboard input. Character LCD display with a static display. Software using the C programming language, and use PROTUES simulation.Keywords:calculator,MCU,LCD,Matrix keyboard目录摘要 (1)一、系统总体设计 (1)1.1设计概述 (1)1.2设计思路 (1)1.3系统总体模块图: (2)1.4系统方案 (2)二、硬件系统设计 (2)2.1主控芯片A T89S52单片机 (2)2.2 LCD1602液晶显示屏 (3)2.3键盘接口电路 (4)2.4 清零、音乐开关、开方和多次方运算功能模块 (5)2.5电源模块设计 (6)三、软件系统设计 (6)3.1总体设计 (6)3.2子程序设计 (8)3.2.1液晶显示程序设计 (8)3.2.2 矩阵键盘扫描程序设计 (8)3.2.3 AC清零程序设计 (9)3.2.4 声音开关子程序设计 (10)四、系统功能测试 (10)4.1总体实物测试 (10)4.2 各项功能测试 (11)4.3 多次测试 (11)五、总结 (12)六、结束语 (12)参考文献 (13)附录 (14)附1:计算器原理图 (14)附2:主程序清单 (14)附3:键盘扫描子程序 (21)附4:LCD1602显示程序 (24)附5:LCD1602显示字符表 (28)附6: LCD接口信号说明 (29)附7: LCD写操作时序图 (29)一、系统总体设计1.1设计概述本设计使用AT89S52单片机作为主控芯片,通过计算机键盘进行数据输入,进行相应的加、减、乘、除的运算,并在LCD上显示相应的结果,主要功能特点如下:(1)LCD的第一行显示运算式子,第二行显示运算结果,在任何时候按下AC清零按键时候,都必须退出当前计算,返回初始状态,等下新的一次运算。
AT89C51单片机简易计算器的设计单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。
本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除六位数范围内的基本四则运算,并在LCD上显示相应的结果。
设计电路采用AT89C51单片机为主要控制电路,利用MM74C922作为计算器4*4键盘的扫描IC读取键盘上的输入。
显示采用字符LCD静态显示。
软件方面使用C语言编程,并用PROTUES仿真。
一、总体设计根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。
》(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。
(3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。
(4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD 上提示错误。
系统模块图:二、硬件设计(一)、总体硬件设计/本设计选用AT89C51单片机为主控单元。
显示部分:采用LCD 静态显示。
按键部分:采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。
总体设计效果如下图:(二)、键盘接口电路计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
基于单片机的简单计算器计算器是我们日常生活中常用的工具之一,用于进行各种数学运算。
在计算机科学领域,我们可以利用单片机来制作一个简单的计算器,以满足计算需求。
本文将介绍基于单片机的简单计算器的实现过程和相关原理。
一、项目概述我们将利用单片机的计算能力和显示功能来制作这个简单计算器。
用户可以通过按键来输入数字和运算符,计算器将会实时显示计算结果。
在本项目中,我们将使用8051系列单片机和LCD显示屏来实现这个计算器。
二、系统设计1.硬件设计本项目所需的硬件主要包括单片机、键盘和显示屏。
我们可以使用8051系列的单片机,例如AT89C52、键盘可以通过矩阵键盘来实现,显示屏采用16x2字符型LCD显示屏。
2.软件设计在单片机上实现计算器功能,我们需要编写相应的软件程序。
该程序主要包括以下几个部分:(1)初始化设置:设置单片机的IO口模式和状态,初始化LCD显示屏。
(2)键盘扫描:通过轮询方式检测键盘输入,获取用户按键信息。
(3)数字显示:将用户输入的数字显示在LCD屏幕上。
(4)运算处理:根据用户输入的数字和运算符进行相应的运算操作。
(5)结果显示:将运算结果显示在LCD屏幕上。
三、主要功能模块介绍1.初始化设置在初始化设置模块中,我们需要设置单片机的IO口模式和状态,将其中的一组IO口作为输入端口用于键盘扫描,另一组IO口作为输出端口用于LCD显示屏控制。
同时需要初始化LCD显示屏,使其处于工作状态。
2.键盘扫描键盘扫描模块需要使用IO口作为输入端口来检测键盘输入。
通过按下不同的按键,会在IO口上产生不同的信号。
我们可以使用轮询方式来检测IO口的状态,获取用户按键信息。
3.数字显示在数字显示模块中,我们需要将用户输入的数字显示在LCD屏幕上。
可以使用LCD显示屏的库函数来实现这个功能。
我们可以将用户输入的数字存储在内存中,并通过LCD库函数将其显示在屏幕上。
4.运算处理运算处理模块需要根据用户输入的数字和运算符进行相应的运算操作。
计算器(Calculator)是微型电子计算机的一种特殊类型。
它与一般通用计算机的主要区别在于程序输入方式的不同。
计算器的程序一般都已经固定,只需按键输入数据和运算符号就会得出结果,很容易就能掌握。
而一般计算机的程序可以根据需要随时改动,或重新输入新的程序。
简易计算器主要用于加减乘除;科学计算器,又增添了初等函数运算(有的还带有数据总加、求平均值等统计运算)。
现代电子计算器首次问世是1963年。
那时的计算器是台式的,在美国波士顿的电子博览会上展出过。
与计算机相比,它小巧玲珑,计算迅捷,一般问题不必事先编写复杂的程序。
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能机器人。
随着社会需求,计算器也从原有单一的数字加减计算演变为复杂的多种运算。
现在不在单一的在某一方面而是涉及到生活的方方面面.由于我对知识掌握的不够熟练,重点不够清楚,导致在重点与非重点处花费的时间不成比例,进度缓慢,这是设计没能全部完成的部分原因。
目前只做到按键与显示的结合(即在显示器上可以显示数字键还有命令键+-*/ =清零);加法子程序已经编写成功并严整无误,但在整体调试中未能圆满实现,本部分正在调试中。
等调试成功后,其它运算子程序的问题将迎刃而解。
引言 (1)目录 (2)1.简易计算器的设计方案 (3)1.1硬件部分设计方案 (3)1.2软件部分设计 (3)1.3 硬件设计原理图 (4)2. 简易计算器部分电路设计 (5)2.1 AT89C51常用指令 (5)2.2 显示及显示接口 (11)2.3 键盘、液晶显示的组合接口 (15)2.4 算术逻辑运算处理 (18)3.总设计电路及调试 (19)致谢 (21)参考文献 (22)1.简易计算器的设计方案1.1硬件部分设计方案1 单片机部分单片机以AT89C51来做为核心元器件。
扬州大学能源与动力工程学院课程设计报告题目:计数器课程:单片机原理及应用课程设计专业:电气工程及其自动化班级:电气1001*名:**学号:*********第一部分任务书《单片机原理及应用》课程设计任务书一、课题名称音乐倒数计数器二、课程设计目的课程设计是课程教学中的一项重要内容,是达到教学目标的重要环节,是综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要的意义。
《单片机原理及应用》是一门理论性、实用性和实践性都很强的课程,课程设计环节应占有更加重要的地位。
单片机原理及应用课程设计的目的是让学生在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能将课堂上学到的理论知识与实际应用结合起来,而且能进一步加深对电子电路、电子元器件等知识的认识与理解,同时在软件编程、排错调试、相关软件和仪器设备的使用技能等方面得到较全面的锻炼和提高。
为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。
通过单片机硬件和软件设计、调试、整理资料等环节的培训,使学生初步掌握工程设计方法和组织实践的基本技能,逐步熟悉开展科学实践的程序和方法。
三、课程设计内容设计以89C51单片机和外围元器件构成的单片机应用系统,并完成相应的软硬件调试。
1. 系统方案设计:综合运用单片机课程中所学到的理论知识,学生根据所选课题的任务、要求和条件进行总体方案的设计。
2. 硬件电路设计:对方案中以单片机为核心的电路进行设计计算,包括元器件的选择和电路参数的计算,并画出总体电路图。
3. 软件设计:根据已设计出的软件系统框图,用汇编语言或C51编制出各功能模块的子程序和整机软件系统的主程序。
4. 调试:在单片机EDA仿真软件环境Proteus下进行仿真设计并调试;或在单片机周立功实验箱上进行相关设计并调试。
一、实训目的本次实训旨在通过设计并实现一个简单的按键计数器,使学生能够巩固和加深对数字电路、微控制器原理以及程序设计的基本知识和技能。
通过实训,学生能够学会使用微控制器进行硬件设计和程序设计,熟悉按键去抖动处理、中断控制以及数码管显示等关键技术,培养独立解决问题的能力。
二、实训内容1. 硬件设计- 选择合适的微控制器作为核心处理单元,本实训选择AT89C51单片机。
- 设计电路原理图,包括按键输入、计数器电路、数码管显示电路以及必要的去抖动电路。
- 选择合适的按键和数码管,本实训选择常用的机械按键和共阳极数码管。
2. 软件设计- 编写汇编语言程序,实现按键的检测、去抖动处理、计数以及数码管显示功能。
- 使用中断技术实现按键的快速响应,提高系统的实时性。
3. 系统集成与调试- 将硬件电路与软件程序结合起来,进行系统集成。
- 通过实验验证系统的功能,并对程序和电路进行调试,确保系统稳定可靠运行。
三、实训步骤1. 原理图设计- 根据实训要求,设计按键输入电路,包括按键连接和去抖动电路。
- 设计计数器电路,利用单片机的I/O口连接数码管。
- 绘制原理图,并确保电路的连通性和正确性。
2. 程序编写- 使用汇编语言编写程序,实现以下功能:- 按键去抖动:检测按键状态,并在按键稳定后进行计数。
- 计数功能:对按键按下次数进行计数,并更新数码管显示。
- 中断处理:设置外部中断,实现对按键的快速响应。
3. 系统集成- 将编写好的程序烧录到单片机中。
- 将硬件电路连接到开发板上,包括按键、数码管和去抖动电路。
- 确保所有连接正确无误。
4. 调试与测试- 通过按键测试计数功能,观察数码管显示是否正确。
- 对程序进行调试,确保计数准确无误,且按键去抖动效果良好。
- 测试中断响应速度,确保系统实时性。
四、实训结果与分析1. 硬件实现- 成功设计并搭建了按键计数器硬件电路,包括按键输入、计数器和数码管显示。
- 电路连接正确,无短路或开路现象。
宁德师范学院计算机系
实验报告
(2014—2015学年第2学期)
课程名称单片机原理
实验名称独立按键识别
专业计算机科学与技术(软工)年级2012级
学号B2012103145 姓名冯武
指导教师杨烈君
实验日期2015.5.27
实验步骤、实验结果及分析:
1 实验步骤:
1、使用
Proteus ISIS 7 Professional应用程序,建立一个.DSN文件
2、在“库”下拉菜单中,选中“拾取元件”(快捷键P),分别选择以下元件:AT89C51、CAP、CAP-ELEC、CRYSTAL、RESPACK-8。
3、构建仿真电路
图1 按键识别1、2
图2 按键识别3
图3按一下暂停
图4归零
图5时钟调整
电路图
注:1、报告内的项目或设置,可根据实际情况加以补充和调整
2、教师批改学生实验报告应在学生提交实验报告10日内。
实验项目五独立按键电路的设计与仿真[实验目的]1.掌握独立键盘的工作原理2.掌握独立键盘硬件电路的设计方法3.掌握对独立键盘的控制方法[实验原理][实验仪器]PC机一台[Proteus用到器件的关键词]单片机(at89c52)、数码管(7seg-com-cathode)、排阻(respack-7)、按键(button)、蜂鸣器(buzzer active)[实验内容与步骤]1.用Proteus软件设计出独立键盘接口电路原理图。
2.用P2.1口来控制独立键盘ADDKEY,每按一次按键,让数码管显示的数值加1一次,一直加到9,再按一次,数码管重新显示0。
同时,每按一次键,蜂鸣器会发“滴”的声音。
3.在进行按键处理时,要注意按键去抖动的软件处理方法,在按键松开时要进行按键松手检测。
4.用Keil编写程序,完上上面所描述的任务,最后调试程序、编译后生成HEX文件。
5.将HEX文件装载到MCU AT89C52中,单击Start按钮开始动态仿真。
[实验数据记录]ADDKEY BIT P2.1BEEP BIT P2.6ORG 0000HAJMP MAINORG 0050HMAIN: MOV P0,#00HLCALL DELAYMOV DPTR,#0100HLP: JB ADDKEY,$ ;检测到有键按下CLR BEEPLCALL DELAY ;软件延时去抖SETB BEEPJB ADDKEY,$ ;确实有键按下JNB ADDKEY,$ ;松手检测LCALL DISPLAYSJMP LPDISPLAY:MOVC A,@A+DPTRMOV P0,AINC DPTRCLR AMOV R2,DPLCJNE R2,#10,DONE ;数码显示到9,给DPL重新赋值,并清零计数器R2MOV R2,#00HMOV DPL,#00HDONE: RETDELAY: MOV R0,#64H ;延时100msDL1: MOV R1,#0C8HDL2: NOPNOPNOPDJNZ R1,DL2DJNZ R0,DL1RETORG 0100HTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;段选代码,对应0123456789 END[实验数据处理][实验结果及讨论]。
实验5 独立键盘和矩阵键盘一、实验目的1、学会用C语言进行独立按键应用程序的设计。
2、学会用C语言进行矩阵按键应用程序的设计。
二、实验内容1、独立按键:对四个独立按键编写程序:当按k1时,8个LED同时100ms闪烁;当按k2时,8个LED从左到右流水灯显示;当按k3时,8个LED从右到左流水灯显示;当按k4时,8各LED同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭;2、矩阵按键:采用键盘扫描方式,顺序按下矩阵键盘后,在一个数码管上顺序显示0~F,采用静态显示即可。
3、提高部分(独立按键、定时器、数码管动态扫描):编写程序,实现下面的功能。
用数码管的两位显示一个十进制数,变化范围为00~59,开始时显示00,每按一次k1,数值加1;每按一次k2,数值减1;每按一次k3,数值归零;按下k4,利用定时器功能使数值开始自动每秒加1;再按一次k4,数值停止自动加1,保持显示原数。
三、实验步骤1、硬件连接(1)使用MicroUSB数据线,将实验开发板与微型计算机连接起来;(2)在实验开发板上,用数据线将相应接口连接起来;2、程序烧入软件的使用使用普中ISP软件将HEX文件下载至单片机芯片内。
查看结果是否正确。
四、实验结果——源代码1. #include "reg52.h"typedef unsigned char u8;typedef unsigned int u16;#define LED P2sbit key1=P3^1;sbit key2=P3^0;sbit key3=P3^2;sbit key4=P3^3;const char tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; u8 code begMid[]={0x7e, 0xbd,0xdb,0xe7, 0xdb, 0xbd, 0x7e}; void Delay(u16 i){ while(i--);}void KeyDown(){u8 i;if(key2==0){Delay(1000);if(key2==0){for(i=0;i<8;i++){LED=tab[i];Delay(50000);}while(!key2);}LED=0xff;}else if(key1==0){Delay(1000);if(key1==0)for(i=0;i<3;i++){LED=0x00;Delay(10000);LED=0xff;Delay(10000);}}}}void Int0Init(){IT0=1;EX0=1;EA=1;}void Int1Init(){IT1=1;EX1=1;EA=1;} void main(){Int0Init();Int1Init();while(1){KeyDown();}}void Int0() interrupt 0{u8 i;if(key3==0){Delay(1000);if(key3==0)for(i=7;i>=0;i--){LED=tab[i];Delay(50000);}}}}void Int1() interrupt 2{u8 i;if(key4==0){Delay(1000);if(key4==0){for(i=0;i<=6;i++){LED=begMid[i];Delay(50000);}}}}2.#include "reg52.h"typedef unsigned int u16;typedef unsigned char u8;#define GPIO_DIG P0#define GPIO_KEY P1sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 KeyValue;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//??0~F?? void delay(u16 i){while(i--);}void KeyDown(void){char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f){delay(1000);if(GPIO_KEY!=0x0f){GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07): KeyValue=0;break;case(0X0b): KeyValue=1;break;case(0X0d): KeyValue=2;break;case(0X0e): KeyValue=3;break;}GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0): KeyValue=KeyValue+12;break;}while((a<50)&&(GPIO_KEY!=0xf0)){delay(1000);a++;}}}}void main(){LSA=0;LSB=0;LSC=0;while(1){KeyDown();GPIO_DIG=smgduan[KeyValue];}}3.#include <reg52.h>typedef unsigned int u16;typedef unsigned char u8;#define KEYPORT P3sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit key1=P3^1;sbit key2=P3^0;sbit key3=P3^2;sbit key4=P3^3;u16 t;u8 sec;u8 DisplayData[2];u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void Time1Init(){TMOD |= 0x10;TH1=0Xd8;TL1=0Xf0;EA=1;ET1=1;}void delay(u16 i){while(i--); }void DigDisplay(){u8 i;for(i=0;i<2;i++){switch(i){case 0:LSA=0;LSB=0;LSC=0;break;case 1:LSA=1;LSB=0;LSC=0;break;}P0=DisplayData[i];delay(100);P0=0x00;}}void datapros(){DisplayData[0]=smgduan[sec%10];DisplayData[1]=smgduan[sec/10];}void main(){Time1Init();while(1){if(key4==0){delay(1000);if(key4==0){TR1=!TR1;while(key4==0);}}if(key3==0){delay(1000);if(key3==0){sec=0;while(key3==0);}}if(key2==0){delay(1000);if(key2==0){sec--;while(key2==0);}}if(key1==0){delay(1000);if(key1==0){sec++;while(key1==0);}}}}void Time1() interrupt 2{TH1=0Xd8;TL1=0Xf0;t++;if(t==100){t=0;sec++;if(sec>=60){sec=0;}}datapros();DigDisplay();}五、实验体会——结果分析1、独立按键:位定义四个按键key1、key2、key3、key4,宏定义LED为P2口,tab数组保存流水灯D0-D7依次点亮的数值,begMid数组保存流水灯同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭的赋值方式。