基于stc89c52单片机制作的 计算器 程序

合集下载

基于STC89C52的简易计算器设计..

基于STC89C52的简易计算器设计..

福建电力职业技术学院课程设计课程名称:《智能仪器》题目:基于STC89C52的简易计算器设计专业班次:姓名:学号:指导教师:学期:2011-2012学年第2学期日期:2012.2目录目录1.引言 (1)1.1 设计意义 (1)1.2 设计任务和主要内容 (1)2. 硬件设计 (2)2.1 系统框图 (2)2.2 最小系统 (2)2.3 矩阵键盘 (3)2.4 LCD1602 (4)3. 软件设计 (5)3.1矩阵键盘扫描原理 (5)3.2 LCD1602的软件设计 (6)3.3 主程序设计 (8)3.4 源程序 (9)3.5 调试结果 (9)4. 设计小结 (9)参考文献 (10)附录 (10)1.引言随着社会的发展,人们生活水平的提高,单片机的应用越来越贴近生活了,人们常用单片机来实现一些简单的电子设计。

计算器在人们的日常生活中是不可或缺的电子产品之一,目前市场上的计算器基本可以满足我们的日常需求,但它还在发展之中,我们要继续研究出更加强大的计算器。

基于这样的理念,本设计采用单片机来设计简易计算器。

本设计是以STC89C52为单片机,LCD为显示器设计的简易计算器,所设计的计算器将完成两位数的加、减、乘、除等功能。

1.1 设计意义通过本次课程设计,进一步掌握单片机知识,知道AT89S52单片机的原理、编程和各种功能的应用,了解简易计算器的工作原理,初步掌握计算器的硬软件设计、编写、调试和仿真,充分提高动手能力和排除故障的能力,同时通过课程设计加深我们对单片机的认识和兴趣,发挥我们的创新能力和动手能力。

1.2 设计任务和主要内容本设计要制作的就是单片机于生活中最为常见的一种应用——简易计算器,以STC89C52单片机作为核心来进行的数字计算器模拟系统设计,可以完成计算器的键盘输入,进行加、减、乘、除两位数范围内的基本四则运算,并在LCD 上显示相应的结果。

设计电路采用AT89C51单片机为主要控制电路,显示采用LCD静态显示,软件方面使用C语言编程,并用PROTUES仿真。

基于STC89C52单片机的计算器

基于STC89C52单片机的计算器

基于STC89C52单片机的计算器一、引言计算器是一种用于进行数学运算的设备。

在现代社会中,计算器被广泛应用于各个领域,包括教育、科学研究、工程设计等。

本篇文章将介绍基于STC89C52单片机的计算器设计。

二、设计目标本设计的目标是实现一个简单的、功能齐全的四则运算计算器。

该计算器具有基本的加、减、乘、除运算功能,可以进行整数和小数的运算。

同时,该计算器还具备清零、撤回、保存结果等辅助功能。

三、硬件设计1.单片机选择本设计选择STC89C52单片机作为主控芯片。

STC89C52是一款具有低功耗、高性能的单片机,拥有8位宽的数据总线和16位宽的地址总线,适用于本设计所需的计算器功能。

2.显示器选择本设计选择8位共阳数码管作为显示器。

由于STC89C52单片机的IO 口输出电流较小,为了驱动数码管显示,需要通过数码管驱动芯片进行扩展以增大驱动电流。

3.按键选择本设计选择矩阵键盘作为输入设备。

根据计算器所需的功能,可以设置数字键、运算符键、功能键等按键。

四、软件设计1.指令集设计本设计根据计算器功能的需求,设计了一套适合STC89C52单片机的指令集。

包括加法指令、减法指令、乘法指令、除法指令等,以及相应的操作数寻址方式。

2.界面设计本设计通过8位共阳数码管显示器和矩阵键盘构建了计算器的界面。

通过编程实现数码管显示数字和结果,以及按键的检测和响应。

3.运算功能实现本设计通过编程实现了加法、减法、乘法、除法等基本运算功能。

通过数码管显示输入的数字和结果,实现了计算器的正常运算。

4.辅助功能实现本设计通过编程实现了清零、撤回、保存结果等辅助功能。

通过按下相应的功能键,可以实现清除当前输入、撤回上一步操作或保存当前结果等操作。

五、实验验证六、结论通过本次设计,成功实现了基于STC89C52单片机的四则运算计算器。

该计算器具有基本的加、减、乘、除运算功能,可以进行整数和小数的运算。

同时,该计算器还具备清零、撤回、保存结果等辅助功能。

基于STC89C52单片机的简易计算器

基于STC89C52单片机的简易计算器

基于STC89C52单片机的简易计算器目录内容摘要 (2)关键词 (2)ABSTRACT (2)1绪论 (2)2系统设计 (4)2.1设计任务与要求 (4)2.2总体设计方案 (5)3系统硬件设计 (6)3.1控制器模块 (6)3.2按键模块 (7)3.3时钟日期模块 (9)3.4液晶显示屏显示模块 (12)3.5硬件元件清单 (14)4软件设计与仿真 (14)4.1主程序设计 (15)4.2仿真结果 (18)4.3系统调试 (19)5参考文献 (19)内容摘要:该计算器以STC89C52单片机为核心控制芯片,实现了简单的加、减、乘、除功能,采取的是键盘输入和液晶显示屏的输出结果显示。

主要硬件构成部分由五个:一个STC89C52单片机芯片,一个液晶显示屏(LCD),一个4*4矩阵键盘和一个时钟芯片(DS1302)一个蜂鸣器,可以实现8位的整数数值操作计算。

附加时钟显示的功能。

关键词:单片机STC89C52 液晶显示屏LCD 时钟芯片DS1302 Abstract:The calculator with STC89C52 single chip as the core control chip, the realization of a simple addition, subtraction, multiplication, in addition to function, is taken by the keyboard input and liquid crystal display outputThe desigh. is taken by the keyboard input and liquid crystal display output. The main hardware components from five: a STC89C52 chip, a liquid crystal display ( LCD ), a 4 x 4 matrix keyboard and a clock chip ( DS1302 ) a buzzer, can achieve a 8 bit integer numerical operation calculation. Additional clock display function.Keywords:The single chip computerSTC 89 C52 Liquid crystal display (LCD) LED the Clock DS1302 chip1.绪论:单片机是指一个集成在一块芯片上的完整计算机系统。

基于STC89C52单片机的计算器

基于STC89C52单片机的计算器

基于STC89C52单片机的计算器一、引言计算器作为一种常见的电子设备,经常被人们用于日常的数学计算。

本文将介绍一种基于STC89C52单片机的计算器的设计与实现。

该计算器具有基本的四则运算功能,并且支持浮点数的运算。

二、硬件设计1.单片机选择本文选择STC89C52单片机作为计算器的核心处理器。

STC89C52是基于8051架构的单片机,具有强大的计算和控制能力,适合用于计算器的设计。

2.显示器设计本文选用16x2LCD液晶显示器作为计算器的显示器。

液晶显示器具有容量小、功耗低、反射型等优点,非常适合计算器的显示要求。

3.按键设计本文选用矩阵按键设计。

通过矩阵按键设计,可以设计出较多的按键功能,并且能够节省IO口的使用。

4.电源设计计算器使用直流电源供电,可以选择使用电池或者外部电源适配器供电。

三、软件设计计算器的软件设计主要包括界面设计和计算功能设计两个方面。

