作者:喵九
时间:2018.6
这份文件是‘单片机原理’简易计算器的课程设计,可实现加减乘除四种运算。
文件包含:
1:protues原理电路图(可分别适用于protues8.0之前跟之后的各个版本)。
2:计算器的C程序语言。
3:可直接被单片机运行的hex计算器程序。
4:计算器word文档。
5:计算器ppt。
一 设计目的
本设计是基于51系列单片机来进行的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、乘、除六位整数数范围内的基本四则运算,并在LED上显示相应的结果。软件方面使用C语言编程,并用PROTUES仿真。
二 总体设计及功能介绍
根据功能和指标要求,本系统选用MCS-51系列单片机为主控机,实现对计算器的设计。具体设计及功能如下:
由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED 显示数据和结果;
另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘;
执行过程:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果
三 原理图
四 单片机程序部分
- #include <reg51.h>
- #include <intrins.h>
- #include <ctype.h> /* isdigit()函数 */
- #include <stdlib.h> /* atoi()函数 */
- #define uchar unsigned char
- #define uint unsigned int
- uchar operand1[9], operand2[9]; /* 操作数 */
- 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 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 keyscan()
- {
- uchar skey; /* 按键值标记变量 */
- /***********************
- 扫描键盘第1行
- ************************/
- P1 = 0xfe;
- while((P1 & 0xf0) != 0xf0) /* 有按键按下 */
- {
- delay(3); /* 去抖动延时 */
- 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行
- ************************/
- 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)
- ;
- }
- }
- /***********************
- 扫描键盘第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 & 0xf0) != 0xf0)
- ;
- }
- }
- /***********************
- 扫描键盘第4行
- ************************/
- P1 = 0xf7;
- while((P1 & 0xf0) != 0xf0)
- {
- delay(3);
- while((P1 & 0xf0) != 0xf0)
- {
- switch(P1)
- {
- case 0xe7: skey = '[b]
- ; break;
- case 0xd7: skey = '0'; break;
- case 0xb7: skey = '='; break;
- case 0x77: skey = '+'; break;
- default: skey = '#';
- }
- while((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++)
- {
- operand1[i] = '\0';
- operand2[i] = '\0';
- } /* 初始化 */
- while(1)
- {
- ckey = keyscan(); /* 读取键盘 */
- if(ckey != '#')
- { /* isdigit函数,字符是阿拉伯数字返回非0值,否则返回0 */
- if(isdigit(ckey))
- {
- switch(bool)
- {
- case 0:
- operand1[cut1] = ckey;
- operand1[cut1+1] = '\0';
- value1 = atoi(operand1); /* atoi函数,将字符串转化为,int整数 */
- cut1++;
- buf(value1);
- disp();
- break;
- case 1:
- operand2[cut2] = ckey;
- operand2[cut2+1] = '\0';
- value2 = atoi(operand2);
- cut2++;
- buf(value2);
- disp();
- break;
- default: break;
- }
- }
- else if(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 = keyscan();
- if(ckey == '
- ) /* 如果有清零键按下跳转到开始 */
- goto init;
- else
- {
- buf(value);
- disp();
- }
- }
- }
- else if(ckey == '[b]
- )
- { goto init;}
- }
- disp();
- }
- }
- /******************************************
- 运算函数
- 输入:操作数和操作符
- 输出:计算结果
- *******************************************/
- uint compute(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(uint val)
- {
- uchar i;
- if(val == 0)
- {
- dbuf[7] = 0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部资料51hei下载地址:
单片机简易计算器.zip
(367.32 KB, 下载次数: 577)
|