找回密码
 立即注册

QQ登录

只需一步,快速开始

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

proteus8仿真简易单片机计算器

  [复制链接]
跳转到指定楼层
楼主
51单片机的简易计算器仿真设计,有proteus仿真和程序,可以在附件中下载

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  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. #define PI=3.1415926
  8. uchar operand1[9], operand2[9];  
  9. uchar operator;                  
  10. void delay(uint);
  11. uchar keyscan();
  12. void disp(void);
  13. void buf(uint value);
  14. uint compute(uint va1,uint va2,uchar optor);

  15. uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,
  16.                 0x6d,0x7d,0x07,0x7f,0x6f,0x00};   
  17. uchar dbuf[8] = {10,10,10,10,10,10,10,10};         
  18.      
  19. void delay(uint z)
  20. {
  21.    uint x,y;
  22.    for(x=z;x>0;x--)
  23.    for(y=33;y>0;y--);
  24. }
  25. /*键盘扫描*/
  26. uchar keyscan()
  27. {
  28.     uchar skey;                  
  29.     P1 = 0xfe;
  30.     while((P1 & 0xf0) != 0xf0)      
  31.     {
  32.         delay(10);                  
  33.         while((P1 & 0xf0) != 0xf0)  
  34.         {
  35.             switch(P1)               
  36.             {
  37.                 case 0xee: skey = '7'; break;
  38.                 case 0xde: skey = '8'; break;
  39.                 case 0xbe: skey = '9'; break;
  40.                 case 0x7e: skey = 'f'; break;
  41.                 default:   skey = '#';
  42.             }
  43.             while((P1 & 0xf0) != 0xf0);
  44.         }
  45.     }
  46.     P1 = 0xfd;   
  47.     while((P1 & 0xf0) != 0xf0)
  48.     {
  49.         delay(10);
  50.         while((P1 & 0xf0) != 0xf0)
  51.         {
  52.             switch(P1)
  53.             {
  54.                 case 0xed: skey = '4'; break;
  55.                 case 0xdd: skey = '5'; break;
  56.                 case 0xbd: skey = '6'; break;
  57.                 case 0x7d: skey = '*'; break;
  58.                 default:   skey = '#';
  59.             }
  60.             while((P1 & 0xf0) != 0xf0);
  61.         }
  62.     }
  63.     P1 = 0xfb;
  64.     while((P1 & 0xf0) != 0xf0)
  65.     {
  66.         delay(10);
  67.         while((P1 & 0xf0) != 0xf0)
  68.         {
  69.             switch(P1)
  70.             {
  71.                 case 0xeb: skey = '1'; break;
  72.                 case 0xdb: skey = '2'; break;
  73.                 case 0xbb: skey = '3'; break;
  74.                 case 0x7b: skey = '-'; break;
  75.                 default: skey = '#';
  76.             }
  77.             while((P1 & 0xf0) != 0xf0);
  78.         }
  79.     }
  80.     P1 = 0xf7;
  81.     while((P1 & 0xf0) != 0xf0)
  82.     {
  83.         delay(10);
  84.         while((P1 & 0xf0) != 0xf0)
  85.         {
  86.             switch(P1)
  87.             {
  88.                 case 0xe7: skey =

  89. ; break;
  90.                 case 0xd7: skey = '0'; break;
  91.                 case 0xb7: skey = '='; break;
  92.                 case 0x77: skey = '+'; break;
  93.                 default:   skey = '#';
  94.             }
  95.             while((P1 & 0xf0) != 0xf0);
  96.         }
  97.     }
  98.     return skey;
  99. }
  100. void main()
  101. {   
  102. uint value1, value2, value;        
  103.     uchar ckey, cut1 = 0, cut2 = 0;   
  104.     uchar operator;                        
  105.     uchar i, bool;
  106. init:                                 
  107.     buf(0);                           
  108.     disp();
  109.     value = 0;
  110.     cut1 = cut2 = 0;
  111.     bool = 0;
  112.     for(i = 0;i < 9;i++)
  113.     {
  114.         operand1[i] = '\0';
  115.         operand2[i] = '\0';
  116.     }                               /*初始化*/
  117.     while(1)
  118.     {
  119.         ckey = keyscan();        
  120.         if(ckey != '#')
  121.         {
  122.             if(isdigit(ckey))         
  123.             {
  124.                 switch(bool)   
  125.                 {
  126.                     case 0:
  127.                             operand1[cut1] = ckey;
  128.                             operand1[cut1+1] = '\0';
  129.                             value1 = atoi(operand1);  
  130.                             cut1++;
  131.                             buf(value1);
  132.                             disp();
  133.                             break;
  134.                     case 1:
  135.                             operand2[cut2] = ckey;
  136.                             operand2[cut2+1] = '\0';
  137.                             value2 = atoi(operand2);
  138.                             cut2++;
  139.                             buf(value2);
  140.                             disp();
  141.                             break;
  142.                     default: break;
  143.                 }
  144.             }
  145.             else if(ckey=='+'||ckey=='-'||ckey=='*')
  146.             {
  147.                 bool = 1;   
  148.                 operator = ckey;
  149.                 buf(0);
  150.                 dbuf[7] = 10;           
  151.                 disp();
  152.             }
  153.                                                 else if(ckey=='f')
  154.                                                 {
  155.                                                           operator = ckey;
  156.                 value2=value1;
  157.                                                           buf(0);
  158.                 dbuf[7] = 10;           
  159.                 disp();
  160.                                                          
  161.                                                 }        
  162.             else if(ckey == '=')
  163.             {
  164.                 value = compute(value1,value2,operator);
  165.                 buf(value);
  166.                 disp();
  167.                 while(1)         
  168.                 {
  169.                     ckey = keyscan();
  170.                     if(ckey == '


  171. )   
  172.                         goto init;
  173.                     else
  174.                         {
  175.                             buf(value);
  176.                             disp();
  177.                         }
  178.                 }
  179.             }
  180.             else if(ckey ==

  181. )
  182.             {    goto init;}
  183.         }
  184.         disp();
  185.     }
  186. }
  187. uint compute(uint va1,uint va2,uchar optor)
  188. {
  189.     uint value;
  190.     switch(optor)
  191.     {
  192.         case '+'   : value = va1+va2;    break;
  193.         case '-'   : value = va1-va2;    break;
  194.         case '*'   : value = va1*va2;    break;
  195.                           case 'f'   :
  196.                                                  for(va1=va1-1;va1>0;--va1)        
  197.                                             {  
  198.                                                                                         va2*=va1;
  199.                                               value=va2;
  200.                                                                           }
  201.                                                                                 break;
  202.         default :  break;
  203.     }
  204.     return value;
  205. }
  206. void buf(uint val)
  207. {
  208.     uchar i;
  209.     if(val == 0)
  210.     {
  211.         dbuf[7] = 0;
  212.         i = 6;
  213.     }
  214.     else
  215.         for(i = 7; val > 0; i--)
  216.         {
  217.             dbuf[i] = val % 10;
  218.             val /= 10;
  219.         }
  220.     for( ; i > 0; i--)
  221.         dbuf[i] = 10;
  222. }
  223. void disp(void)
  224. {
  225.     uchar bsel, n;   
  226.     bsel=0xee;
  227.     for(n=0;n<8;n++)
  228.     {
  229.         P2=bsel;
  230.         P0=table[dbuf[n]];
  231.         bsel=_crol_(bsel,1);
  232.         delay(10);
  233.         P0=0x00;
  234.     }
  235. }
复制代码


Keil代码与Proteus8.8仿真下载: 简易计算器.rar (145.63 KB, 下载次数: 127)


0.png (7.47 KB, 下载次数: 162)

0.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:647395 发表于 2019-11-22 17:43 | 只看该作者
太强了
回复

使用道具 举报

板凳
ID:186895 发表于 2020-2-17 14:35 | 只看该作者
感谢楼主分享
回复

使用道具 举报

地板
ID:767625 发表于 2020-6-4 09:55 | 只看该作者
感谢大老分享
回复

使用道具 举报

5#
ID:779375 发表于 2020-6-15 10:49 | 只看该作者
感谢楼主分享
回复

使用道具 举报

6#
ID:449849 发表于 2022-3-16 17:31 | 只看该作者
除法怎么用不了
回复

使用道具 举报

7#
ID:1017001 发表于 2022-6-8 17:25 | 只看该作者
图片,那个程序不知道怎么发上来

1.png (72.3 KB, 下载次数: 88)

1.png
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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