1.界面设计计算器的界面设计主要包括显示数字和调用函数。

a.显示数字通过将用户输入的数字显示到LCD液晶屏上,实现数字的显示功能。

液晶屏可以显示16个字符,可以一次性显示一个较长的数字。

b.调用函数通过监测用户按键的输入,调用相应的函数实现计算功能。

可以设置加、减、乘、除等函数,并通过按键的组合调用相应的函数。

2.计算功能设计计算器的计算功能设计主要包括四则运算和浮点数运算两个方面。

a.四则运算通过四个函数实现加、减、乘、除的功能。

在用户按下相应的运算符号键后,调用相应的函数对输入的数字进行相应的运算,并将结果显示在LCD液晶屏上。

b.浮点数运算在用户输入的数字或运算结果存在小数的情况下,可以设计相应的浮点数运算函数,通过运算可以得到带有小数点的结果,并将结果显示在LCD液晶屏上。

四、系统实现五、总结基于STC89C52单片机的计算器设计和实现包括硬件设计和软件设计两个方面。

通过合理的硬件设计和功能完善的软件设计,可以实现一款功能强大的计算器。

基于stc89c52单片机的红外计数器设计及实现

基于stc89c52单片机的红外计数器设计及实现

基于stc89c52单片机的红外计数器设计及实现在近些年来,随着单片机技术的飞速发展,红外计数器的应用越来越广泛。

红外计数器可以用于计算小物体的移动速度,以及检测和控制机器的操作状态等方面,可以大大提高工厂生产效率。

本文主要讲述如何基于STC89C52单片机设计并实现一个红外计数器,以达到实时统计红外信号源(如红外线)的发射次数。

1、硬件结构本文采用的是基于STC89C52单片机的红外计数器硬件结构,主要包括红外接收模块、STC89C52单片机、数据的输出模块和LCD显示模块。

红外接收模块主要功能是接收红外信号,将接收到的红外信号转换成电信号,然后输出电信号;STC89C52单片机的主要功能是接收红外信号,根据信号具体内容,操控数据的输出模块,实现红外信号源发射次数的统计及实时更新;数据输出模块在STC89C52单片机控制下,将电子计数器的内部数据输出;LCD显示模块的主要功能是将STC89C52单片机里的统计数值显示出来。

2、软件设计本设计程序由两个部分组成:主程序及计数程序。

(1)主程序:主程序中定义了系统总体框架,系统初始化,红外信号检测,数据输出及LCD显示等等功能,控制了系统的整体运行。

(2)计数程序:计数程序控制电子计数器的计数及清零,以及计数器的值输出等功能。

3、实验结果本文采用STC89C52单片机、红外接收模块、数据输出模块和LCD 显示模块的组合实现了一个简单的红外计数器,在实验中可以检测到红外信号,并精确计数出接收到的次数,从而实现了对红外信号源的统计及实时更新。

4、总结本文基于STC89C52单片机实现了一个简单的红外计数器,它可以实时统计红外信号源(如红外线)的发射次数,从而提升工厂生产效率。

本文采用的芯片型号和计数器结构稳定可靠,也可以根据具体实际情况进行改进和优化。

此外,也可以采用更复杂的结构进行改进,从而使系统计数更加精准,效率更高。

基于89c52单片机的智能计算器程序

基于89c52单片机的智能计算器程序
Main.c
#include<reg52.h>
#include"lcd.h"
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit led=P3^7;
sbit beep=P2^0;
uint8 key,num;
uint8 fuhao;//定义具体的那个符号,是加减还是乘除。
else
{
//led=1;
b=b*10+dat1[num];
}
}
else
{
flag=1;
fuhao=3;//带表乘号*
}
lcdwrd(0x30+dat1[num]);
}
P1=0xf7;//令第四行为0,判断哪一列按下
if(P1!=0xf7)
{
delay(1000);
if(P1!=0xf7)
{
key=P1&0xf0;
{
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
}
lcdwrd(0x3d); //显示等于号=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
if(fuhao==2) //减
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
void delay(uint16 i)
{
while(i--);
}
void lcdwrc(uint8 c)
{
LcdWriteCom(c);

电子设计-基于STC89C52RC单片机的简易计算器设计.docx

电子设计-基于STC89C52RC单片机的简易计算器设计.docx

电子设计实验名称:基于STC89C52RC单片机的简易计算器设计姓名:学号:指导老师:一、可行性研究■-二、方案述.....2.1、功能介■■■..3 (4)、设可彳亍性分析:1.2.1经济可行性由于只是实验性质的编程,所以在设计和开发都不需要过多的经费,但是系 统投入运行以后,硕件维护和损耗所造成的耗费是必须的,但是数目也不会很大。

基本功能 .......... 扩展功能 ..........2.2、总体设计方案…… 总体设计思路•- 方案论证与比较系统组成 ........... 三、详细设计 .............1. 各个模块设计…… 输入模块: 运算模块: 显示模块: 阀件电设计 2.键盘扫描•….单片机控制…LCD 1602 显硬件连接121213 14 153.元件的介绍 ........ STC89C52单片机组成 复位和复位电路…•…LCD 1602 显示5 ■5 •6器•……4.PCB 设计以及结果显示五、总结 ...... ....... 附录主要程序代码 .............19 222425所以经过初步分析,经济上基本上是可行的1.2.2技术可行性在技术方面,因为都学习了C语言,硕件课程设计等课程,对于开发语言C语言也有一定的掌控能力,应该能够完成相应的任务。

1.2.3运行可行性该成果简单易操作,非常容易使用。

1.2.4法律可行性由于我们需要完成的功能相对简单,没有太多涉及到很专业方面的内容,更没有计划将系统利用到商业用途,所以不存在侵权或者版权纠纷方面的问题。

125结论该系统的软硬件都比较容易理解和实现,所以,具有实现一计算器的可行性。

二、设计方案简述2.1功能概述系统基本功能:(1)由于设计的计算器要进行四则运算,为了得到较好的显示效果,经综合分析后,最后采用LCD显示数据和结果。

(2)采用键盘输入方式,键盘包括数字键(0〜9)、符号键(+、-、X、清除键(onV )和等号键(=),故只需要16个按键即口J,设计中采用集成的计算 键盘。

基于STC89C52的计算器设计与仿真_宋慧超

基于STC89C52的计算器设计与仿真_宋慧超

……
//算 数 运 算
3 仿真及结果分析 硬件和软件设计分别利用Prot eus与Kei l集成开发环境
实现。C语言程 序 代码由Ke i l 编写并 编译,将产生的可执行 文件加载到Prot eus中[5],实现仿真功能。
系统 仿真 总体电 路图如图2 所 示,系统 启 动后屏 幕上 显 示 欢 迎信息“We l c o m e!”。具体 结 果 演 示 如图3所 示,计 算 器可 以 进行 较 高 精度 的 加 减 乘 除 运 算,支 持小 数 运 算,结 果 保留 到小数点后5位,其中,图3(a)为大数量的加法运算,结果用科 学 记 数 法 显 示;图3 ( b) 为 减 法 运 算,结 果 为负 数;图3 (c) 和图 3(d)分别为乘法、除法运算,结果均保留到小数点后5位。
摘 要:单片机具有体积小、控制功能强、功耗低、环境适应能力强、扩展灵活和使用方便等优点,已广泛应用在生活的各个领
域,该文提出一种基于单片机的高精度计算器设计方案,核心控制系统采用STC89C52单片机,利用LCD1602液晶显示屏显示运
算过程与结果,设计4×4键盘构成按键模块,用来模拟0~9及加、减、乘、除、清零按键。软件程序利用单片机C语言编写,并在
4×4 键盘又称为行列式键盘,它是4条I/O线作为行线, 4 条I/O线作为列线组 成的键 盘,在行线和列线的每 一个交 叉点上设置一个按 键 [3],这种结构可以有效地提高单片机系 统中I/O口的利用率。4 条行线 分别接单片 机 P1.3~P1.0,4 条列线接单片机 P1.4~P1.7,每位按键对应的功能可参见图 2系统硬件仿真图。
公共交 通枢 纽 站的服务范围和服务区域。(2)对 枢 纽的服务 区域 内的 客 流 分布进 行 详 细 分 析,确 定 公共 交 通 枢 纽布置 的 备 选 点,原 则 上 选 取 客 流 量 较 大,换 乘 频 率 较 高 的 客 流 交汇 地 点作为公共 交 通 枢 纽备 选 地 点。(3) 根 据已知 客 流 量,通 过 优化方法在被选枢纽选址中确定交通枢纽的最终地址。

基于stc89c52单片机的红外计数器设计及实现

基于stc89c52单片机的红外计数器设计及实现

基于stc89c52单片机的红外计数器设计及实现摘要:本文介绍了基于STC89C52单片机的红外计数器的设计和实现。

该计数器采用红外传感器作为输入信号,使用单片机作为处理器,能够实现自动计数,可以应用于各种场合的计数任务。

本文从硬件设计、软件设计两个方面进行了详细介绍,并给出了实际测试结果。

关键词:STC89C52单片机;红外计数器;硬件设计;软件设计一、绪论二、硬件设计2.1 红外传感器红外传感器是红外计数器的输入信号源,采用两个红外传感器进行输入信号的采集。

一般来说,红外传感器具有发射管和接收管两部分组成,发射管会发射一个特定频率的红外光,接收管则可以接收这个频率的红外光。

通过发射管和接收管之间的反射和折射效应,可以实现对物体进行探测。

2.2 显示器为了方便实时显示计数结果,该计数器装配了数码管显示器。

数码管显示器可以显示0~9的数字,通过不同的控制信号可以实现不同数字的显示。

2.3 单片机选型由于计数器需要进行计算和显示计数结果,因此需要一款性能优良的单片机来实现这些功能。

本设计采用了STC89C52单片机作为处理器。

STC89C52单片机是一款高性能、低功耗的8位单片机,具有多种外设和扩展接口,适合于各种应用场合。

2.4 电源模块为了保证计数器的正常工作,需要提供稳定可靠的电源。

本设计采用了交流电转直流电的方式,通过稳压芯片将电源输出电压稳定在5V左右,以满足单片机和显示器的工作电压要求。

3.1 程序设计流程该计数器的程序设计采用C语言编写,主要实现了两个功能:读取红外传感器输入的信号,进行计数并更新计数结果。

具体程序设计流程如下:1)初始化端口:设置单片机输入输出管脚的模式和初值。

2)初始化定时器:设置定时器的时钟源、计数模式和计数初值。

3)循环读取输入信号:连续检测两个红外传感器的输入信号,当检测到信号变化时,进行计数并更新计数结果。

4)显示计数结果:将计数结果存储到单片机中的寄存器中,通过数码管实现实时显示。

