电子设计-基于STC89C52RC单片机的简易计算器设计
基于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单片机的计算器设计。
二、设计目标本设计的目标是实现一个简单的、功能齐全的四则运算计算器。
该计算器具有基本的加、减、乘、除运算功能,可以进行整数和小数的运算。
同时,该计算器还具备清零、撤回、保存结果等辅助功能。
三、硬件设计1.单片机选择本设计选择STC89C52单片机作为主控芯片。
STC89C52是一款具有低功耗、高性能的单片机,拥有8位宽的数据总线和16位宽的地址总线,适用于本设计所需的计算器功能。
2.显示器选择本设计选择8位共阳数码管作为显示器。
由于STC89C52单片机的IO 口输出电流较小,为了驱动数码管显示,需要通过数码管驱动芯片进行扩展以增大驱动电流。
3.按键选择本设计选择矩阵键盘作为输入设备。
根据计算器所需的功能,可以设置数字键、运算符键、功能键等按键。
四、软件设计1.指令集设计本设计根据计算器功能的需求,设计了一套适合STC89C52单片机的指令集。
包括加法指令、减法指令、乘法指令、除法指令等,以及相应的操作数寻址方式。
2.界面设计本设计通过8位共阳数码管显示器和矩阵键盘构建了计算器的界面。
通过编程实现数码管显示数字和结果,以及按键的检测和响应。
3.运算功能实现本设计通过编程实现了加法、减法、乘法、除法等基本运算功能。
通过数码管显示输入的数字和结果,实现了计算器的正常运算。
4.辅助功能实现本设计通过编程实现了清零、撤回、保存结果等辅助功能。
通过按下相应的功能键,可以实现清除当前输入、撤回上一步操作或保存当前结果等操作。
五、实验验证六、结论通过本次设计,成功实现了基于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单片机的计算器的设计与实现。
该计算器具有基本的四则运算功能,并且支持浮点数的运算。
二、硬件设计1.单片机选择本文选择STC89C52单片机作为计算器的核心处理器。
STC89C52是基于8051架构的单片机,具有强大的计算和控制能力,适合用于计算器的设计。
2.显示器设计本文选用16x2LCD液晶显示器作为计算器的显示器。
液晶显示器具有容量小、功耗低、反射型等优点,非常适合计算器的显示要求。
3.按键设计本文选用矩阵按键设计。
通过矩阵按键设计,可以设计出较多的按键功能,并且能够节省IO口的使用。
4.电源设计计算器使用直流电源供电,可以选择使用电池或者外部电源适配器供电。
三、软件设计计算器的软件设计主要包括界面设计和计算功能设计两个方面。
1.界面设计计算器的界面设计主要包括显示数字和调用函数。
a.显示数字通过将用户输入的数字显示到LCD液晶屏上,实现数字的显示功能。
液晶屏可以显示16个字符,可以一次性显示一个较长的数字。
b.调用函数通过监测用户按键的输入,调用相应的函数实现计算功能。
可以设置加、减、乘、除等函数,并通过按键的组合调用相应的函数。
2.计算功能设计计算器的计算功能设计主要包括四则运算和浮点数运算两个方面。
a.四则运算通过四个函数实现加、减、乘、除的功能。
在用户按下相应的运算符号键后,调用相应的函数对输入的数字进行相应的运算,并将结果显示在LCD液晶屏上。
b.浮点数运算在用户输入的数字或运算结果存在小数的情况下,可以设计相应的浮点数运算函数,通过运算可以得到带有小数点的结果,并将结果显示在LCD液晶屏上。
四、系统实现五、总结基于STC89C52单片机的计算器设计和实现包括硬件设计和软件设计两个方面。
通过合理的硬件设计和功能完善的软件设计,可以实现一款功能强大的计算器。
基于89c52单片机的智能计算器程序
#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);
基于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的计算器设计与仿真宋慧超【摘要】Single chip microcomputer has the advantages of smallsize,strong control function,low power consumption,strong adaptability to environment,flexible and easy to use.It has been widely used in various fields.This paper presents a design scheme of high precision calculator based on Single chip microcomputer.Control system is STC89C52 microcontroller.Operation process and results are displayed in theLCD1602 LCD screen.The key module is composed of 4*4 keyboard which is used to simulate the 0-9 and add,subtract,multiply,divide ,reset button. Software program is written in C language and compiled by C51 Keil and verified by Proteus simulation.%单片机具有体积小、控制功能强、功耗低、环境适应能力强、扩展灵活和使用方便等优点,已广泛应用在生活的各个领域,该文提出一种基于单片机的高精度计算器设计方案,核心控制系统采用STC89C52单片机,利用LCD1602液晶显示屏显示运算过程与结果,设计4×4键盘构成按键模块,用来模拟0~9及加、减、乘、除、清零按键.软件程序利用单片机C语言编写,并在Keil C51开发环境下编译,硬件系统通过proteus工具软件设计并仿真.【期刊名称】《科技创新导报》【年(卷),期】2015(000)029【总页数】3页(P159-160,162)【关键词】单片机;4×4键盘;LCD1602【作者】宋慧超【作者单位】内蒙古民族大学物理与电子信息学院内蒙古通辽 028000【正文语种】中文【中图分类】TN43计算器是人们生活中最常见的工具之一,随着科技的迅猛发展,计算器的功能越来越强大,对精度的要求也越来越高。
STC89C52RC简易计算机
用“功能键”进行四种运算功能切换,例如:当前功能是“加”,按一下“功能键”,当前功能变为“减”,再按一下“功能键”,当前功能变为“乘”,依次类推。
当前功能改变时,第一行的显示function= 同时改变。
#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit key_scan_2 = P2^7;sbit key_scan_1 = P2^6;sbit key_scan_0 = P2^5;uchar data key_cnt; /*按键计数器*/uchar data key_buffer; /*键值缓冲器*/uchar data function_reg;uchar bdata Flag; /*标志字节1*/static uchar key_value[28]; /*存放键值*/uchar key_count; /*功能键按键次数计数*/sbit key_hit = Flag ^ 0; /*有键按下标志位*/#define LINE1 0#define LINE2 1#define LINE1_HEAD 0x80#define LINE2_HEAD 0xC0#define DA TA_MODE 0x38#define OPEN_SCREEN 0x0C#define DISPLAY_ADDRESS 0x80#define CLR 0x01sbit LCD1602_RS=P3^5; /* Data Command Pin 1 data 0 command */ sbit LCD1602_RW=P3^6; /* Read Write Pin 1 read 0 write */ sbit LCD1602_EN=P3^7; /* LCD Enable Signal */sbit LCD1602_BUSY_status = P0^7;void LCD_command(unsigned char command,unsigned char BusyC);void LCD_data(unsigned char command,unsigned char BusyC);void LCD_set_xy( unsigned char x, unsigned char y );void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);void LCD_init(void);/* lcd initize function */uchar ReadStatus(void);void disp1(void);void work();uchar float_display(double disp_data); /*浮点数显示程序*/uchar code table[4][12]={"ADD","SUB","MUL","DIV"};uchar code table2[4]={'+','-','*','/'} ;static uchar key_num;uchar *ss ; /*定义数组指针*/static double final;static unsigned char disp_str[16];void delay(unsigned int delay_lenth) /*延时程序*/{unsigned int i;while(delay_lenth--){for(i=0;i<120;i++);}}void delay_10ns(){uchar i,j;for(i=10;i>0;i--)for(j=100;j>0;j--);}void main(){uchar user_reg,user_buffer,user_cnt;key_count=0;key_num=0;/*key_num对按键次数计数*/TMOD = 0x01;TL0 = 0xfd;TH0 = 0xd8;ET0 = 1;TR0 = 1; /*定时器0定时10MS*/key_buffer=0;key_hit = 0;ss=table[key_count];delay(1000);LCD_init( );disp1();EA = 1;LCD_write_string(0,LINE1,"function:");LCD_write_string(9,LINE1,ss);LCD_command(0x0f,0);/*显示光标,并光标闪烁*/LCD_command(0x06,0);/*写入一个字符后光标加1地址加1*/while(1){LCD_set_xy( key_num, LINE2 );if(key_hit) /*有键按下,计算键值*/{key_hit=0;user_cnt=0;user_reg = key_buffer;for(user_buffer=0;user_buffer<5;user_buffer++){if(user_reg & 0x01) {user_cnt++;}else {break;}user_reg >>= 1;}user_reg = key_buffer;if(user_reg&0x40) {function_reg = user_cnt + 10;}else if(user_reg & 0x20) {function_reg = user_cnt + 5;}else {function_reg = user_cnt;}switch(function_reg){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8: /*0到9的数字键*/case 9:if(key_num>=16){ LCD_command(0x07,0);} /*写入一个字符后光标加1地址加1整屏左移*/else{ LCD_command(0x06,0);}/*写入一个字符后光标加1地址加1*/key_value[key_num]=function_reg;LCD_write_char(key_num,LINE2,function_reg+0x30);/*键值的A码显示*/key_num++;break;case 10: /*小数点*/if(key_num>=16){ LCD_command(0x07,0);} /*写入一个字符后光标加1地址加1整屏左移*/else{ LCD_command(0x06,0);}/*写入一个字符后光标加1地址加1*/key_value[key_num]=function_reg;LCD_write_char(key_num,LINE2, '.');key_num++;break;case 11: /*按等号键*/if(key_num>=16){ LCD_command(0x07,0);} /*写入一个字符后光标加1地址加1整屏左移*/else{ LCD_command(0x06,0);}/*写入一个字符后光标加1地址加1*/key_value[key_num]=function_reg;LCD_write_char(key_num,LINE2, '=');key_num++;key_value[key_num]='A'; /*结束标记*/work();float_display(final);key_num=0;LCD_command(CLR,0);LCD_write_string(0,LINE1,"function:");LCD_write_string(9,LINE1,ss);break;case 12: /*按运算符键"+,-,*,/"*/if(key_num>=16){ LCD_command(0x07,0);} /*写入一个字符后光标加1地址加1整屏左移*/else{ LCD_command(0x06,0);}/*写入一个字符后光标加1地址加1*/key_value[key_num]=function_reg;LCD_write_char(key_num,LINE2, table2[key_count]);key_num++;break;case 13: /*返回键*/if(key_num==0){ _nop_(); }else{ key_num--;LCD_command(0x04,0);/*写入一个字符后光标加1地址减1*/LCD_set_xy( key_num, LINE2 );}break;case 14: /*功能键*/key_count++;key_count%=4;ss=table[key_count];LCD_command(0x06,0);switch(key_count){case 0: LCD_write_string(9,LINE1,ss);break;case 1: LCD_write_string(9,LINE1,ss);break;case 2: LCD_write_string(9,LINE1,ss);break;case 3: LCD_write_string(9,LINE1,ss);break;default: break;}LCD_set_xy( key_num, LINE2 );break;}}}}void timer0(void) interrupt 1 /*定时器0中断,检测按键状态和100MS定时*/{unsigned char character;TR0 = 0;TL0 = 0xfd;TH0 = 0xd8;TR0 = 1;key_scan_0 = 0;key_scan_1 = 0;key_scan_2 = 0; /*P2口高三位设为0*/character = P2 & 0x1f;if(character!=0x1f) /*有键按下*/{key_scan_0 = 0;key_scan_1 = 1; key_scan_2 = 1; /*扫描第0列是否有键按下*/character=P2&0x1f;if(character!=0x1f) /*如果第0列有键按下*/{key_buffer = character;}key_scan_0 = 1;key_scan_1 = 0; key_scan_2 = 1; /*扫描第1列是否有键按下*/character = P2 & 0x1f;if(character!=0x1f) /*如果第1列有键按下*/{key_buffer = character + 0x20;}key_scan_0 = 1;key_scan_1 = 1; key_scan_2 = 0; /*扫描第2列是否有键按下*/character = P2 & 0x1f;if(character!=0x1f) /*如果第2列有键按下*/{key_buffer = character + 0x40;}key_cnt++;}else {if(key_cnt>4) {key_hit=1;} /*检测键断开*/key_cnt=0;}}void LCD_command(unsigned char command,unsigned char BusyC) {if (BusyC)ReadStatus( );/* Test LCD busy or not */LCD1602_RS=0;LCD1602_RW=0;LCD1602_EN=0;P0 = command;LCD1602_EN=1;delay_10ns();LCD1602_EN=0;}void LCD_data(unsigned char command,unsigned char BusyC){if (BusyC)ReadStatus( ); /* Test LCD busy or not */LCD1602_RS=1;LCD1602_RW=0;LCD1602_EN=0;P0 = command;LCD1602_EN=1;delay_10ns();LCD1602_EN=0;}void LCD_set_xy( unsigned char x, unsigned char y ) /*设置地址*/ {unsigned char address;if (y == LINE1) address = LINE1_HEAD + x;else address = LINE2_HEAD + x;LCD_command(address,1);}void LCD_write_char( unsigned x,unsigned char y,unsigned char dat) /*写单个字符*/{LCD_set_xy( x, y );LCD_data(dat,1);}void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) /*写字符串*/{unsigned char command;LCD_set_xy( X, Y ); /* set address */while (*s!='\0') /* write character */{command = *s;P0 = command;LCD_data(*s,1);s++;}}void LCD_init(void) /*LCD初始化*/{LCD_command(CLR,0); /* clear screen */LCD_command(DA TA_MODE,1); /* set 8 bit data transmission mode */LCD_command(OPEN_SCREEN,1); /* open display (enable lcd display) */LCD_command(DISPLAY_ADDRESS,1); /* set lcd first display address */}uchar ReadStatus(void){P0 = 0xff;LCD1602_RS = 0;LCD1602_RW = 1;LCD1602_RW = 1;LCD1602_RW = 1;LCD1602_RW = 1; /*读忙信号*/LCD1602_EN = 0; LCD1602_EN = 0; LCD1602_EN = 0;LCD1602_EN = 0;LCD1602_EN = 1;while(LCD1602_BUSY_status) ; /*Test Busy State */return 0;}void disp1( ){LCD_command(CLR,0);LCD_write_string(0,LINE1," Wellcome");LCD_write_string(0,LINE2," By: SQ");delay(2000);LCD_command(CLR,0);}void work(){uint i,j,k,p,q,pp;double qq,qqq,a1,b1;double a2,b2;qq=1; qqq=1;j=28; p=0;q=0;pp=0;k=0; b1=0;a1=0;i=0;a2=0; b2=0;while(key_value[i]!= 'A'){switch(key_value[i]){case 0: if(j!=0&&k==0){a1=a1*10+0;j--;}if(j==0&&k!=0){a2=a2*10+0;k--;p++;} i++;break;case 1: if(j!=0&&k==0){a1=a1*10+1;j--;}if(j==0&&k!=0){a2=a2*10+1;k--;p++;} i++;break;case 2: if(j!=0&&k==0){a1=a1*10+2;j--;}if(j==0&&k!=0){a2=a2*10+2;k--;p++;} i++;break;case 3: if(j!=0&&k==0){a1=a1*10+3;j--;}if(j==0&&k!=0){a2=a2*10+3;k--;p++;} i++;break;case 4: if(j!=0&&k==0){a1=a1*10+4;j--;}if(j==0&&k!=0){a2=a2*10+4;k--;p++;} i++;break;case 5: if(j!=0&&k==0){a1=a1*10+5;j--;}if(j==0&&k!=0){a2=a2*10+5;k--;p++;} i++;break;case 6: if(j!=0&&k==0){a1=a1*10+6;j--;}if(j==0&&k!=0){a2=a2*10+6;k--;p++;} i++;break;case 7: if(j!=0&&k==0){a1=a1*10+7;j--;}if(j==0&&k!=0){a2=a2*10+7;k--;p++;} i++;break;case 8: if(j!=0&&k==0){a1=a1*10+8;j--;}if(j==0&&k!=0){a2=a2*10+8;k--;p++;} i++;break;case 9: if(j!=0&&k==0){a1=a1*10+9;j--;}if(j==0&&k!=0){a2=a2*10+9;k--;p++;} i++;break;case 10: j=0;k=28; i++;break;case 11: for(pp=p;pp>0;pp--){ qq=qq*10; }for(pp=q;pp>0;pp--){ qqq=qqq*10; }switch(key_count){case 0:final=(b1+b2/qqq)+(a1+a2/qq); break;case 1:final=(b1+b2/qqq)-(a1+a2/qq); break;case 2:final=(b1+b2/qqq)*(a1+a2/qq); break;case 3:final=(b1+b2/qqq)/(a1+a2/qq); break;default: break;}i++;break;case 12: b2=a2;b1=a1;j=28;k=0;q=p;p=0;a2=0;a1=0; i++;break;case 13: break;case 14: break;default: break;}}}uchar float_display(double disp_data) /*浮点数显示程序*/{unsigned char str1[16];uchar j=0,kk=0,h=0;double k;long l;if(disp_data>=0){k=disp_data; /*输入浮点数是非负数*/l = (long)k; /*浮点数的整数部分*/if(l==0)str1[j++]='0';while(l>0) /*低位先存放*/{str1[j++] = l%10+'0';l /= 10;}}else /*若输入浮点数是负数,则前面显示负号*/{disp_data=-disp_data;k=disp_data;l=(long)k;while(l>0){str1[j++] = l%10+'0';l /= 10;}str1[j++] = '-';}for(kk=0;kk<j;kk++) /*将高低位顺序正确存放*/disp_str[kk] = str1[j-1-kk];disp_str[j++] = '.'; /*存放小数点*/k=disp_data-(long)disp_data; /*取浮点数小数部分*/for(l=0;l<7;l++) /*小数位数由l决定*/{k*= 10;disp_str[j++] = (long)k+'0';k-= (long)k;}disp_str[j] = '\0';if(key_num+j>=16){ if(key_num>=16) {LCD_command(0x05,0); for(h=key_num-16;h>0;h--)LCD_write_char(h-1,LINE2,' '); }LCD_command(0x06,0);LCD_write_string(0,LINE2," ");key_num=0;}LCD_command(0x06,0);LCD_set_xy( key_num, LINE2 );LCD_write_string(key_num,LINE2,disp_str);key_num=0;delay(3000);}。
基于STC89C52RC单片机的简易计算器设计《 电子设计大赛》概要
基于单片机简易计算器的设计汇总两个方案学院专业班级学号学生姓名联系方式指导教师职称2013年5月基于单片机的简易计算器的设计摘要近几年单片机技术的发展很快,其中,电子产品的更新速度迅猛。
计算器是日常生活中比较常见的电子产品之一。
如何才能使计算器技术更加的成熟,充分利用已有的硬件和软件条件,设计出更出色的计算器。
本设计是以STC89C52单片机为核心的计算器模拟系统设计,输入采用4*4矩阵键盘,可以进行加、减、乘、除带符号数字运算(六位整数、两位小数),并在液晶显示屏LCD1602上静态显示操作过程及结果。
本设计的操作过程是利用SCTT89C51的来控制LXD1602显示器,SCT89C51有共四个端口,作为数据的输入端和输出端,其中两个端口作为输出端,两个端口作为输出端,两个特殊的端口XTAL2和XTAL1,则作为外部振荡器的输入端和输出端。
四个端口的作用是:一个输入端接4*4矩阵键盘,另一个数据输入端接显示屏LCD1602的三个特殊端口,而另外两个端口作为输出端口,一个端口接显示屏LCD1602的数据端口,另一个端口作为振荡电路的输入端和输出端,连接好电路,接通电源,则可在液晶显示屏LCD1602显示加、减、乘、除的运算过程及结果,这是计算机的设计总过程。
关键词:单片机;C语言;计算器Simple calculator design based on single chipABSTRACTSingle-chip computer technology developing rapidly in recent years, among them,electronic product update speed is fast. The calculator is one of the electronic products are common in everyday life. How can you make the calculator technology more mature, make full use of existing hardware and software conditions, design a better calculator.This design is based on STC89C52 single-chip microcomputer as the core of calculator simulation system design, input use 4 * 4 matrix keyboard, could add, subtract, multiply and divide signed number-crunching six (integer, two decimal places), and static on the LCD display LCD1602 display operation process and results. This design process is controlled by using SCTT89C51 LXD1602 display, SCT89C51 has a total of four ports, as the data input terminal and output terminal, two of the port as the output side, the two ports as the output side, and two special port XTAL1 and XTAL2, as external oscillator input end and output end. Four port is: a 4 * 4 matrix keyboard input, another data input termination display LCD1602 three specific ports, and the other two ports as output port, a port display LCD1602 data port, another port as oscillation circuit input end and output end, good connection electric circuit, switch on the power, can be in the LCD display LCD1602 display of add, subtract, multiply and divide operation process and result, this is the computer's design process.Key words:Single chip microcomputer; The C language; Calculating machine基于单片机的简易计算器的设计序言随着社会的发展,科学的进步,人们的生活水平在逐步地提高,尤其是微电子技术的发展犹如雨后春笋般的变化。
基于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();}}。
电子设计-基于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结论该系统的软硬件都比较容易理解和实现,所以,具有实现一计算器的可行性。
基于单片机的简易计算器设计论文(1)
基于单片机的简易计算器设计论文(1)论文题目:基于单片机的简易计算器设计引言:计算器是我们日常生活中不可缺少的工具之一,而现代计算器从产品的形态和功能上受到了广泛的关注,它们具有较高的性能和卓越的功能,但是成本较高,同时使用起来不太容易。
本篇论文主要介绍一种简易的计算器设计,该设计基于单片机,可满足日常简单计算使用。
正文:一、设计目标基于单片机的计算器设计,旨在实现以下功能:1、基本运算:加, 减, 乘, 除运算。
2、小数计算:设定包含小数点的计算功能,可进行小数运算。
3、正负运算:支持正数和负数的运算。
4、清零功能:支持清除当前运算,重置计算器状态。
二、设计方法1、硬件设计本设计采用STC89C52RC单片机,其主频为11.0592MHz,具有24KB的Flash,1KB的RAM和256B的EEPROM存储空间,外围可接收光电探测器或手动开关输入,仍可设计LCD显示屏。
2、软件设计(1)实现基本运算功能按下“+”、“-”、“*”、“/”按钮时,代码将控制单片机首先在LCD上输入第一个数字,然后执行一次运算。
通过代码实现的算法,将对之前输入的数字和当前输入的数字进行加法、减法、乘法或除法运算,然后再将结果显示在LCD屏幕上。
(2)实现小数计算功能单片机不能处理小数点,“小数点”的实现需要特殊设置。
通过将输入转换为整数,然后在LCD显示时再加上小数点实现显示小数计算的功能。
(3)实现正负运算功能通过在数字输入前添加“-”实现数字的负数化,进一步实现正负运算的功能。
(4)实现清零功能按下清零按钮时,单片机会将当前将屏幕的显示清空,并恢复到初始状态,保留设置的数据。
三、功能实现本设计基于STC89C52RC单片机,实现了基本运算、小数计算、正负运算和清零功能。
用户可以按下按键进行相关功能的操作,该计算器支持常规计算、对数、三角函数等。
四、总结通过本设计,我们可以实现一个基于单片机的计算器。
由于单片机的低成本和高性能,该计算器实现了类似于高端计算器的功能,但成本更低,且使用方便。
基于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单片机制作一个简单的计算器。
一、硬件设计1、电源电路:为单片机提供稳定的电源。
2、时钟电路:为单片机提供时钟信号,确保其正常运行。
3、复位电路:在单片机出现异常时,通过复位电路实现系统重启。
4、输入电路:用于接收用户输入的数字和运算符。
5、输出电路:用于显示计算结果。
二、软件设计1、初始化程序:对单片机的各个寄存器进行初始化。
2、显示程序:根据需要显示的内容,编写相应的显示程序。
3、输入程序:接收用户输入的数字和运算符,并将其存储在相应的变量中。
4、计算程序:根据用户输入的运算符,调用相应的函数进行计算,并将结果显示在输出电路中。
三、调试与测试1、硬件调试:检查电路板上的元器件是否连接正确,确保电源、输入和输出电路的正常工作。
2、软件调试:通过串口调试工具,对程序进行调试和修改,确保程序的正确性。
3、综合测试:在完成硬件和软件的调试后,进行综合测试,确保计算器的正常工作。
四、结论本文介绍了基于STC89C52单片机的计算器的硬件和软件设计。
通过使用单片机,可以实现简单的计算器功能,并且具有成本低、易于维护和升级等优点。
在制作过程中,需要注意硬件和软件的调试与测试,以确保系统的稳定性和可靠性。
stc89c52单片机技术资料标题:STC89C52单片机技术资料一、概述STC89C52单片机是一种广泛应用的微控制器,它由深圳宏晶科技有限公司生产。
这款单片机具有高性能、低功耗、高可靠性等特点,适用于各种嵌入式系统开发。
下面将详细介绍STC89C52单片机的技术特性、引脚配置、寄存器映射以及常用开发工具等。
二、STC89C52单片机特性1、工作频率:STC89C52单片机的时钟频率可达到35MHz,能够满足大多数应用场景的需求。
电子设计基于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.总体方案选择 (2)1.1 实验要求: (2)1.2方案设计 (2)2.硬件原理电路图的设计及分析 (2)2.1主控模块 (2)2.1.1 STC89C52单片机主要特性 (3)2.1.2 STC89C52单片机管脚图 (4)2.1.3 STC89C52单片机的中断系统 (4)2.1.4 STC89C52单片机的定时/计数器 (4)2.2矩阵键盘模块设计: (5)2.2.1矩阵键盘原理介绍 (5)2.2.2矩阵键盘电路设计 (5)2.3 LCD液晶显示器简介 (6)2.3.1液晶模块简介 (6)2.3.2液晶显示部分与89S52的接口 (7)3系统软件设计 (9)3.1系统软件流程图 (9)3.2系统整体原理图 (10)4.系统调试 (11)4.1硬件调试 (11)4.2软件调试 (11)4.3调试结果 (12)5. 心得体会 (13)1.总体方案选择1.1 实验要求:1)通过小键盘实现数据的输入,并在LED数码管上显示2)实现+、-、*、/3)在LED数码管上显示结果4)并有清零,退出功能1.2方案设计本系统以STC89C52单片机为控制核心,对系统进行初始化,主要完成对键盘的响应、液晶显示灯功能的控制,起到总控和协调各模块之间工作的作用。
单片机通过检测键盘读取使用者按下对用功能的按键,然后通过单片机内部运放把运算的结果显示在液晶屏幕上。
图1-1系统结构框图本系统结构如图1-1所示,本设计可分为以下模块:单片机主控模块、键盘模块、功率放大模块、闹铃模块、按键设置模块。
下面对各个模块的设计方案逐一进行论证分析。
2.硬件原理电路图的设计及分析2.1主控模块STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。
STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。
STC89C52单片机的基本组成框图见图2-1。
基于单片机的简易计算器设计
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)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子设计实验名称:基于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 显示数据和结果。
(2)采用键盘输入方式,键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键(on\c)和等号键(=),故只需要16 个按键即可,设计中采用集成的计算键盘。
(3)在执行过程中,开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。
(4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD 上提示overflow;当除数为0时,计算器会在LCD上提示error。
扩展功能:加上括号的混合运算2.2总体设计思路本设计主要采用以下基本模块来实现:控制器模块,输入模块,输出模块和电源模块。
通过对控制器进行编程。
使其对输入模块的信号进行处理计算,然后通过输出模块反馈给使用者以计算结果。
方案论证与比较控制部分的设计方案论证与选择根据设计要求,控制器主要用于红外信号的接收和辨认、控制步进电机的动作,控制显示步进电机的转速等。
对于控制器的选择有以下三种方案。
方案一:采用计算器专用芯片实现。
用计算器专用芯片进行设计并编程实现。
这种设计方案计算效率高、速度快、而且成本也相对较低,是厂家做计算器的最佳方案。
但是本人对计算器专用芯片掌握的不够,还不足以实现设计计算器,所以这个方案不可去。
方案二:采用FPGA (现场可编程门阵列)作为系统的控制器。
FPGA 将所有器件集成到一块芯片上,体积小,节省空间,提高了稳定性;直接面向用户,STC89C52单片机 4*4键盘LCD 显示晶振电路复位电路线路原理框图具有极大的灵活性和通用性,使用方便,硬件测试和实现快捷,开发效率高,工作可靠性好。
可以实现各种复杂的逻辑功能,规模大,密度高,采用并行的输入输出方式,系统处理速度高,适合作为大规模实时系统的控制核心。
由FPGA 内部编程实现计算器功能,本设计对数据处理速度的要求不是很高,FPGA的高速处理的优势得不到充分的体现,由于其集成度高,使其成本偏高,同时由于芯片的引脚较多,实物电路板布线复杂,加重了电路设计和实际焊接的工作。
并且FPGA的价格相对较高,性价比太低。
方案三、用单片机实现。
由于单片机集成了运算器电路、控制电路、存储器、中断系统、定时器/计数器以及输入/输出口电路等,所以用单片机设计控制电路省去了很多分立元器件。
由于单片机是可编程芯片,并且它可以运用C语言编写,对于一些复杂的计算功能,可以调用C语言库函数。
使编写程序变得非常简单。
所以该课题用单片机实现,不仅功能易于实现,而且精确度高,稳定性好,抗干扰能力强。
并且由于其成本低、体积小、技术成熟和功耗小等优点,且技术比较成熟。
性价比也相当高。
更重要的是本人经过几年的学习,对单片机已有深刻的理解,并且可以灵活运用。
综上所述,并通过各个方面综合比较为达到最佳效果。
我们采用方案三利用单片机控制器。
显示电路的设计方案论证与选择方案一:数码管显示方案。
数码管显示使用两个四位一体动态数码管显示方案,此设计电路如图所示。
采用动态数码管显示,具有程序简单,对外界环境要求低,易于维护,同时其精度比较高,精确可靠,操作简单。
显示直观的特点。
但只能显示数字和一些代码,不能显示汉字及一些常用的符号,且硬件设计比较.复杂。
方案二;LCD1602显示器所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。
目前字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于大部分的字符型液晶。
字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:HD44780内置了DDRAM、CGROM和CGRAM。
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下表:HD44780的指令集1.清屏指令功能:<1> 清除液晶显示器,即将DDRAM的内容全部填入"空白"的ASCII码20H;<2> 光标归位,即将光标撤回液晶显示屏的左上方;<3> 将地址计数器(AC)的值设为0。
2.光标归位指令功能:<1> 把光标撤回到显示器的左上方;<2> 把地址计数器(AC)的值设置为0;<3> 保持DDRAM的内容不变3.进入模式设置指令功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。
参数设定的情况如下所示:位名设置I/D 0=写入新数据后光标左移1=写入新数据后光标右移S 0=写入新数据后显示屏不移动1=写入新数据后显示屏整体右移1个字4.显示开关控制指令功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。
参数设定的情况如下:位名设置D 0=显示功能关1=显示功能开C 0=无光标1=有光标B 0=光标闪烁1=光标不闪烁5.设定显示屏或光标移动方向指令功能:使光标移位或使整个显示屏幕移位。
参数设定的情况如下:S/C R/L 设定情况0 0 光标左移1格,且AC值减10 1 光标右移1格,且AC值加11 0 显示器上字符全部左移一格,但光标不动1 1 显示器上字符全部右移一格,但光标不动6.功能设定指令功能:设定数据总线位数、显示的行数及字型。
参数设定的情况如下:位名设置DL 0=数据总线为4位1=数据总线为8位N 0=显示1行1=显示2行F 0=5×7点阵/每字符1=5×10点阵/每字符7.设定CGRAM地址指令功能:设定下一个要存入数据的CGRAM的地址。
8.设定DDRAM地址指令功能:设定下一个要存入数据的CGRAM的地址。
(注意这里我们送地址的时候应该是0x80+Address,这也是前面说到写地址命令的时候要加上0x80的原因)9.读取忙信号或AC地址指令功能:<1> 读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;当BF=0时,液晶显示器可以接收单片机送来的数据或指令;<2> 读取地址计数器(AC)的内容。
10.数据写入DDRAM或CGRAM指令一览功能:<1> 将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符;<2> 将使用者自己设计的图形存入CGRAM。
11.从CGRAM或DDRAM读出数据的指令一览功能:读取DDRAM或CGRAM中的内容。
基本操作时序:读状态输入:RS=L,RW=H,E=H输出:DB0~DB7=状态字写指令输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码输出:无读数据输入:RS=H,RW=H,E=H输出:DB0~DB7=数据写数据输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据输出:无2.2.2.3、键盘设计方案与选择方案一:独立键盘。
独立键盘为一端接地,另一端接I/O口,并且要接上拉电阻。
这种键盘的硬件都很容易实现,但每一个按键就要用一个I/O口,适合本次设计。
方案二:通过PS2协义,用键盘同单片机相接,从而实现单片机与键盘通信。
其电路如图所示。
现在PC机广泛采用的PS/2接口为miniDIN 6引脚的连接器。
1—数据线(DATA);—未用;3—电源地(GND);4—电源(+5 V);5—时钟(CLK);6—未用。
由此图可知,使用键盘硬件结构比较简单,但键盘的体积太大,所以此系统不采用此方案。
方案三:自制编码键盘。
编码键盘的电路如图所示,这种键盘有编程简单,占用资源少,但其硬件比较复杂,要用很多的二极管,不是很理想。
方案四:4*4矩阵式键盘。
其电路图如图所示,这种键盘的硬件简单,使用的I/O口也不多,而且这种键盘的编程方法已很成熟。
本次设计也可以采用这种矩阵式键盘。
其电路图如图主体设计部分:(1)、系统模块图:输入模块单片机运算模块显示模块(2)、算术运算程序流程图:加开始判断运算符?乘除减判断结果溢出?除数为0?错误信息送显示缓冲数值送显示缓冲YNNY(3)、系统总流程图:开始初始化参数初始化LCD 显示本次功能键?读取键码数字键清零键功能键键入数值状态清零根据上次功能键和输入的数据计算结果结果送显示缓冲LCD 显示有否有键值?数值送显示缓冲结果送显示缓冲等待数值键入等待数值键入结果送显示缓冲等待数值键入YNYN(4)、硬件设计:(一)、总体硬件设计:本设计选用AT89C51单片机为主控单元;显示部分:采用LCD静态显示;按键部分:采用4*4键盘;用MM74C922为4*4键盘扫描IC,读取输入的键值。
总体设计效果如下图:(二)、单片机接口电路说明:1、手动上电复位电路:当VCC上电时,C充电,在10K电阻上出现电压,使得单片机复位;几个毫秒后,C充满,10K电阻上电流降为0,电压也为0,使得单片机进入工作状态。