找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5908|回复: 3
收起左侧

基于51单片机的小计算器的仿真+代码设计 数码管显示一位的数的加减乘除

[复制链接]
ID:378929 发表于 2019-1-11 19:46 | 显示全部楼层 |阅读模式
时间有限,只用了数码管显示一位的数的加减乘除
唯一的两个亮点,就是减法数码管能显示负数
除法能显示小数
所有的Proteus仿真图和C源代码都在里面

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

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<math.h>

  4. sbit Sel1=P3^0;
  5. sbit Sel2=P3^1;
  6. sbit Sel3=P3^2;
  7. sbit Sel4 =P3^3;
  8. sbit Sel5=P3^4;
  9. sbit Sel6 =P3^5;
  10. sbit led=P2^0;

  11. unsigned char line=0,cross=0,comline=0,comcross=0;//显示扫描后的行列值
  12. unsigned char shu1=0,shu2=0;//显示计算的数据
  13. unsigned char        keynum=0,workflag=0;
  14. int  keyflag=0,i=0,cons=0,cons1,cons2;           //显示按键和运算状态的逻辑标志变量
  15. unsigned char Shuma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段码值
  16. unsigned char Shuma1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//数码管段码值

  17. void delay(int k); //延时函数
  18. void Keycode();  //键盘编码函数   
  19. void Keys();  //键盘扫描函数

  20. void main()
  21. {
  22.         unsigned char n=0;
  23.         unsigned int temp=0;
  24.         TMOD=0x01;
  25.         TH0=(2^16-50000)/2^8;TL0=(2^16-50000)%2^8;EA=1;TR0=1;ET0=1;
  26.         while(1)
  27.         {
  28.                   Keycode();
  29.                   if(keyflag == 1)
  30.                                 shu1 = keynum;
  31.                         else if(keyflag == 2)
  32.                                 shu2 = keynum;
  33.                         else if(keyflag == 3)
  34.                         {
  35.                                 switch(workflag)
  36.                                 {
  37.                                         case 1:cons = shu1+shu2;break;
  38.                                         case 2:cons = shu1-shu2;break;
  39.                                         case 3:cons = shu1*shu2;break;
  40.                                         case 6:temp =(int)(((float)(shu1)/(float)(shu2))*10);cons1 = temp/10;cons2=temp%10;
  41.                                         break;
  42.                                         default:break;
  43.                                 }
  44.                         }
  45.                         else ;
  46.                         
  47.                         if (workflag == 5)
  48.                         {
  49.                                 keyflag = 0;cross=0;line=0;workflag=0;keynum=0;P0=0xff;
  50.                                 shu1=0;shu2=0;cons=0;
  51.                         }
  52.                         
  53.                 for(n=0;n<8;n++)
  54.                 {
  55.                 switch(n)
  56.                 {
  57.                         case 0:Sel1=1,Sel2=0,Sel3=0,Sel4=0,Sel5=0,Sel6=0;P0=~Shuma[shu1/10];break;
  58.                         case 1:Sel1=0,Sel2=1,Sel3=0,Sel4=0,Sel5=0,Sel6=0;P0=~Shuma[shu1%10];break;
  59.                         case 2:Sel1=0,Sel2=0,Sel3=1,Sel4=0,Sel5=0,Sel6=0;P0=~Shuma[shu2/10];break;
  60.                         case 3:Sel1=0,Sel2=0,Sel3=0,Sel4=1,Sel5=0,Sel6=0;P0=~Shuma[shu2%10];break;
  61.                         case 4:Sel1=0,Sel2=0,Sel3=0,Sel4=0,Sel5=1,Sel6=0;
  62.                                        if(cons >= 0)
  63.                                                                                          P0=~Shuma[cons/10];
  64.                                                                                  else
  65.                                                                                          P0=0xBF;
  66.                                                                                   if(workflag == 6)
  67.                                                                                         {
  68.                                                                                         P0=~Shuma1[cons1];
  69.                                                                                         }break;
  70.                         case 5:Sel1=0,Sel2=0,Sel3=0,Sel4=0,Sel5=0,Sel6=1;
  71.                                                                                         P0=~Shuma[abs(cons)%10];
  72.                                                                                         if(workflag == 6)
  73.                                                                                         P0=~Shuma[cons2];break;
  74.                         default:break;
  75.                         }
  76.                   delay(20);
  77.                   P0=0xff;
  78.          }
  79. }
  80. }

  81. void delay(int k)
  82. {
  83.    while(k--);
  84. }

  85. void Keycode()
  86. {
  87.         switch(cross)
  88.         {
  89.                 case 1:
  90.                  switch(line)
  91.                  {
  92.                          case 1:keynum=1;break;
  93.                    case 2:keynum=2;break;
  94.                    case 3:keynum=3;break;
  95.                    case 4:workflag=1;break;
  96.                    default:break;
  97.                  };break;
  98.                  
  99.                 case 2:
  100.                  switch(line)
  101.                  {
  102.                          case 1:keynum=4;break;
  103.                    case 2:keynum=5;break;
  104.                    case 3:keynum=6;break;
  105.                    case 4:workflag=2;break;
  106.                    default:break;
  107.                  };break;
  108.                  
  109.      case 3:
  110.                  switch(line)
  111.                  {
  112.                          case 1:keynum=7;break;
  113.                    case 2:keynum=8;break;
  114.                    case 3:keynum=9;break;
  115.                    case 4:workflag=3;break;
  116.                    default:break;
  117.                  };break;
  118.                  
  119.                  case 4:
  120.                  switch(line)
  121.                  {
  122.                          case 1:keynum=0;break;
  123.                    case 2:workflag=4;break;
  124.                    case 3:workflag=5;break;
  125.                    case 4:workflag=6;break;
  126.                    default:break;
  127.                  };break;
  128.                 default:break;
  129.         }
  130. }

  131. void Keys()
  132. {
  133.                 P1=0xf0;
  134.           if( P1 != 0xf0)
  135.                         keyflag++;
  136.                 switch(P1)
  137.                 {
  138.                         case 0x70:cross=1;break;
  139.                         case 0xb0:cross=2;break;
  140.                         case 0xd0:cross=3;break;
  141.                         case 0xe0:cross=4;break;
  142.                 }
  143.                
  144. ……………………

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

所有资料51hei提供下载:
Calculate.rar (17.67 KB, 下载次数: 116)

评分

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

查看全部评分

回复

使用道具 举报

ID:648959 发表于 2019-11-27 09:47 | 显示全部楼层
很好,正是我需要的,
回复

使用道具 举报

ID:1021743 发表于 2022-4-26 08:46 | 显示全部楼层
一位数的加减法计算器单片机
回复

使用道具 举报

ID:963981 发表于 2023-5-31 22:43 | 显示全部楼层
支持,好心人~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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