基于单片机的简易计算器设计

基于单片机的简易计算器设计

2013 - 2014 学年_一_学期山东科技大学电工电子实验教学中心创新性实验研究报告实验项目名称__基于51单片机的简易计算器设计_2013 年12 月27 日四、实验内容2、实验内容(一)、总体硬件设计本设计选用AT89C52单片机为主控单元。

显示部分:采用六位LED动态数码管显示。

按键部分:采用2*8键盘;利用2*8的键盘扫描子程序,读取输入的键值。

(二)、键盘接口电路计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。

矩阵键盘采用两条I/O 线作为行线,八条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为2×8个。

这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。

矩阵键盘的工作原理:计算器的键盘布局如图2所示:一般有16个键组成,在单片机中正好可以用一个P口和另一个P口的两个管脚实现16个按键功能,这种形式在单片机系统中也最常用。

矩阵键盘布局图:矩阵键盘内部电路图如下图所示:(三)、LED显示模块本设计采用LED数码显示来显示输出数据。

通过D0-D7引脚向LED写指令字或写数据以使LED实现不同的功能或显示相应数据。

(四)运算模块(单片机控制)MCS-51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。

如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。

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

通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。

单片机计算器

单片机计算器

二、计算器的设计一、设计目的利用STC89C52进行程序的设计,实现简易计算器功能。

二、功能描述1、设计一个计算器,可以进行四则运算,利用4位数码管显示运算的两数及其运算结果2、键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键。

通过不同的按键执行运算过程。

3、开机显示零,等待键入数值,当键入数字,通过数码管显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。

三、硬件系统设计1、所需设备:单片机实验板,USB 转 RS-232串口线,电脑2、接线设计:1)串口线与单片机实验板的连接对应实验板电路图为:四、软件系统设计1、软件功能模块设计及流程图开机显示零;等待键入数值;当键入数字,通过数码管显示出来;当键入+、-、*、/运算符,计算器在内部执行数值转换和存储;并等待再次键入数值,当再键入数值后将显示键入的数值;按等号就会在数码管上输出运算结果。

