当前位置:文档之家› 单片机简易计算器课程设计

单片机简易计算器课程设计

单片机简易计算器课程设计课程设计题目名称________________ 简易计算器设计____________ 课程名称_____________ 单片机原理及应用____________ 学生姓名________________班级学号________________2018年6月20日目录一设计目的 (2)二总体设计及功能介绍 (2)三硬件仿真图 (3)四主程序流程图 (4)五程序源代码 (5)六课程设计体会 (28)设计目的本设计是基于51系列单片机来进行的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、乘、除六位整数数范围内的基本四则运算,并在LED上显示相应的结果。

软件方面使用C语言编程,并用PROTUE仿真。

二总体设计及功能介绍根据功能和指标要求,本系统选用MCS-51 系列单片机为主控机,实现对计算器的设计。

具体设计及功能如下:由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED显示数据和结果;另外键盘包括数字键(0〜9)、符号键(+、-、x、十)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算键盘;执行过程:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。

三硬件仿真图硬件部分比较简单,当键盘按键按下时它的那一行、那一列的端口为低电平。

因此,只要扫描行、列端口是否都为低电平就可以确定是哪个键被按下。

四主程序流程图开始初贻化考藪 -田湿丞_丿<-有龍输入、 ^ k''w,v _ 一 〜~ N基否阿扌剑白数拿二程序的主要思想是:将按键抽象为字符,然 后就是对字符的处理。

将操作数分别转化为字符 串存储,操作符存储为字符形式。

然后调用 compute 。

函数进行计算并返回结果。

具体程序址理__cr爆存操作符 熄灭数毎管是否操作捋是岳号显示计埠结果并霊示|■+-尊待蚀兀键摄下<,選否OVC 超/及看注释还有流程图五程序源代码#inelude <reg51.h >#inelude < intrins.h >atoi()函数 */#define uehar unsigned ehar #define uint unsignedintuehar opera nd1[ 9], opera nd2[ 操作数 */uchar operator ;/*#inelude < etype.h >/*isdigit()函数 */ #inelude < stdlib.h >/*9]; /*操作符*/void delay(uint);uchar keysca n();void disp( void );void buf(uint value);uint compute( uint va1,u int va2,ucharoptor);uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; /* 字符码表*/ uchar dbuf[ 8] = {10,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 keysca n(){uchar skey;/* 按键值标记变量*/ /***********************扫描键盘第1行************************P1 = Oxfe;while ((P1 & OxfO) != 0xf0) /* 有按键按下*/{delay( 3); /* 去抖动延时*/仍有键按下*/{switch (P1)/* 识别按键并赋值*/{case Oxee : skey = '7'; break ;case 0xde : skey = 8 ; break ;case 0xbe : skey = 9 ; break ;case 0x7e : skey = '/'; break ;等待按键松开*//***********************扫描键盘第2行************************P1 = Oxfd;while ((P1 & OxfO) != 0xf0)break break break {switch (P1){case 0xed : skey =case Oxdd : skey =case 0xbd :skey =case 0x7d : skey ='4';'5';'6';■J}}/***********************扫描键盘第3行************************P1 = 0xfb;while ((P1 & OxfO) != 0xf0)break break break {switch (P1){case 0xeb : skey =case 0xdb : skey =case 0xbb :skey =case 0x7b : skey ='1';'2';■J}}/***********************扫描键盘第4行************************P1 = 0xf7;while ((P1 & OxfO) != 0xf0)break break break {switch (P1){case 0xe7 : skey =case 0xd7 :skey =case 0xb7 : skey =case 0x77 : skey ='$';'O';'+';J■J}}return skey;} void main(){uint value1, value2, value;/* 数值1,数值2,结果*/uchar ckey, cut1 = 0, cut2 = 0; /*ckey 键盘输入字符*/uchar operator ;/*运算符*/uchar i, bool = 0;buf( 0);初始化*/disp();value = 0;cut1 = cut2 = 0;bool = 0;for (i = 0;i < 9;i++ )in it : goto 语句定位标签 *//*/*opera nd1[i] = '\0'operand2[i] = '\0';} /* 初始化*/while (1){ckey =keysca n(); /* 读取键盘*/if(ckey != '#'){ /* isdigit函数,子符是阿拉伯数子返回非0值,否则返回0 */if (isdigit(ckey))switch (bool ){case 0:opera nd1[cut1] = ckey;opera nd1[cut1 + 1] = '\0';value1 =atoi(opera ndl); /* atoi函数,将字符串转化为,int整数*/cut1 ++ ;buf(value1); disp();break ;case 1:opera nd2[cut2] = ckey;opera nd2[cut2 + 1] = '\0';value2 =atoi(opera nd2);cut2 ++ ;buf(value2);disp();break ;default :break ;}}elseif (ckey == '+' ||ckey == '-' || ckey == '*' || ckey =='/'){bool = 1;operator = ckey;buf( 0);dbuf[ 7] = 10; disp();}else if (ckey =='='){value =compute(value1,value2, operator );buf(value);disp();while (1)/* 计算结束等待清零键按下*/{ckey = keysca n();if(ckey == '$')/*如果有清零键按下跳转到开始*/goto in it;else{buf(value); disp();}}}else if (ckey == '$'){ goto in it;}disp();}}/***************************************** *运算函数输入:操作数和操作符输出:计算结果****************************************** */uint compute( uint va1,u int 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; breakdefault breakreturn value;}/*******************************************更新显示缓存输入:无符号整数输出:将输入送入显示缓存************************************ *******/void buf(uint val)uchar i;if (val == 0){dbuf[ 7] = 0;i = 6;}elsei = 7; val > 0 :i--)for(i{dbuf[i] = val % 10;val /= 10;}for ( ; i > 0; i--)dbuf[i] = 10;/*******************************************显示函数****************************************** */void disp( void ){uchar bsel, n;bsel = 0x01;for (n = 0;n < 8;n ++ )P2= bsel;PO=table[dbuf[ n]];bsel =_crol_(bsel, 1);delay( 3);P0 = 0xff;六课程设计体会接到这个课题以后,我先是学习了PROTEUS 软件的使用,按照题目所要求来进行分析,设计,连接电路图,调试,最终完成计算器的仿真。

相关主题