找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17916|回复: 24
打印 上一主题 下一主题
收起左侧

单片机做简易计算器的课程设计(附原理图,程序,ppt和word)

  [复制链接]
跳转到指定楼层
楼主
作者:喵九
时间: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上输出运算结果
三 原理图


四 单片机程序部分
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <ctype.h>                        /*   isdigit()函数   */
  4. #include <stdlib.h>                        /*    atoi()函数     */

  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. uchar operand1[9], operand2[9];  /*   操作数   */
  8. uchar operator;                                         /*   操作符   */

  9. void delay(uint);
  10. uchar keyscan();
  11. void disp(void);
  12. void buf(uint value);
  13. uint compute(uint va1,uint va2,uchar optor);

  14. uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,
  15.                                 0x92,0x82,0xf8,0x80,0x90,0xff};     /*   字符码表   */

  16. uchar dbuf[8] = {10,10,10,10,10,10,10,10};                    /*   显示缓存   */

  17. /*   延时函数   */
  18. void delay(uint z)
  19. {
  20. uint x,y;
  21. for(x=z;x>0;x--)
  22.         for(y=110;y>0;y--);
  23. }

  24. /*******************************************
  25.               键盘扫描程序
  26.        将按键转化为字符并作为输出
  27. ,'#'分别表示清零键和没有键按下
  28. *******************************************/
  29. uchar keyscan()
  30. {
  31.         uchar skey;                     /*   按键值标记变量    */

  32. /***********************
  33.      扫描键盘第1行
  34. ************************/
  35.         P1 = 0xfe;
  36.         while((P1 & 0xf0) != 0xf0)            /*      有按键按下     */
  37.         {
  38.                 delay(3);                            /*      去抖动延时     */

  39.                 while((P1 & 0xf0) != 0xf0)        /*      仍有键按下     */
  40.                 {
  41.                         switch(P1)                                /*    识别按键并赋值   */
  42.                         {
  43.                                 case 0xee: skey = '7'; break;
  44.                                 case 0xde: skey = '8'; break;
  45.                                 case 0xbe: skey = '9'; break;
  46.                                 case 0x7e: skey = '/'; break;

  47.                                 default:   skey = '#';
  48.                         }

  49.                         while((P1 & 0xf0) != 0xf0) /*   等待按键松开   */
  50.                                 ;
  51.                 }
  52.         }

  53. /***********************
  54.      扫描键盘第2行
  55. ************************/
  56.         P1 = 0xfd;
  57.         while((P1 & 0xf0) != 0xf0)
  58.         {
  59.                 delay(3);

  60.                 while((P1 & 0xf0) != 0xf0)
  61.                 {
  62.                         switch(P1)
  63.                         {
  64.                                 case 0xed: skey = '4'; break;
  65.                                 case 0xdd: skey = '5'; break;
  66.                                 case 0xbd: skey = '6'; break;
  67.                                 case 0x7d: skey = '*'; break;

  68.                                 default:   skey = '#';
  69.                         }

  70.                         while((P1 & 0xf0) != 0xf0)
  71.                                 ;
  72.                 }
  73.         }


  74. /***********************
  75.      扫描键盘第3行
  76. ************************/
  77.         P1 = 0xfb;
  78.         while((P1 & 0xf0) != 0xf0)
  79.         {
  80.                 delay(3);

  81.                 while((P1 & 0xf0) != 0xf0)
  82.                 {
  83.                         switch(P1)
  84.                         {
  85.                                 case 0xeb: skey = '1'; break;
  86.                                 case 0xdb: skey = '2'; break;
  87.                                 case 0xbb: skey = '3'; break;
  88.                                 case 0x7b: skey = '-'; break;

  89.                                 default: skey = '#';
  90.                         }

  91.                         while((P1 & 0xf0) != 0xf0)
  92.                                 ;
  93.                 }
  94.         }


  95. /***********************
  96.      扫描键盘第4行
  97. ************************/
  98.         P1 = 0xf7;
  99.         while((P1 & 0xf0) != 0xf0)
  100.         {
  101.                 delay(3);

  102.                 while((P1 & 0xf0) != 0xf0)
  103.                 {
  104.                         switch(P1)
  105.                         {
  106.                                 case 0xe7: skey = '[b]


  107. ; break;
  108.                                 case 0xd7: skey = '0'; break;
  109.                                 case 0xb7: skey = '='; break;
  110.                                 case 0x77: skey = '+'; break;

  111.                                 default:   skey = '#';
  112.                         }

  113.                         while((P1 & 0xf0) != 0xf0)
  114.                                 ;
  115.                 }
  116.         }

  117.         return skey;
  118. }

  119. void main()
  120. {
  121.         uint value1, value2, value;                   /*    数值1,数值2,结果    */
  122.         uchar ckey, cut1 = 0, cut2 = 0;    /*    ckey键盘输入字符    */
  123.         uchar operator;                               /*         运算符         */
  124.         uchar i, bool = 0;

  125. init:                                                                   /*    goto语句定位标签    */

  126.         buf(0);                            /*         初始化         */
  127.         disp();
  128.         value = 0;
  129.         cut1 = cut2 = 0;
  130.         bool = 0;
  131.         for(i = 0;i < 9;i++)
  132.         {
  133.                 operand1[i] = '\0';
  134.                 operand2[i] = '\0';
  135.         }                                  /*         初始化         */

  136.         while(1)
  137.         {
  138.                 ckey = keyscan();             /*         读取键盘        */
  139.                 if(ckey != '#')
  140.                 { /*  isdigit函数,字符是阿拉伯数字返回非0值,否则返回0  */
  141.                         if(isdigit(ckey))
  142.                         {
  143.                                 switch(bool)
  144.                                 {
  145.                                         case 0:
  146.                                                         operand1[cut1] = ckey;
  147.                                                         operand1[cut1+1] = '\0';
  148.                                                         value1 = atoi(operand1);  /*  atoi函数,将字符串转化为,int整数  */
  149.                                                         cut1++;
  150.                                                         buf(value1);
  151.                                                         disp();
  152.                                                         break;
  153.                                         case 1:
  154.                                                         operand2[cut2] = ckey;
  155.                                                         operand2[cut2+1] = '\0';
  156.                                                         value2 = atoi(operand2);
  157.                                                         cut2++;
  158.                                                         buf(value2);
  159.                                                         disp();
  160.                                                         break;

  161.                                         default: break;
  162.                                 }
  163.                         }
  164.                         else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
  165.                         {
  166.                                 bool = 1;
  167.                                 operator = ckey;
  168.                                 buf(0);
  169.                                 dbuf[7] = 10;
  170.                                 disp();
  171.                         }
  172.                         else if(ckey == '=')
  173.                         {
  174.                                 value = compute(value1,value2,operator);
  175.                                 buf(value);
  176.                                 disp();
  177.                                 while(1)                     /*   计算结束等待清零键按下   */
  178.                                 {
  179.                                         ckey = keyscan();
  180.                                         if(ckey == '


  181. )          /* 如果有清零键按下跳转到开始 */
  182.                                                 goto init;
  183.                                         else
  184.                                                 {
  185.                                                         buf(value);
  186.                                                         disp();
  187.                                                 }
  188.                                 }
  189.                         }
  190.                         else if(ckey == '[b]



  191. )
  192.                         {        goto init;}
  193.                 }
  194.                 disp();
  195.         }

  196. }

  197. /******************************************
  198.                  运算函数

  199. 输入:操作数和操作符
  200. 输出:计算结果
  201. *******************************************/
  202. uint compute(uint va1,uint va2,uchar optor)
  203. {
  204.         uint value;

  205.         switch(optor)
  206.         {
  207.                 case '+' : value = va1+va2;        break;
  208.                 case '-' : value = va1-va2;        break;
  209.                 case '*' : value = va1*va2;        break;
  210.                 case '/' : value = va1/va2;        break;

  211.                 default :  break;
  212.         }
  213.         return value;
  214. }

  215. /*******************************************
  216.               更新显示缓存

  217. 输入:无符号整数
  218. 输出:将输入送入显示缓存
  219. *******************************************/
  220. void buf(uint val)
  221. {
  222.         uchar i;
  223.         if(val == 0)
  224.         {
  225.                 dbuf[7] = 0;
  226. ……………………

  227. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

全部资料51hei下载地址:

单片机简易计算器.zip (367.32 KB, 下载次数: 575)


评分

参与人数 2黑币 +55 收起 理由
2morthatik + 5 绝世好帖!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶6 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表