单片机简易计算器课程设计_第1页
单片机简易计算器课程设计_第2页
单片机简易计算器课程设计_第3页
单片机简易计算器课程设计_第4页
单片机简易计算器课程设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课 程 设 计题 目 名 称 简易计算器设计 课 程 名 称 单片机原理及应用 学 生 姓 名 班 级 学 号 2021年 6 月20日19目录一 设计目的2二 总体设计及功能介绍2三 硬件仿真图3四 主程序流程图4五 程序源代码4六 课程设计体会17一 设计目的本设计是基于51系列单片机来进行的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、乘、除六位整数数范围内的根本四那么运算,并在LED上显示相应的结果。软件方面使用C语言编程,并用PROTUES仿真。二 总体设计及功能介绍 根据功能和指标要求,本系统选用MCS-51系列单片机为主控机,实现对计算器的设计。具体设计及功能如下:&

2、#160; 由于要设计的是简单的计算器,可以进行四那么运算,为了得到较好的显示效果,采用LED 显示数据和结果;  另外键盘包括数字键09、符号键+、-、×、÷、去除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘;  执行过程:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。三 硬件仿真图 硬件局部比拟简单,当键盘按键按下时它的那一行、那一列的端口为低电平。因此,只

3、要扫描行、列端口是否都为低电平就可以确定是哪个键被按下。四 主程序流程图 程序的主要思想是:将按键抽象为字符,然后就是对字符的处理。将操作数分别转化为字符串存储,操作符存储为字符形式。然后调用compute()函数进行计算并返回结果。具体程序及看注释还有流程图五 程序源代码#include <reg51.h>#include <intrins.h>#include <ctype.h> /* isdigit()函数 */#include <stdlib.h> /* atoi()函数 */#define uchar unsigned char#def

4、ine uint unsigned intuchar operand19, operand29; /* 操作数 */uchar operator; /* 操作符 */void delay(uint);uchar keyscan();void disp(void);void buf(uint value);uint compute(uint va1,uint va2,uchar optor);uchar code table = 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xff; /* 字符码表 */uchar dbuf8 = 10,

5、10,10,10,10,10,10,10; /* 显示缓存 */* 延时函数 */ void delay(uint z)uint x,y;for(x=z;x>0;x-) for(y=110;y>0;y-);/* 键盘扫描程序 将按键转化为字符并作为输出 '$','#'分别表示清零键和没有键按下 */uchar keyscan() uchar skey; /* 按键值标记变量 */* 扫描键盘第1行 */ P1 = 0xfe; while(P1 & 0xf0) != 0xf0) /* 有按键按下 */ delay(3); /* 去抖动延时 */

6、 while(P1 & 0xf0) != 0xf0) /* 仍有键按下 */ switch(P1) /* 识别按键并赋值 */ case 0xee: skey = '7' break; case 0xde: skey = '8' break; case 0xbe: skey = '9' break; case 0x7e: skey = '/' break; default: skey = '#' while(P1 & 0xf0) != 0xf0) /* 等待按键松开 */ ; /* 扫描键盘第2行

7、*/ P1 = 0xfd; while(P1 & 0xf0) != 0xf0) delay(3); while(P1 & 0xf0) != 0xf0) switch(P1) case 0xed: skey = '4' break; case 0xdd: skey = '5' break; case 0xbd: skey = '6' break; case 0x7d: skey = '*' break; default: skey = '#' while(P1 & 0xf0) != 0xf0)

8、 ; /* 扫描键盘第3行 */ P1 = 0xfb; while(P1 & 0xf0) != 0xf0) delay(3); while(P1 & 0xf0) != 0xf0) switch(P1) case 0xeb: skey = '1' break; case 0xdb: skey = '2' break; case 0xbb: skey = '3' break; case 0x7b: skey = '-' break; default: skey = '#' while(P1 &

9、0xf0) != 0xf0) ; /* 扫描键盘第4行 */ P1 = 0xf7; while(P1 & 0xf0) != 0xf0) delay(3); while(P1 & 0xf0) != 0xf0) switch(P1) case 0xe7: skey = '$' break; case 0xd7: skey = '0' break; case 0xb7: skey = '=' break; case 0x77: skey = '+' break; default: skey = '#' w

