找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2257|回复: 1
收起左侧

共享51单片机计算器源代码供学习

[复制链接]
ID:189990 发表于 2017-7-1 08:17 | 显示全部楼层 |阅读模式
共享附件内容直接烧录可用。修改一下外设电路的PO口。供学习参考。

单片机源程序如下:


  1. /******************************************************************
  2.                                                         按键说明
  3.                                 S6--S15  数字0--9的输入                S16        清零
  4.                                 S17        等于                        S18--S21加减乘除
  5. 程序功能:        本程序为简易计算器。可以算整数且正数类型的运算。
  6.                         但是暂时没有实现其连算功能,故在每次运算之后,请按下清零键。
  7. ******************************************************************/
  8. #include<reg51.h>

  9. #define uchar unsigned char

  10. uchar a0=16,b0=16,c0=16,d0=16,e0=16,f0=16,wei,temp,key,i,j,k;
  11. uchar jia,jian,cheng,chu,dengyu,jia0,jian0,cheng0,chu0,qingling;
  12. uchar s0,s1,s2,s3,s4,s5; //参加运算的各个位
  13. unsigned long qian,hou;//定义参于运算的第一个数和第二个数。
  14. sbit dula=P2^6;
  15. sbit wela=P2^7;
  16. sbit beep=P2^3;

  17. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  18.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

  19. void delay(uchar i)
  20. {
  21.         for(j=i;j>0;j--)
  22.         for(k=125;k>0;k--);
  23. }
  24. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
  25. {
  26.    
  27.    dula=0;
  28.    P0=table[a];
  29.    dula=1;
  30.    dula=0;

  31.    wela=0;
  32.    P0=0xfe;
  33.    wela=1;
  34.    wela=0;
  35.    delay(5);
  36.    
  37.    P0=table[b];
  38.    dula=1;
  39.    dula=0;

  40.    P0=0xfd;
  41.    wela=1;
  42.    wela=0;
  43.    delay(5);

  44.    P0=table[c];
  45.    dula=1;
  46.    dula=0;

  47.    P0=0xfb;
  48.    wela=1;
  49.    wela=0;
  50.    delay(5);
  51.    
  52.    P0=table[d];
  53.    dula=1;
  54.    dula=0;

  55.    P0=0xf7;
  56.    wela=1;
  57.    wela=0;
  58.    delay(5);
  59.    
  60.    P0=table[e];
  61.    dula=1;
  62.    dula=0;

  63.    P0=0xef;
  64.    wela=1;
  65.    wela=0;
  66.    delay(5);
  67.    
  68.    P0=table[f];
  69.    dula=1;
  70.    dula=0;
  71.    
  72.    P0=0xdf;
  73.    wela=1;
  74.    wela=0;
  75.    delay(5);
  76. }

  77. void keyscan()
  78. {
  79.   {       
  80.     P3=0xfe;
  81.     temp=P3;
  82.     temp=temp&0xf0;
  83.     if(temp!=0xf0)
  84.     {
  85.       delay(10);
  86.       if(temp!=0xf0)
  87.       {       
  88.         temp=P3;
  89.         switch(temp)
  90.         {
  91.           case 0xee:
  92.                key=0;
  93.                            wei++;
  94.                break;

  95.           case 0xde:
  96.                key=1;
  97.                            wei++;
  98.                break;

  99.           case 0xbe:
  100.                key=2;
  101.                            wei++;
  102.                break;

  103.           case 0x7e:
  104.                key=3;
  105.                            wei++;
  106.                break;
  107.          }
  108.          while(temp!=0xf0)
  109.         {
  110.            temp=P3;
  111.            temp=temp&0xf0;
  112.            beep=0;
  113.          }
  114.          beep=1;
  115.       }
  116.     }
  117.     P3=0xfd;
  118.     temp=P3;
  119.     temp=temp&0xf0;
  120.     if(temp!=0xf0)
  121.     {
  122.       delay(10);
  123.       if(temp!=0xf0)
  124.       {
  125.         temp=P3;
  126.         switch(temp)
  127.         {
  128.           case 0xed:
  129.                key=4;
  130.                            wei++;
  131.                break;

  132.           case 0xdd:
  133.                key=5;
  134.                            wei++;
  135.                break;

  136.           case 0xbd:
  137.                key=6;
  138.                            wei++;
  139.                break;

  140.           case 0x7d:
  141.                key=7;
  142.                            wei++;
  143.                break;
  144.          }
  145.          while(temp!=0xf0)
  146.          {
  147.            temp=P3;
  148.            temp=temp&0xf0;
  149.            beep=0;
  150.          }
  151.          beep=1;
  152.       }
  153.       }
  154.     P3=0xfb;
  155.     temp=P3;
  156.     temp=temp&0xf0;
  157.     if(temp!=0xf0)
  158.     {
  159.       delay(10);
  160.       if(temp!=0xf0)
  161.       {
  162.         temp=P3;
  163.         switch(temp)
  164.         {
  165.           case 0xeb:
  166.                key=8;
  167.                            wei++;
  168.                break;

  169.           case 0xdb:
  170.                key=9;
  171.                            wei++;
  172.                break;
  173.                           
  174.           case 0xbb:
  175.                qingling=1;
  176.                            //key=10;
  177.                            //wei++;
  178.                break;

  179.           case 0x7b:
  180.                dengyu=1;
  181.                            //key=11;
  182.                            //wei++;
  183.                break;
  184.          }
  185.         while(temp!=0xf0)
  186.          {
  187.            temp=P3;
  188.            temp=temp&0xf0;
  189.            beep=0;
  190.          }
  191.          beep=1;
  192.       }
  193.       }
  194.               P3=0xf7;
  195.     temp=P3;
  196.     temp=temp&0xf0;
  197.     if(temp!=0xf0)
  198.     {
  199.       delay(10);
  200.       if(temp!=0xf0)
  201.       {
  202.         temp=P3;
  203.         switch(temp)
  204.         {
  205.           case 0xe7:
  206.                              jia=1;
  207.                //key=12;
  208.                           // wei++;
  209.                break;

  210.           case 0xd7:
  211.                jian=1;
  212.                break;

  213.           case 0xb7:
  214.                cheng=1;
  215.                break;

  216.           case 0x77:
  217.                chu=1;
  218.                break;
  219.          }
  220.          while(temp!=0xf0)
  221.          {
  222.            temp=P3;
  223.            temp=temp&0xf0;
  224.            beep=0;
  225.          }
  226.          beep=1;
  227.       }
  228.     }
  229. }
  230. }

  231. void display0()
  232. {
  233.         if(key!=20)
  234.         {
  235.         switch(wei)
  236.                 {
  237.                         case 1: a0=key;
  238.                                         b0=16;
  239.                                         c0=16;
  240.                                         d0=16;
  241.                                         e0=16;
  242.                                         f0=16;
  243.                                         break;
  244.                         case 2: b0=key;
  245.                                         c0=16;
  246.                                         d0=16;
  247.                                         e0=16;
  248.                                         f0=16;
  249.                                         break;
  250.                         case 3: c0=key;
  251.                                         d0=16;
  252.                                         e0=16;
  253.                                         f0=16;
  254.                                         break;
  255.                         case 4: d0=key;
  256.                                         e0=16;
  257.                                         f0=16;
  258.                                         break;
  259.                         case 5: e0=key;
  260.                                         f0=16;
  261.                                         break;
  262.                         case 6: f0=key;
  263.                                         //wei=0;
  264.                                         break;
  265.         }
  266.         key=20;
  267.         }
  268.         display(a0,b0,c0,d0,e0,f0);
  269.         if(a0!=16) s5=a0;
  270.         if(b0!=16) s4=b0;
  271.         if(c0!=16) s3=c0;
  272.         if(d0!=16) s2=d0;
  273.         if(e0!=16) s1=e0;
  274.         if(f0!=16) s0=f0;
  275. }


  276. void main()
  277. {        uchar gongneng,yunsuan;
  278.           while(1)
  279.         {
  280.                   keyscan();
  281.                 gongneng=jia|jian|cheng|chu|dengyu|qingling;
  282.                 if(gongneng==0)
  283.                 {
  284.                         display0();       
  285.                 }
  286.                 else
  287.                 {          yunsuan=jia|jian|cheng|chu;
  288.                         if(yunsuan)
  289.                         {       
  290.        
  291.                                 a0=16;
  292.                                 b0=16;
  293.                                 c0=16;
  294.                                 d0=16;
  295.                                 e0=16;
  296.                                 f0=16;
  297.                                 //wei=0;
  298.                                 if(jia)
  299.                                 {jia=0;        jia0=1;jian0=0;cheng0=0;chu0=0;}
  300.                                 if(jian)
  301.                                 {jian=0;jia0=0;jian0=1;cheng0=0;chu0=0;}
  302.                                 if(cheng)
  303.                                 {cheng=0;jia0=0;jian0=0;cheng0=1;chu0=0;}
  304.                                 if(chu)
  305.                                 {chu=0;        jia0=0;jian0=0;cheng0=0;chu0=1;}
  306.                                 switch(wei)
  307.                                 {
  308.                                         case 6:
  309.                                         qian=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break;
  310.                                         case 5:
  311.                                         qian=s5*10000+s4*1000+s3*100+s2*10+s1;break;
  312.                                         case 4:
  313.                                         qian=s5*1000+s4*100+s3*10+s2;break;
  314.                                         case 3:
  315.                                         qian=s5*100+s4*10+s3;break;
  316.                                         case 2:
  317.                                         qian=s5*10+s4;break;
  318.                                         case 1:
  319.                                         qian=s5;break;
  320.                                 }
  321.                                 wei=0;
  322.                                 s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
  323.                                 display(a0,b0,c0,d0,e0,f0);
  324.                                 //P1=0x55;
  325.                         }
  326.                         if(dengyu)
  327.                         {
  328.                                  dengyu=0;
  329.                                  //display(16,16,16,16,16,16);
  330.                                  switch(wei)
  331.                                 {
  332.                                         case 6:
  333.                                         hou=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break;
  334.                                         case 5:
  335.                                         hou=s5*10000+s4*1000+s3*100+s2*10+s1;break;
  336.                                         case 4:
  337.                                         hou=s5*1000+s4*100+s3*10+s2;break;
  338.                                         case 3:
  339.                                         hou=s5*100+s4*10+s3;break;
  340.                                         case 2:
  341.                                         hou=s5*10+s4;break;
  342.                                         case 1:
  343.                                         hou=s5;break;
  344.                                 }
  345.                                 wei=0;
  346.                                 s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
  347.                                  if(jia0)
  348.                                  {jia0=0;        hou=qian+hou;}
  349.                                  if(jian0)
  350.                                  {jian0=0;        hou=qian-hou;}
  351.                                  if(cheng0)
  352.                                  {cheng0=0;        hou=qian*hou;}
  353.                                  if(chu0)
  354.                                  {chu0=0;        hou=qian/hou;}
  355.                                  if(hou<10)
  356.                                  {
  357. ……………………

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

所有资料51hei提供下载:
51单片机计算器完整源代码.rar (1.93 KB, 下载次数: 12)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:765023 发表于 2020-5-30 14:26 | 显示全部楼层
请问有实物连接图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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