工作流程图:完整程序及程序模块注释如下:/******************************************************************** * 文件名:单片机实现计算器功能* 功能描述: 1、设计一个计算器,利用4位数码管显示两数及其加减乘除的结果2、设置初始值0,通过不同的按键来表示两数的运算关系3、通过按键实现清零作用* 程序员:0938003 游瑞蓉* 日期:2012.06.01********************************************************************* /#include <reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charbit keydown;uchar flag=0,scancode=0x0ff,temp=0,t=0;uint data count[4];uchar data dis_buf[4]={0,0,0,0};uchar code dis_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, 0x7c,0x39,0x5e,0x79,0x71};/******************************************************************** * 名称 : init_t0()* 功能 : 定时器********************************************************************* **/void init_t0(){TMOD=0xf1;ET0=1;EA=1;TH0=0x06;TL0=0x06;TR0=1;}/******************************************************************** * 名称 : display()* 功能 : 显示,利用4位数码管显示数值,为0的高位不显示* 输出 : 仅最少的位数显示计算得到的数值********************************************************************* **/void display(void){dis_buf[0]=t/1000;dis_buf[1]=t%1000/100;dis_buf[2]=t%100/10;dis_buf[3]=t%10;}/******************************************************************** * 名称 : display1()* 功能 : 清零显示,利用4位数码管显示数值,仅最低位显示0********************************************************************* **/void display1(void){dis_buf[0]=dis_buf[1]=dis_buf[2]=dis_buf[3]=0;count[0]=count[1]= count[2]= count[3]=0;flag=0;temp=0;t=0;}/******************************************************************** * 名称 : Convert_Scancode()* 功能 : 实现按键的读取。

STC89c52单片机 计算器C语言程序

STC89c52单片机 计算器C语言程序

STC89c52单片机计算器C语言程序STC89C52单片机计算器C语言程序下面是STC89C52单片机计算器的C语言程序,适用于P2位选P0段选时钟12MHZ。

程序代码如下:includedefine uchar unsigned chardefine uint unsigned intuchar Led[17] = {0x3f。

0x06.0x5b。

0x4f。

0x66.0x6d。

0x7d。

0x07.0x7f。

0x6f。

0x77.0x7c。

0x39.0x5e。

0x79.0x71.0x00};long float Number[]={0,0,0,0};uchar A[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};long int D[] = {0,0,0,0,0,0,0,0};uchar code C[] = {0x0.0xFE。

0xFD。

0xFB。

0xF7.0xEF。

0xDF。

0xBF。

0x7F};uchar k=16;uchar b;long float Out_put;uchar e=0;uchar g=0;uchar L=0;uchar g1=0;uchar g2=0;uchar g3=0;uchar g4=0;char j=-1;uchar m=0;uchar n=0;uchar x=0;程序中包含了头文件和宏定义,以及数码管段选、数码管显示位控制寄存器、数码管显示内容寄存器、数码管位选、按键控制变量等各种变量。

其中,Led数组存储了数码管的段选值,Number数组存储了数字,A数组存储了数码管的位选值,D数组存储了数码管的显示内容,C数组存储了数码管的位选值,k、b、Out_put、e、g、L、g1、g2、g3、g4、j、m、n、x 等变量用于按键控制和运算。

代码中没有明显的格式错误,可以直接使用。

下面是已经修改过的文章:uchar xo = 0./*控制开始计数小数点的变量*/long int result;void Delay(uint o) {uint i。

基于STC89C52单片机的计算器

基于STC89C52单片机的计算器

4X4矩阵键盘实现的计算器一、功能实现基本的两个整数加、减、乘、除运算,采用4X4矩阵键盘输入数据,结果由LCD1602显示。

可以显示负数结果,并且还具有清除功能。

该软件基于普中科技的HC6800_EM3 V2.2平台,微处理器为STC89C52单片机。

二、硬件电路图硬件各个部分的电路图如下:1、STC89C52单片机电路图2、LCD1602显示电路图3、矩阵键盘电路图P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0012345678910(+)11(-)12(*)13(/)14(=)15(CLR)三、软件程序1、LCD1602驱动程序(1)LCD1602.c#include <reg52.h>#include <intrins.h>sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EN = P2^7;#define delayNOPs(); {_nop_();_nop_();_nop_();_nop_();};// 延时函数,延时大约1ms乘以nvoid DelayNms(unsigned int n){unsigned char x;while(n--){for(x=0; x<250; x++){_nop_();_nop_();_nop_();_nop_();}}}/***************************************************************************/ /* */ /* 检查LCD忙状态 */ /* 返回值为1时,表示忙,等待。

返回值为0时,表示闲,可以写入指令与数据。

*/ /* 读状态:RS=L,RW=H,E=H,D0-D7=状态字 */ /* */ /***************************************************************************/bit Lcd1602_is_busy(void){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOPs(); // 保证使能脉冲的宽度result = (bit)(P0&0x80);LCD_EN = 0;return(result);}/*******************************************************************//* *//* 写指令到LCD *//* RS=L,RW=L,E=高脉冲,D0-D7=指令码 *//* *//*******************************************************************/void Lcd_Write_Command(unsigned char cmd){while(Lcd1602_is_busy());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;P0 = cmd;delayNOPs(); // 保证使能脉冲的宽度LCD_EN = 1;delayNOPs();LCD_EN = 0;}/*******************************************************************//* *//* 写显示数据到LCD *//* RS=H,RW=L,E=高脉冲,D0-D7=数据 *//* *//*******************************************************************/void Lcd_Write_Data(unsigned char dat){while(Lcd1602_is_busy());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOPs();LCD_EN = 1;delayNOPs();LCD_EN = 0;}/*******************************************************************//* *//* LCD初始化设定 *//* *//*******************************************************************/void Init_Lcd1602(void){DelayNms(15);Lcd_Write_Command(0x38); // 设置成:16*2显示,5*7点阵,8位数据接口DelayNms(5);// Lcd_Write_Command(0x08); // 显示关闭// DelayNms(5);Lcd_Write_Command(0x0C); // 显示开,关光标DelayNms(5);Lcd_Write_Command(0x06); // 移动光标,输入方式从左到右DelayNms(5);Lcd_Write_Command(0x01); // 清除LCD的显示内容,数据指针清零,将光标撤回液晶显示屏的左上方DelayNms(5);}(2)LCD1602.hvoid Lcd_Write_Command(unsigned char cmd);void Lcd_Write_Data(unsigned char dat);void Init_Lcd1602(void);void DelayNms(unsigned int n);2、矩阵键盘驱动程序(1) 4X4KeyPad.c#include <STC89C5xRC.h>#include "LCD1602.h" // 要用到延时函数 void DelayNms(unsigned char n);#define key P1unsigned char val = 16; // 获取的键值#define KEY_NULL 0xFF // 后来加上的// 键盘扫描函数unsigned char key_scan(void){unsigned char state,KeyTemp;key = 0x0F;if(key != 0x0F) // 如果有按键按下{state = key; // 记录第一次按键状态DelayNms(10); // 延时去抖if(key == state) // 判断按键状态是否和第一次一致{key = 0x0F; // 测试列,该行可屏蔽掉switch(key){case (0x07): KeyTemp = 0; break;case (0x0B): KeyTemp = 1; break;case (0x0D): KeyTemp = 2; break;case (0x0E): KeyTemp = 3; break;}key = 0xF0; // 测试行switch(key){case (0x70): val = KeyTemp + 0; break;case (0xB0): val = KeyTemp + 4; break;case (0xD0): val = KeyTemp + 8; break;case (0xE0): val = KeyTemp + 12; break;}while(key != 0xF0); // 等待松开按键}elsereturn (KEY_NULL);}elsereturn (KEY_NULL);// else key = 0xFF; // 释放键盘总线}(2) 4X4KeyPad.hextern unsigned char key_scan(void);extern unsigned char val;#define KEY_NULL 0xFF3、计算器计算和显示程序(1)caculating and displaying.c#include <stdio.h> // sprintf语句用到#include "LCD1602.h"#include "4X4KeyPad.h"unsigned char code table1[] = {"0123456789+-*/=C"};bit number_key = 0; // 数字键bit add_key = 0; // 加法键 + bit sub_key = 0; // 减法键 -bit multiply_key = 0; // 乘法键 *bit division_key = 0; // 除法键 /bit equal_key = 0; // 等于键 =bit clear_key = 0; // 清除键double a=0,b=0,s=0; // a为计算的第一个数,b为第二个数,s为计算结果// 必须定义为浮点,否则不能够保证计算精度// 识别按键,置标记符void Key_Recognition(void){if(key_scan() != KEY_NULL) // 有按键按下时才置标志位和显示{if(val <= 9) number_key = 1;if(val == 10) add_key = 1;if(val == 11) sub_key = 1;if(val == 12) multiply_key = 1;if(val == 13) division_key = 1;if(val == 14) equal_key = 1;if(val == 15) clear_key = 1;Lcd_Write_Data(table1[val]); // 显示按键对应的字符}}// 计算被计算的两个数 Gets the number of two to be calculatedvoid Get_Parameters_for_calculation(void){if(equal_key != 1) // 没有按等号键才进入{if((add_key||sub_key||multiply_key||division_key) != 1) // 没有按下运算键(+-*/){if(number_key == 1) // 是数字键{a = a*10 + val; // a为运算的第一个数number_key = 0;}}else // 按下运算键(+-*/){if(number_key == 1){b = b*10 + val; // b为运算的第二个数number_key = 0;}}}}// 计算结果void Calculate_Result(void){if(equal_key == 1) // 只有按等号键才能计算{if(add_key == 1) // 加法s = a + b;if(sub_key == 1) // 减法s = a - b;if(multiply_key == 1) // 乘法s = a * b;if(division_key == 1) // 除法s = a / b;}}void Display_Result(void){unsigned char i = 0; // 显示字符的指针unsigned char result[16] = ""; // 待显示的字符计算结果if(equal_key == 1) // 只有按等于键才显示{equal_key = 0;sprintf(result,"%.4f",s); // 浮点数的默认有效位是小数点后6位,这里设置为4位// sprintf(&temp1[0],"%f",a);Lcd_Write_Command(0x80+0x40); // 结果在第二行显示while(result[i] != '\0'){Lcd_Write_Data(result[i]);i++;}}}// 清除显示void ClearScreen(void){if(clear_key == 1) // 只有按清除键才能清除{Lcd_Write_Command(0x01); // LCD清屏指令,把光标撤回到显示器的左上number_key = add_key = sub_key = multiply_key = division_key = equal_key = clear_key = 0;// 清除所有的状态标志s = 0;a = 0;b = 0;}}(2) caculating and displaying.hvoid Key_Recognition(void);void Get_Parameters_for_calculation(void);void Calculate_Result(void);void Display_Result(void);void ClearScreen(void);4、系统主程序#include "LCD1602.h"#include "caculating and displaying.h"void Start_Screen(void){unsigned char code table1[] = " WELCOME TO ";unsigned char code table2[] = "STC51 CALCULATOR" ;unsigned char index = 0; // 显示字符的指针Lcd_Write_Command(0x80);while(table1[index] != '\0'){Lcd_Write_Data(table1[index]);index++;}DelayNms(500);index = 0;Lcd_Write_Command(0x80+0x40);while(table2[index] != '\0'){Lcd_Write_Data(table2[index]);index++;}DelayNms(2000);Lcd_Write_Command(0x01); // 清屏}void main(void){Init_Lcd1602();Start_Screen();while(1){Key_Recognition();Get_Parameters_for_calculation();Calculate_Result();Display_Result();ClearScreen();}}。

应用STC89C52设计的算器 Microsoft Word 文档

应用STC89C52设计的算器 Microsoft Word 文档

;//+**************************************************************************** ****;//*P2.0-P2.3做数码管位选信号,分别对应从右至左四个数码管;//*P0.0-P0.7做数码管段选信号,分别对应abcdefgh段;//*P1.0-P1.2做矩阵键盘行线,对应0、1、2行;//*P1.4-P1.7做矩阵键盘列线,对应0、1、2、3、4列;//***************************************************************************** ***ORG 0000HZ0 EQU 4FH ;输出的实际键值Z1 EQU 50H ;输出缓冲区,第一个数码管Z2 EQU 51H ;输出缓冲区,第二个数码管Z3 EQU 52H ;输出缓冲区,第三个数码管Z4 EQU 53H ;输出缓冲区,第四个数码管Z5 EQU 54H ;原始键值保存地址BAI EQU 55H ;进制转换,百位SHI EQU 56H ;进制转换,十位SHU1 EQU 60H ;输入的第一个数值,用十进制表示SUAN EQU 61H ;运算符存放地址,用键值表示SHU2 EQU 62H ;输入的第二个数值,用十进制表示JIEG EQU 63H ;结果存放地址,用十进制表示AJMP STARTORG 0100HSTART: ;初始化MOV Z0,#00MOV Z1,#00MOV Z2,#00MOV Z3,#00MOV Z4,#00MOV Z5,#00MOV BAI,#64 ;定义为8进制MOV SHI,#8 ;定义为8进制MOV SHU1,#00MOV SUAN,#00MOV SHU2,#00MOV JIEG,#00MAIN:ACALL KEY ;调用是否有键按下子程序JNZ JIANZHI ;若有键按下则跳转到键值计算子程序ACALL SHUCHU ;若无键按下则调用显示子程序AJMP MAIN;//****************************判断是否有键按下子程序******************************KEY:MOV A,#0F0HMOV P1,AMOV A,P1CPL AANL A,#0F0HRET;//***************************有键按下判断是哪个键并计算键值***********************JIANZHI:ACALL KEY ;再次调用键是否按下子程序JNZ LIE ;若还保持在按下状态AJMP MAIN ;若键闭合则调回主程序LIE: ;判断列值,并将列值赋给R5MOV P2,#0FFH ;关闭数码管的位选信号MOV R3,#0FEHMOV R5,#4 ;列值从左到右依次为1、2、3、4LIE0:MOV A,R3RR AMOV R3,AMOV P1,AMOV A,P1CPL AANL A,#0FHJNZ HANGDJNZ R5,LIE0AJMP MAINHANG: ;判断行值,并将行值赋给R1MOV R4,#0F7HMOV R1,#3 ;行值从上到下依次为1、2、3HANG0:MOV A,R4RR AMOV R4,AMOV P1,AMOV A,P1CPL AANL A,#0F0HJNZ JIANZHI0DJNZ R1,HANG0AJMP MAINJIANZHI0: ;计算键值,并将键值送至原始键值存储单元Z5MOV A,R5 ;计算方法,键值=(行值-1)*4+(列值-1)DEC AMOV R5,AMOV A,R1DEC AMOV R1,AMOV A,R1MOV B,#4MUL ABADD A,R5MOV Z5,A ;原始键值保存在Z5中WAIT:ACALL KEYJZ DINGYI ;若键松开则调用键功能数值定义子程序AJMP W AIT ;若键没有松开则等待EXIT:ACALL YIWEIAJMP MAIN;////************************定义每个键的功能或数值子程序****************************DINGYI:MOV A,Z5JIAN0:CJNE A,#0,JIAN1 ;MOV Z0,#0 ;若修改键值则修改此处的源操作数AJMP EXIT ;若定义功能键则修改跳转子程序JIAN1:CJNE A,#1,JIAN2MOV Z0,#1 ;把实际键值送至实际键值存储单元Z0AJMP EXITJIAN2:CJNE A,#2,JIAN3MOV Z0,#2AJMP EXITJIAN3:CJNE A,#3,JIAN4MOV Z0,#3AJMP EXITJIAN4:CJNE A,#4,JIAN5MOV Z0,#4AJMP EXITJIAN5:CJNE A,#5,JIAN6MOV Z0,#5AJMP EXITJIAN6:CJNE A,#6,JIAN7MOV Z0,#6AJMP EXITJIAN7:CJNE A,#7,JIAN8MOV Z0,#7AJMP EXITJIAN8:CJNE A,#8,JIAN9MOV SUAN,AAJMP SHUZHI1JIAN9:CJNE A,#9,JIAN10MOV SUAN,AAJMP SHUZHI1JIAN10:CJNE A,#10,JIAN11AJMP QINGJIAN11:CJNE A,#11,EXITAJMP SHUZHI2AJMP EXIT;//************************计算输入的第一个数的值子程序****************************SHUZHI1:MOV A,Z3MOV B,BAIMUL ABMOV R0,AMOV A,Z2MOV B,SHIMUL ABADD A,R0ADD A,Z1MOV SHU1,AMOV Z0,#0MOV Z1,#0MOV Z2,#0MOV Z3,#0AJMP MAIN;//************************计算输入的第二个数的值子程序****************************SHUZHI2:MOV A,Z3MOV B,BAIMUL ABMOV R0,AMOV A,Z2MOV B,SHIMUL ABADD A,R0ADD A,Z1MOV SHU2,AMOV Z0,#0MOV Z1,#0MOV Z2,#0MOV Z3,#0AJMP DENG;//************************进制转换子程序*************************************** JINZHI:MOV A,JIEGMOV B,BAIDIV ABMOV Z2,A ;百位存放在Z2,最后调用一次以为程序MOV A,BMOV B,SHIDIV ABMOV Z0,B ;个位存放在Z0,最后调用一次以为程序MOV Z1,A ;十位存放在Z1,最后调用一次以为程序MOV Z3,#0RET;//************************加法子程序**********************************************JIA:MOV A,SHU1ADD A,SHU2MOV JIEG,AAJMP DENG0;//************************减法子程序**********************************************JIAN:MOV A,SHU1SUBB A,SHU2MOV JIEG,AAJMP DENG0;//************************乘法子程序**********************************************CHENG:MOV A,SHU1MOV B,SHU2MUL ABMOV JIEG,AAJMP DENG0;//************************除法子程序**********************************************CHU:MOV A,SHU1MOV B,SHU2DIV ABMOV JIEG,AAJMP DENG0;//************************清零子程序**********************************************QING:AJMP START;//************************等号子程序**********************************************DENG:MOV A,SUAN ;判断运算符存放的地址里的数值并跳转SUBB A,#8JZ JIAMOV A,SUANSUBB A,#9JZ CHENGDENG0:ACALL JINZHIAJMP EXIT;//************************移位子程序**********************************************YIWEI: ;把Z3,Z2,Z1,Z0里的各个数字依次向左移一位MOV R0,Z0MOV R1,Z1MOV R2,Z2MOV R3,Z3MOV Z3,R2MOV Z2,R1MOV Z1,R0RET;//************************输出显示子程序******************************************SHUCHU:CLR P2.0 ;显示第一个数码管,从数右边第一个数码管MOV DPTR,#TABMOV A,Z1 ;显示个位数,正反显示修改此处MOVC A,@A+DPTRMOV P0,AACALL DELAYSETB P2.0CLR P2.1 ;显示第二个数码管,从数右边第二个数码管MOV DPTR,#TABMOV A,Z2 ;显示十位数,正反显示修改此处MOVC A,@A+DPTRMOV P0,AACALL DELAYSETB P2.1CLR P2.2 ;显示第三个数码管,从数右边第三个数码管MOV DPTR,#TABMOV A,Z3 ;显示百位数,正反显示修改此处MOVC A,@A+DPTRMOV P0,AACALL DELAYSETB P2.2CLR P2.3 ;显示第四个数码管,从数右边第四个数码管MOV DPTR,#TABMOV A,Z4MOVC A,@A+DPTRMOV P0,AACALL DELAYSETB P2.3RET;//************************共阳极八段数码管****************************************TAB:DB 0C0H,0F9H,0A4H,0B0HDB 099H,092H,082H,0F8HDB 080H,090H,088H,083HDB 0C6H,0A1H,086H,084H;//************************用于动态显示延时子程序**********************************DELAY:MOV R4,#5D1:MOV R3,#239DJNZ R3,$DJNZ R4,D1RETEND。

基于STC89C52的简易计算器设计

基于STC89C52的简易计算器设计

福建电力职业技术学院课程设计课程名称:《智能仪器》题目:基于STC89C52的简易计算器设计专业班次:姓名:学号:指导教师:学期:2011-2012学年第2学期日期:2012.2目录目录1. 引言 (1)1.1本设计的意义 (1)1.2本设计任务和主要内容 (2)2. 硬件设计 (2)2.1系统框图 (3)2.2最小系统 (4)2.3矩阵键盘 (5)2.4 LCD1602硬件设计 (6)3.软件设计 (7)3.1矩阵键盘扫描原理 (8)3.2L C D1602引脚功能时序图 (9)3.3计算器流程图 (10)4设计小结 (12)参考文献 (14)附录:课程设计程序清单 (15)1.引言随着社会的发展,科学的进步,人们的生活水平在逐步地提高,尤其是微电子技术的发展犹如雨后春笋般的变化。

电子产品的更新速度快就不足惊奇了。

计算器在人们的日常中是比较常见的电子产品之一,如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好地为各个行业服务,成了如今电子领域重要的研究课题。

现如今,人们的日常生活中已经离不开计算器了,社会的各个角落都有它的身影,比如商店、办公室、学校……因此设计一款简单实用的计算器会有很大的实际意义。

本设计旨在进一步掌握单片机理论知识,理解嵌入式单片机系统的硬软件设计,加强对实际应用系统设计的能力。

通过本设计的学习,使我掌握单片机程序设计和微机接口应用的基本方法,并能综合运用本科阶段所学软、硬件知识分析实际问题,提高解决毕业设计实际问题的能力,为单片机应用和开发打下良好的基础。

1.1 本设计的意义计算器在人们的日常中是比较常见的电子产品之一,如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好地为各个行业服务,成了如今电子领域重要的研究课题。

现如今,人们的日常生活中已经离不开计算器了,社会的各个角落都有它的身影,比如商店、办公室、学校……因此设计一款简单实用的计算器会有很大的实际意义。

基于STC89C52单片机的计算器

基于STC89C52单片机的计算器

基于STC89C52单片机的计算器随着科技的不断发展,单片机已经成为现代电子设备中的重要组成部分。

STC89C52单片机作为一种常见的单片机,因其高性价比和良好的性能而广泛应用于各种嵌入式系统中。

本文将介绍如何使用STC89C52单片机制作一个简单的计算器。

一、硬件设计1、电源电路:为单片机提供稳定的电源。

2、时钟电路:为单片机提供时钟信号,确保其正常运行。

3、复位电路:在单片机出现异常时,通过复位电路实现系统重启。

4、输入电路:用于接收用户输入的数字和运算符。

5、输出电路:用于显示计算结果。

二、软件设计1、初始化程序:对单片机的各个寄存器进行初始化。

2、显示程序:根据需要显示的内容,编写相应的显示程序。

3、输入程序:接收用户输入的数字和运算符,并将其存储在相应的变量中。

4、计算程序:根据用户输入的运算符,调用相应的函数进行计算,并将结果显示在输出电路中。

三、调试与测试1、硬件调试:检查电路板上的元器件是否连接正确,确保电源、输入和输出电路的正常工作。

2、软件调试:通过串口调试工具,对程序进行调试和修改,确保程序的正确性。

3、综合测试:在完成硬件和软件的调试后,进行综合测试,确保计算器的正常工作。

四、结论本文介绍了基于STC89C52单片机的计算器的硬件和软件设计。

通过使用单片机,可以实现简单的计算器功能,并且具有成本低、易于维护和升级等优点。

在制作过程中,需要注意硬件和软件的调试与测试,以确保系统的稳定性和可靠性。

stc89c52单片机技术资料标题:STC89C52单片机技术资料一、概述STC89C52单片机是一种广泛应用的微控制器,它由深圳宏晶科技有限公司生产。

这款单片机具有高性能、低功耗、高可靠性等特点,适用于各种嵌入式系统开发。

下面将详细介绍STC89C52单片机的技术特性、引脚配置、寄存器映射以及常用开发工具等。

二、STC89C52单片机特性1、工作频率:STC89C52单片机的时钟频率可达到35MHz,能够满足大多数应用场景的需求。

电子设计基于STC89C52RC单片机的简易计算器设计说明

电子设计基于STC89C52RC单片机的简易计算器设计说明

电子设计实验名称:基于STC89C52RC单片机的简易计算器设计姓名: __学号:指导老师:目录一、可行性研究 (3)二、设计方案简述 (4)2.1、功能介绍................................................................... .. (4)基本功能 (4)扩展功能 (4)2.2、总体设计方案............................................................................ (5)总体设计思路 (5)方案论证与比较 (6)系统组成 (7)三、详细设计 (12)1.各个模块设计 (12)输入模块:键盘扫描 (13)运算模块:单片机控制 (14)显示模块:LCD1602显示 (15)2.硬件电路设计 (16)硬件连接 (16)3.元件的介绍 (17)STC89C52单片机组成 (17)复位和复位电路 (18)LCD1602显示器 (19)4.PCB设计以及结果显示 (22)五、总结 (24)附录主要程序代码 (25)一、设可行性分析:1.2.1 经济可行性由于只是实验性质的编程,所以在设计和开发都不需要过多的经费,但是系统投入运行以后,硬件维护和损耗所造成的耗费是必须的,但是数目也不会很大。

所以经过初步分析,经济上基本上是可行的1.2.2技术可行性在技术方面,因为都学习了C语言,硬件课程设计等课程,对于开发语言c语言也有一定的掌控能力,应该能够完成相应的任务。

1.2.3 运行可行性该成果简单易操作,非常容易使用。

1.2.4 法律可行性由于我们需要完成的功能相对简单,没有太多涉及到很专业方面的容,更没有计划将系统利用到商业用途,所以不存在侵权或者纠纷方面的问题。

1.2.5结论该系统的软硬件都比较容易理解和实现,所以,具有实现一计算器的可行性。

二、设计方案简述2.1功能概述系统基本功能:(1)由于设计的计算器要进行四则运算,为了得到较好的显示效果,经综合分析后,最后采用LCD 显示数据和结果。

基于单片机控制的简单计算器设计方案

基于单片机控制的简单计算器设计方案

基于单片机控制的简单计算器设计方案一、引言随着单片机技术的不断发展,计算器作为人们生活中不可或缺的工具之一,也得到了广泛的应用。

本文将介绍一种基于单片机控制的简单计算器设计方案,通过单片机与键盘、显示器等外围设备的配合,实现基本的加减乘除四则运算功能。

二、硬件设计为了完成计算器的设计,我们需要准备以下硬件设备:1.单片机:选择一款性能较好的单片机,如STC89C522.键盘:选用矩阵键盘,共有16个按键。

3.显示器:采用数码管显示器,方便用户观察计算结果。

4.电源:使用适当电压的电源供电。

具体的硬件连接方式如下:1.将矩阵键盘与单片机的GPIO口相连,读取按键的输入。

2.将数码管与单片机的GPIO口相连,用于显示计算结果。

三、软件设计1.按键扫描首先,需要对键盘的按键进行扫描,以便读取用户输入的数字和运算符。

采用矩阵键盘扫描方式,可以有效减少IO口的使用数量。

通过循环扫描键盘,将按下的键值读取到寄存器中,以便后续的处理。

2.输入处理读取到键值后,需要对用户输入的字符进行处理,包括数字和运算符的识别。

在识别到数字时,将其存储到相应的数据变量中;在识别到运算符时,判断当前是否已经输入了两个数字,如果满足条件,则进行相应的运算。

3.运算处理在输入处理的基础上,需要完成基本的加减乘除四则运算。

通过设置相应的标志位变量来表示当前的运算符,根据不同的标志位执行相应的运算。

4.显示结果在完成运算后,将结果显示到数码管上,以供用户观察。

5.清零操作在计算完成后,可以通过按下清零键来将当前的计算结果清零,以便进行下一次的计算。

四、设计考虑在具体设计过程中,需要考虑以下几个方面:1.按键的防抖处理:由于按键机械结构的原因,按键在按下和释放时会产生抖动信号,因此需要对按键进行防抖处理,以保证按键输入的准确性。

2.输入错误处理:对于用户可能犯的输入错误,例如除数为零等,需要进行相应的错误处理。

3.显示结果的格式化:为了方便用户观察计算结果,可以对结果进行适当的格式化处理,例如四舍五入、精度控制等。

基于51单片机的数码管简易计算器

基于51单片机的数码管简易计算器

基于51/52单片机的简易计算器制作一、题目利用单片机芯片STC89C52、四位八段共阳数码管及已制作好的电路板等器件设计制作一个计算器。

二、任务与要求要求计算器能实现加减乘除四种运算 具体如下1. 加法:四位整数加法计算结果若超过八位则显示计算错误2. 减法:四位整数减法计算结果若超过八位则显示计算错误3. 乘法:多位整数乘法计算结果若超过四位则显示计算错误4. 除法:整数除法5. 有清除功能三、课程设计简述总体设计思路简述1.按照系统设计的功能的要求 初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成。

主控芯片使用STC89C52单片机。

2.键盘电路采用4*4矩阵键盘电路。

3.显示模块采用共阳极数码管构成。

四、硬件电路五、软件编程部份#include<reg52.h>#define uchar unsigned char#define uint unsigned int//uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴极// 0 1 2 3 4 5 6 7 8 9 熄灭-//uchar code loc[]={0xff,0xfe,0xfd,0xfb,0xf7};//uchar code ero[]={0x79,0x50,0x5c};uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40};//共阳极uchar code loc[]={0x00,0x80,0x40,0x20,0x10};uchar code ero[]={~0x79,~0x50,~0x5c};uint n=0,n1=0,n2=0; //赋初值uchar flag=0; //计算类型选择关键字void delay(int t);void display(int n);void error();main(){while(1){uchar temp;//第一行检测P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xfe;if(temp!=0xfe){temp=P3;switch(temp){case 0xee:n1=0;n2=0;n=0;flag=0;break; //清零//0case 0xbe: if(flag==1)n=n2+n1; //=if(flag==2)n=n2-n1;if(flag==3)n=n2*n1;if(flag==4)n=n2/n1;n1=0;break;case 0x7e: // +n2=n1;n1=0;flag=1;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第二行P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:n1=10*n1+1;n=n1;break; //4case 0xdd:n1=10*n1+2;n=n1;break; //5case 0xbd:n1=10*n1+3;n=n1;break; //6case 0x7d:// -n2=n1;n1=0;flag=2;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第三行P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:n1=10*n1+4;n=n1;break;case 0xdb:n1=10*n1+5;n=n1;break;case 0xbb:n1=10*n1+6;n=n1;break;case 0x7b: // *n2=n1;n1=0;flag=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第四行P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:n1=10*n1+7;n=n1;break; //7case 0xd7:n1=10*n1+8;n=n1;break; //8case 0xb7:n1=10*n1+9;n=n1;break; //9case 0x77: // /n2=n1;n1=0;flag=4;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}display(n);}}//延时函数void delay(int t){int x,y;for(x=0;x<t;x++)for(y=0;y<t;y++);}//数码管显示void display(int n){//溢出处理uchar g,s,b,q;int abs;if((n>9999)||(n<-999))error();//正数if((n>=0)&&(n<=9999)) {g=n%10;s=n/10%10;b=n/100%10;q=n/1000%10;P0=num[g];delay(5);P2=loc[4];delay(2);P2=loc[0];delay(3);if(n>=10){P0=num[s];P2=loc[3];delay(2);P2=loc[0];delay(3);}if(n>=100){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(3);}if(n>=1000){P0=num[q];P2=loc[1];delay(2);P2=loc[0];delay(3);}}//负数if((n<0)&&(n>=-999)){abs=-n;g=abs%10;s=abs/10%10;b=abs/100%10;q=abs/1000%10;P0=num[g];P2=loc[4];delay(2);P2=loc[0];delay(2);if((abs/10%10>0)||(abs/100%10>0)){P0=num[s];P2=loc[3];;delay(2);P2=loc[0];delay(2);if((abs/100%10>0)){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(2);if((abs/1000%10>0)){P0=num[q];P2=loc[1];delay(2);P2=loc[0];delay(2);}else{P0=num[11];P2=loc[1];delay(2);P2=loc[0];delay(2);}}else{P0=num[11];P2=loc[2];delay(2);P2=loc[0];delay(2);}}else{P0=num[11];P2=loc[3];delay(2);P2=loc[0];delay(2);}}}//溢出显示void error(){P2=loc[1];P0=ero[0];delay(2);P2=loc[0];delay(3);P2=loc[2];P0=ero[1];delay(2);P2=loc[0];delay(3);P2=loc[3];P0=ero[1];delay(2);P2=loc[0];delay(3);P2=loc[4];P0=ero[2];delay(2);P2=loc[0];delay(3); }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
shuchu((e[i--]+1));
delay(50);
}
}
}
void jianpan()
{
uchar a=0;
switch( jianpan0() )
{
case 0xee:if(flag1){shuchu(11);shuchu(8);a=7;d=10*d+a;flag1=0;}else{shuchu(8);a=7;d=10*d+a;}break;
case 3:f[j-1]=f[j-1]*d;d=0;flag=3;j--;break;
case 4:if(d==0){c=38;}f[j-1]=f[j-1]/d;d=0;flag=3;j--;break;
case 0xdb:if(flag1){shuchu(11);shuchu(3);a=2;d=10*d+a;flag1=0;}else{shuchu(3);a=2;d=10*d+a;}break;
case 0xbb:if(flag1){shuchu(11);shuchu(4);a=3;d=10*d+a;flag1=0;}else{shuchu(4);a=3;d=10*d+a;}break;
delay(500);
}
}
void write_zf(uchar x,uchar y,uchar dat)
{
if(y) x|=0x40;
x|=0x80;
write_cmd(x);
write_dat(dat);
}
void init()
{
duan=0;
wei=0;
write_cmd(0x38);
case 0x7d:shuchu(14);switch(flag){case 0:f[j]=d;d=0;flag=2;break;
case 1:f[j]=d;d=0;flag=2;break;
case 2:f[j]=-d;d=0;flag=2;break;
d=0;jg=0;for(j=0;j<10;j++){f[j]=0;}flag=0;j=0;flag1=0;i=0;
}
else{
write_zf(c,0,b[i]);
c++;
delay(10);}
}
}
void shuchu1(signed long f)
{
uint i=0;
if(f<0)
case 2:f[j]=-d;d=0;flag=0;break;
case 3:f[j-1]=f[j-1]*d;d=0;flag=0;j--;break;
case 3:f[j-1]=f[j-1]*d;d=0;flag=1;j--;break;
case 4:if(d==0){c=38;}
f[j-1]=f[j-1]/d;d=0;flag=1;j--;break;
for(j=0;j<10;j++){f[j]=0;}
f[0]=jg;
d=0;
jg=0;
flag=0;
flag1=1;j=1;
#include<reg52.h>
#include<math.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit RS=P3^5;
sbit RW=P3^6;
sbit EN=P3^4;
sbit duan=P2^6;
}if(!flag1){j++;}flag1=0;
break;
case 0xeb:if(flag1){shuchu(11);shuchu(2);a=1;d=10*d+a;flag1=0;}else{shuchu(2);a=1;d=10*d+a;}break;
{
f=-f;
shuchu(14);
}
if(f==0)
{
shuchu(1);
}
if(f>0)
{
while(f!=0)
{
e[i++]=(long int)f%10;
(long int)f/=10;
}
i=i-1;
while(i!=-1)
{
if(c==38){break;}
}if(!flag1){j++;}flag1=0;
break;
case 0xe7:shuchu(16);break;
case 0xd7:if(flag1){shuchu(11);shuchu(1);a=0;d=10*d+a;flag1=0;}else{shuchu(1);a=0;d=10*d+a;}break;
}if(!flag1){j++;}flag1=0;
break;
case 0xed:if(flag1){shuchu(11);shuchu(5);a=4;d=10*d+a;flag1=0;}else{shuchu(5);a=4;d=10*d+a;}break;
case 0xde:if(flag1){shuchu(11);shuchu(9);a=8;d=10*d+a;flag1=0;}else{shuchu(9);a=8;d=10*d+a;}break;
case 0xbe:if(flag1){shuchu(11);shuchu(10);a=9;d=10*d+a;flag1=0;}else{shuchu(10);a=9;d=10*d+a;}break;
case 0x7b:shuchu(12);switch(flag){case 0:f[j]=d;d=0;flag=3;break;
case 1:f[j]=d;d=0;flag=3;break;
case 2:f[j]=-d;d=0;flag=3;break;
write_cmd(0x01);
write_cmd(0x0c);
write_cmd(0x06);
}
jianpan0()
{
uchar cord_l,cord_h;
P3 != 0xf0)
{
delay(5);
if( (P3 & 0xf0) != 0xf0)
case 0x7e:shuchu(11);switch(flag){case 0:f[j]=d;d=0;flag=1;break;
case 1:f[j]=d;d=0;flag=1;break;
case 2:f[j]=-d;d=0;flag=1;break;
}
}
void shuchu(uchar i)
{
if(i!=0)
{
if(c>15)
{
write_cmd(0x18);
}
if(c==38)
{
write_cmd(0x01);
write_zfc(0,0,&out[0]);
write_cmd(0x08);
c=0;
init();
case 0xdd:if(flag1){shuchu(11);shuchu(6);a=5;d=10*d+a;flag1=0;}else{shuchu(6);a=5;d=10*d+a;}break;
case 0xbd:if(flag1){shuchu(11);shuchu(7);a=6;d=10*d+a;flag1=0;}else{shuchu(7);a=6;d=10*d+a;}break;
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void read_busy()
{
uchar busy;
P0=0xff;
RS=0;
RW=1;
do
{
EN=1;
sbit wei=P2^7;
signed long d,f[10],jg;
uchar flag=0,j=0;
bit flag1=0;
uchar out[]={"out"};
uchar c;
uchar e[10];
uchar b[]={0x00,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2b,0x2a,0x2f,0x2d,0x3d,0x2e};//0,1,2,3,4,5,6,7,8,9,+,*,\,-,.,=
busy=P0;
EN=0;
}
while(busy&0x80);
}
void write_cmd(uchar cmd)
{
read_busy();
RS=0;
RW=0;
P0=cmd;
EN=1;
EN=0;
}
void write_dat(uchar dat)
{
read_busy();
case 3:f[j-1]=f[j-1]*d;d=0;flag=2;j--;break;
case 4:if(d==0){c=38;}f[j-1]=f[j-1]/d;d=0;flag=2;j--;break;
相关文档
最新文档