10、hile(P1 & 0xf0) != 0xf0) ; return skey;void main() uint value1, value2, value; /* 数值1,数值2,结果 */ uchar ckey, cut1 = 0, cut2 = 0; /* ckey键盘输入字符 */ uchar operator; /* 运算符 */ uchar i, bool = 0;init: /* goto语句定位标签 */ buf(0); /* 初始化 */ disp(); value = 0; cut1 = cut2 = 0; bool = 0; for(i = 0;i < 9;i

11、+) operand1i = '0' operand2i = '0' /* 初始化 */ while(1) ckey = keyscan(); /* 读取键盘 */ if(ckey != '#') /* isdigit函数,字符是阿拉伯数字返回非0值,否那么返回0 */ if(isdigit(ckey) switch(bool) case 0: operand1cut1 = ckey; operand1cut1+1 = '0' value1 = atoi(operand1); /* atoi函数,将字符串转化为,int整数 */

12、cut1+; buf(value1); disp(); break; case 1: operand2cut2 = ckey; operand2cut2+1 = '0' value2 = atoi(operand2); cut2+; buf(value2); disp(); break; default: break; else if(ckey='+'|ckey='-'|ckey='*'|ckey='/') bool = 1; operator = ckey; buf(0); dbuf7 = 10; disp();

13、 else if(ckey = '=') value = compute(value1,value2,operator); buf(value); disp(); while(1) /* 计算结束等待清零键按下 */ ckey = keyscan(); if(ckey = '$') /* 如果有清零键按下跳转到开始 */ goto init; else buf(value); disp(); else if(ckey = '$') goto init; disp(); /* 运算函数 输入:操作数和操作符 输出:计算结果*/uint comput

14、e(uint va1,uint va2,uchar optor) uint value; switch(optor) case '+' : value = va1+va2; break; case '-' : value = va1-va2; break; case '*' : value = va1*va2; break; case '/' : value = va1/va2; break; default : break; return value;/* 更新显示缓存输入:无符号整数输出:将输入送入显示缓存*/void buf

15、(uint val) uchar i; if(val = 0) dbuf7 = 0; i = 6; else for(i = 7; val > 0; i-) dbufi = val % 10; val /= 10; for( ; i > 0; i-) dbufi = 10;/* 显示函数 */void disp(void) uchar bsel, n; bsel=0x01; for(n=0;n<8;n+) P2=bsel; P0=tabledbufn; bsel=_crol_(bsel,1); delay(3); P0=0xff; 六 课程设计体会接到这个课题以后,我先是学习

16、了PROTEUS软件的使用,按照题目所要求来进行分析,设计,连接电路图,调试,最终完成计算器的仿真。接到题目后,我先是分析了题目中所涉及到的知识以及器件,然后按照分析,到图书馆和互联网上搜索了相关的内容,按照自己的设想和图书资料的提示,我初步设计了计算器的原理结构,然后进行反复验证实验,完善了设计,然后通过学习PROTEUS软件,让我很轻松的就掌握了如何在软件中建立原件,连线,并进行编程,调试,仿真等工作。软件的强大功能使得在连接电路图时很顺利,程序编译阶段,通过提示的错误,我也进行了修改,听取同学的建议,最终无错误,并对所设计的计算器电路进行了仿真。最终顺利的实现了任务要求的所有功能,并且电路设计简单易读,构造巧妙,计算速度快。本次课程设计中,另我最难忘的是编程环节,真的是很难,开始的时候感觉自己啥也不会,然后决定重新学习课本,但是编程不像课本习题那样简单的几行来实现简单的功能,本次任务是实现一个简易功能的计算器,虽

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论