加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

基于51单片机的简易计算器设计Proteus仿真

06/27 08:47
2016
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
  • 相关文件
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

仿真图proteus 7.8/proteus 8.6

程序编译器:keil 4/keil 5

编程语言:C语言

编号S0001

资料下载网盘链接:

芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C5151单片机芯片。

讲解视频:

51单片机的简易计算器仿真设计(仿真+程序+原理图+PCB+设计报告+讲解视频)

一、该简易计算器设计硬件电路采用三部分电路模块构成:

1、键盘模块电路, 采用 4*4 矩阵式键盘作为输入电路;

2、LCD1602 液晶显示模块;

3、以 51 单片机作为控制核心。

二、软件程序主要由三部分组成: 主程序、按键扫描程序和 LCD1602 显示程序。

三、 性能指标

(1) 用单片机 stc89C51 设计一个简易计算器, 并用 1602 液晶显示相应的数据。

(2) 可以进行简单的加减乘除运算。

(3) 最大可以 9999*9999, 。

(4) 可以通过 proteus 仿真。

PCB和原理图

3.2 硬件设计

本系统以AT89S52单片机为核心,本系统选用12MHZ的晶振,使得单片机有合理的运行速度。起振电容30pF对振荡器的频率高低、振荡器的稳定性和起振的快速性影响较合适,复位电路为按键高电平复位。

3.2.1 键盘设计电路

本设计选用的是非编码键盘。键盘是单片机系统中最常用的人机对话输入设备,用户通过键盘向单片机输入数据或指令。键盘控制程序需完成的任务有:监测是否有键按下,有键按下时,在无硬件去抖时,应用软件延时方法消除按键抖动影响;当有多个键同 时按下时,只处理一个按键,不管一次按键持续多长时间,仅执行一次按键功能程序。矩阵按键扫描程序是一种节省IO口的方法,按键数目越多节省IO口就越可观,思路:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。但是,在程序的写法上,采用了最简单的方法,使得程序效率最高。本程序中,如果检测到某个键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU时间。

本键盘扫描程序的优点在于:不用专门的按键延时程序,提高了CPU效率,也不用中断来扫描键盘,节省了硬件资源。另外,本键盘扫描程序,每次扫描占用CPU时最短,不论有键按下或者无键按下都可以在很短的时间完成一次扫描。键盘是单片机系统中最常用的人机对话输入设备,用户通过键盘向单片机输入数据或指令。键盘控制程序需完成的任务有:监测是否有键按下,有键按下时,在无硬件去抖时,应用软件延时方法消除按键抖动影响;当有多个键同时按下时,只处理一个按键,不管一次按键持续多长时间,仅执行一次按键功能程序。

矩阵按键扫描程序是一种节省IO口的方法,按键数目越多节省IO口就越可观,思路:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。但是,在程序的写法上,采用了最简单的方法,使得程序效率最高。本程序中,如果检测到某个键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU时间。本键盘扫描程序的优点在于:不用专门的按键延时程序,提高了CPU效率,也不用中断来扫描键盘,节省了硬件资源。另外,本键盘扫描程序,每次扫描占用CPU时最短,不论有键按下或者无键按下都可以在很短的时间完成一次扫描。

 程序代码

LCD1602部分

#include <reg52.h>
#include <intrins.h>

sbit LCD_RS= P2^4;
sbit LCD_RW = P2^5;
sbit LCD_E = P2^6;

#define LCD_DATA P0

static void LCD_Delay(unsigned char ms)		  //延时函数
{
  unsigned char i;
  while(ms--)
  {
    for(i = 0; i< 250; i++)
    {
      _nop_();
      _nop_();
      _nop_();
      _nop_();
    }
  }
}

bit LCD_Busy()
{
  bit result;
  LCD_RS = 0;
  LCD_RW = 1;
  LCD_E = 1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  result = (bit)(LCD_DATA & 0x80);
  LCD_E = 0;
  return result;
}

void LCD_WriteCmd(unsigned char cmd)  //LCD1602写命令
{
  while(LCD_Busy());
  LCD_RS = 0;
  LCD_RW = 0;
  LCD_E = 0;
  _nop_();
  _nop_();
  LCD_DATA = cmd;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  LCD_E = 1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  LCD_E = 0;
}

void LCD_Pos(unsigned char row,unsigned char pos)
{
  row &= 0x1;
  pos &= 0xF;
  if (row) pos |= 0x40;
  LCD_WriteCmd(pos | 0x80);
}

void LCD_WriteDat(unsigned char dat) //写数据
{
  while(LCD_Busy());
  LCD_RS = 1;
  LCD_RW = 0;
  LCD_E = 0;
  LCD_DATA = dat;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  LCD_E = 1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  LCD_E = 0;
}

