找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的两位数相加的源程序(计算器)

[复制链接]
跳转到指定楼层
楼主
ID:323895 发表于 2018-5-7 01:36 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
实现两位数相加,这里我用到了矩阵键盘和数码管以及独立按键,独立按键控制加法符号和等于符号,矩阵键盘为0-F这16个数,先写十位再写各位,数码管显示,最后,计算出结果以后再利用数码管显示结果,同时蜂鸣器响。
注意,我用的芯片是stc89c52

单片机源程序如下:
  1. #include"reg52.h"
  2. //两位数!!!
  3.   int i;
  4. char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  5.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
  6. int number_1,number_2;int m=20;int value;int numberr[5];int g=1;
  7. sbit a=P2^2;          
  8. sbit b=P2^3;
  9. sbit c=P2^4;
  10. int n=0;
  11. int my;
  12. int uu=1;
  13. sbit beep=P1^5;
  14. int din_K1=0;
  15. int din_K3=0;
  16. int yy=990;
  17. char mm_1;
  18. char bb;
  19. char mm_2;
  20. sbit jia=P3^1;
  21. sbit deng=P3^2;
  22. ////////////////
  23. void Init()
  24. {
  25.         SCON=0X50;                        //设置为工作方式1
  26.         TMOD=0X20;                        //设置计数器工作方式2
  27.         PCON=0X80;                        //波特率加倍
  28.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  29.         TL1=0XF3;
  30.         ES=1;                                                //打开接收中断
  31.         EA=1;                                                //打开总中断
  32.         TR1=1;                                        //打开计数器
  33. }


  34. //////////////
  35. void delay(int d)
  36. {
  37. while(d)
  38.    {
  39.         d--;
  40.    }
  41. }
  42. void check()
  43. {         int z;

  44.         P1=0x0f;
  45.         if(P1!=0x0f)//读取按键是否按下
  46.         {
  47.                 delay(3000);//延时10ms进行消抖
  48.                 if(P1!=0x0f)//再次检测键盘是否按下
  49.                 {       
  50.                         //测试列
  51.                         P1=0X0F;
  52.                         switch(P1)
  53.                         {
  54.                                 case(0X07):        value=0;break;
  55.                                 case(0X0b):        value=1;break;
  56.                                 case(0X0d): value=2;break;
  57.                                 case(0X0e):        value=3;break;
  58.                         }
  59.                         //测试行
  60.                         P1=0XF0;
  61.                         switch(P1)
  62.                         {
  63.                                 case(0X70):        value=value;break;
  64.                                 case(0Xb0):        value=value+4;break;
  65.                                 case(0Xd0): value=value+8;break;
  66.                                 case(0Xe0):        value=value+12;break;
  67.                         }
  68.                         while((z<50)&&(P1!=0xf0))         //检测按键松手检测
  69.                         {
  70.                                 delay(1000);
  71.                                 z++;
  72.                         }
  73.                    din_K1=1;
  74.                    din_K3=1;
  75.                    n++;
  76.                    numberr[n]=value;
  77.                
  78.                   
  79.                 }
  80.     }       
  81.   
  82. }

  83. void oror()
  84. {


  85. if(jia==0)
  86.   {
  87.    delay(1000);
  88.    if(jia==0)
  89.      {
  90.            din_K1=0;
  91.          
  92.          }
  93.   }
  94.   
  95.   




  96. }
  97. void end()
  98. {

  99.   if(deng==0||uu==0)
  100.   {
  101.    delay(1000);
  102.    if(deng==0||uu==0)
  103.     {
  104.         din_K3=0;
  105.         g=0;
  106.           value=numberr[1]*10+numberr[2]+numberr[3]*10+numberr[4];
  107.           number_1=value/10;
  108.           number_2=value%10;
  109.           }
  110.   }
  111.   


  112. }





  113. void main()
  114. {
  115. Init();
  116.   while(g)
  117. {       
  118.     check();


  119.        
  120.     while(din_K1&&din_K3&&uu)
  121.    {
  122.          switch(n%2)
  123.          {
  124.           case 0:c=0;b=0;a=0;P0=smgduan[value];delay(1200);P0=smgduan[0];c=0;b=0;a=1;P0=smgduan[numberr[n-1]];delay(1200);P0=smgduan[0]; break;
  125.           case 1:c=0;b=0;a=1;P0=smgduan[value];delay(1200);P0=smgduan[0];break;
  126.           

  127.          }
  128.          break;
  129.    }
  130. //        oror();
  131.         end();
  132.        
  133.           
  134.        


  135.          

  136.    }
  137.            while(yy)
  138. {
  139. beep=~beep;
  140. delay(10);
  141. yy--;
  142. }


  143.       while(1)
  144.           {         int p=0;
  145.                 for(p=0;p<2;p++)
  146.                 {
  147.                   switch(p)
  148.                   {
  149.                    case 0:c=0;b=0;a=0;P0=smgduan[number_2];delay(1000);P0=smgduan[0];break;
  150.                    case 1:c=0;b=0;a=1;P0=smgduan[number_1];delay(1000);P0=smgduan[0];break;
  151.                   }
  152.                 }
  153.           }







  154. }



  155.   void Usart() interrupt 4
  156. {
  157.    bb=SBUF;
  158.    RI=0;

  159.   if(bb==0x3d)
  160.   {        uu=0;
  161.    
  162.   }
  163.   
  164.   else
  165.   {
  166.   RI=0;
  167.   mm_1=number_1+0x30;
  168.   mm_2=number_2+0x30;
  169.         SBUF=mm_1;
  170.         while(!TI);
  171.         TI=0;
  172.         SBUF=mm_2;
  173.         while(!TI);
  174.         TI=0;
  175.    }

  176. //        RI=0;
  177. //        SBUF=0x30;;//将接收到的数据放入到发送寄存器
  178. //        while(!TI);                         //等待发送数据完成
  179. //        TI=0;                                                 //清除发送完成标志位                                       
  180. }
复制代码

所有资料51hei提供下载:
计算1111111111器——2位数相加.rar (26.28 KB, 下载次数: 29)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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