void LCD_ShowStr(unsigned char x, unsigned char y, unsigned char *dat)	  //写字符串
{
  unsigned char i=0;
  LCD_Pos(y,x);
  while(dat[i] != '�')
  {
    LCD_WriteDat(dat[i]);
    i++;
  }
}

void LCD_Init(void)			//LCD1602显示
{
  LCD_WriteCmd(0x38);
  LCD_Delay(1);
  LCD_WriteCmd(0x0c);
  LCD_Delay(1);
  LCD_WriteCmd(0x06);
  LCD_Delay(1);
  LCD_WriteCmd(0x01);
  LCD_Delay(1);
}

主函数:

#include "reg52.h"
#include "string.h"
#include "stdio.h"
#include "lcd1602.h"
#include "keyboard.h"

#define keydeng		14
#define keyzuoyi    12

code unsigned char KeyDisPlaybuf[16] = 
{
    '1', '2', '3', '+',
    '4', '5', '6', '-', 
    '7', '8', '9', '*',
    '<', '0', '=', '/'
};

long Count(char *ch, char len)//简单计算器 仅支持加减乘除+-*/
{
    unsigned char i = 0;
    char Operation;
    long Num1=0,Num2=0;
    while(i<len && ch[i]!='+' && ch[i]!='-' && ch[i]!='*' && ch[i]!='/')	 //输入的数据 数值1
    {
        Num1*=10;
        Num1+=ch[i]-'0';
        i++;
    }
    Operation=ch[i++];
    while(i<len && ch[i]!='=')	   //输入的数据 数值2
    {
        Num2*=10;
        Num2+=ch[i]-'0';
        i++;
    }
    switch(Operation)	   //计算
    {
        case'+':return Num1+Num2;//加法
        case'-':return Num1-Num2;//减法
        case'*':return Num1*Num2;//乘法
        case'/':return Num1/Num2;//除法
    }
	return 0;
}

void EasyCounter(void)
{
	unsigned char buff[30];
	unsigned char text[30];
	unsigned char key;
	unsigned char i = 0;
	do
  {
			key = keycan();//读取键值	
			if(key!=0xff)//键值不等于0
			{
				text[i++]=KeyDisPlaybuf[key];//记录键值对应的字符
				text[i]='�';
        		LCD_ShowStr(0,0,"                ");
				LCD_ShowStr(16-strlen(text),0,text); //第一行显示字符
			}
        if(key==keyzuoyi&&i>0)//按下"<"时删除一位
          i-=2;
	}while(key!=keydeng);//按下'='时结束输入
	sprintf(buff, "%ld", Count(text, strlen(text)));
  	LCD_ShowStr(0,1,"                ");
	LCD_ShowStr(16-strlen(buff),1,buff);	  //第二行显示字符
}

void main(void)	//主函数
{
  LCD_Init();
  LCD_ShowStr(0,0, "               0");
  while(1)
  {
    EasyCounter();	//按键扫描+计算+显示
  }
}

设计报告

任务书如下
一. 设计要求
(一) 基本任务
该简易计算器设计硬件电路采用三部分电路模块构成, 第一部分是键盘模块
电路, 采用 4*4 矩阵式键盘作为输入电路; 第二部分是 LCD1602 液晶显示模块;
第三部分是以 51 单片机作为控制核心。 软件程序主要由三部分组成: 主程序、
按键扫描程序和 LCD1602 显示程序。
(二) 性能指标
(1) 用单片机 stc89C51 设计一个简易计算器, 并用 1602 液晶显示相应的
数据。
(2) 可以进行简单的加减乘除运算。
(3) 最大可以 9999*9999, 。
(4) 可以通过 proteus 仿真。
附: 可供选用的元件清单
1)1602 液晶
2)排针*16
3)16p 母座
4)STC89C51 单片机
5)40 脚 IC 座
6)10k 电阻*2
7)1.5k 电阻
8)103 排阻
9)10uf 电解电容
10)12M 晶振
11)30pf 电容*2
12)按键*17
13)自锁开关等等

  • 设计资料获取联系方式.doc

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
SAK-XC164CS-16F40FBB 1 Infineon Technologies AG Microcontroller, 16-Bit, FLASH, 40MHz, CMOS, PQFP100, 0.50 MM PITCH, GREEN, PLASTIC, TQFP-100
暂无数据 查看
MK70FN1M0VMJ15 1 Freescale Semiconductor Kinetis K 32-bit MCU, ARM Cortex-M4 core, 1MB Flash, 150MHz, Graphics LCD, MAPBGA 256

ECAD模型

下载ECAD模型
$18.16 查看
DS3234S#T&R 1 Maxim Integrated Products Real Time Clock, 1 Timer(s), CMOS, PDSO20, 0.300 INCH, ROHS COMPLIANT, SOP-20
$7.73 查看

相关推荐

电子产业图谱