找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机计算器设计(可进行加减乘除以及平方等运算)带仿真与源码

[复制链接]
跳转到指定楼层
楼主
基于单片机的计算器,矩阵键盘输入,lcd1602液晶屏显示,可以进行加减乘除以及平方等运算

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


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<math.h>
  3. #include"define.h"         //定义头文件
  4. #include"delay.h"         //延迟头文件
  5. #include"display.h"         //显示头文件
  6. #include"scan.h"         //扫描头文件
  7. #include"LCD1602.h"         //LCD1602头文件
  8. #include"interrupt.h" //中断头文件
  9. void main()                   //主程序
  10. {
  11.         uchar error=0,i,first=0,dot1,dot2,dot1_num,dot2_num,minus1,minus2;//错误标志、第一次清屏标志、小数点标志以及小数点个数 负号标志、负号个数                 
  12.         uchar Key_num,last_key_num;                                                                 //键号
  13.         uchar flag=0,equal_flag;                                          //运算符、等于符
  14.         double num1=0,num2=0,num=0,result=0;                 //第一个数、第二个数、计算结果
  15.         uchar first_num=0,second_num=0;
  16.         InitLcd();
  17.         EA=1;
  18.         ET0=1;
  19.         TMOD=0X01;
  20.         TH0=(65536-500)/256;
  21.         TL0=(65536-500)%256;
  22.         write_com(0x80+0x40+15);  
  23.         write_Dat('0');
  24.         write_com(0x80);               
  25.         while(1)
  26.         {        
  27.                 while(key_scan()==0xff);
  28.                 TR0=1;
  29.                 if(first==0)
  30.                 {
  31.                         first=1;
  32.                          write_com(0x01);         
  33.                 }
  34.                 Key_num=key_scan();
  35.                 switch(key_scan())
  36.                 {
  37.                
  38.                         case 6:write_Dat('7');num=7;break;
  39.                         case 7:write_Dat('8');num=8;break;
  40.                         case 8:write_Dat('9');num=9;break;
  41.                         case 9:
  42.                                         if(last_key_num!=Key_num)
  43.                                         {
  44.                                                 write_Dat('+');
  45.                                                 flag=1;         
  46.                                         }break;
  47.                         case 10:
  48.                                         if(last_key_num!=Key_num)
  49.                                         {
  50.                                                 write_Dat('^');
  51.                                                 flag=5;
  52.                                         }break;
  53.                         case 11:write_Dat('4');num=4;break;
  54.                         case 12:write_Dat('5');num=5;break;
  55.                         case 13:write_Dat('6');num=6;break;
  56.                         case 14:
  57.                                         if(last_key_num!=Key_num)
  58.                                         {
  59.                                                 write_Dat('-');
  60.                                                 flag=2;
  61.                                         }break;
  62.                         case 15:
  63.                                 if(last_key_num!=Key_num)
  64.                                         {
  65.                                                 write_Dat('T');
  66.                                                 flag=6;
  67.                                         }break;
  68.                         case 16:write_Dat('1');num=1;break;
  69.                         case 17:write_Dat('2');num=2;break;
  70.                         case 18:write_Dat('3');num=3;break;
  71.                         case 19:
  72.                                         if(last_key_num!=Key_num)
  73.                                         {
  74.                                                 write_Dat('*');
  75.                                                 flag=3;
  76.                                         }break;
  77.                         case 21:write_Dat('0');num=0;break;
  78.                         case 22:
  79.                                         if(last_key_num!=Key_num)
  80.                                         {
  81.                                                 if(flag==0)
  82.                                                 {
  83.                                                         minus1++;
  84.                                                         if(minus1==1)
  85.                                                         {
  86.                                                                 write_Dat('-');        
  87.                                                         }
  88.                                                 }
  89.                                                 else
  90.                                                 {
  91.                                                          minus2++;
  92.                                                          if(minus2==1)
  93.                                                          {
  94.                                                                  write_Dat('-');        
  95.                                                          }
  96.                                                 }
  97.                                         } break;
  98.                         case 23:
  99.                                         if(last_key_num!=Key_num)
  100.                                         {        
  101.                                                 if(flag==0)
  102.                                                 {
  103.                                                         dot1++;
  104.                                                         if(dot1==1)
  105.                                                         {
  106.                                                                 write_Dat('.');        
  107.                                                         }
  108.                                                 }
  109.                                                 else
  110.                                                 {
  111.                                                          dot2++;
  112.                                                          if(dot2==1)
  113.                                                          {
  114.                                                                  write_Dat('.');        
  115.                                                          }
  116.                                                 }
  117.                                         } break;
  118.                                        
  119.                         case 24:
  120.                                 if(last_key_num!=Key_num)
  121.                                         {
  122.                                                 write_Dat('/');
  123.                                                 flag=4;
  124.                                         }break;
  125.                         case 25:
  126.                                 if(last_key_num!=Key_num)
  127.                                 {
  128.                                         write_Dat('=');
  129.                                         equal_flag=1;
  130.                                 }break;
  131.                 }
  132.                 if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=15&&Key_num!=22&&Key_num!=23&&Key_num!=25)                                //第一个数
  133.                 {
  134.                         if(flag==0)
  135.                         {

  136.                                 num1=num1*10+num;        
  137.                                 num=0;
  138.                                 if(dot1!=0)
  139.                                 {
  140.                                         dot1_num++;               
  141.                                 }
  142.                                 first_num=1;
  143.                         }
  144.                         if(flag!=0)
  145.                         {
  146.                                 num2=num2*10+num;
  147.                                 num=0;
  148.                                 if(dot2!=0)
  149.                                 {
  150.                                         dot2_num++;        
  151.                                 }
  152.                                 second_num=1;
  153.                         }
  154.                 }
  155.                 if(equal_flag==1&&first_num==1)
  156.                 {        
  157.                         if(dot1!=0)
  158.                         {
  159.                                  num1=num1/pow(10,dot1_num);
  160.                                  dot1=0;
  161.                         }
  162.                         if(dot2!=0)
  163.                         {
  164.                                  num2=num2/pow(10,dot2_num);
  165.                                  dot2=0;
  166.                         }
  167.                         if(minus1!=0)
  168.                         {
  169.                                 num1=num1*(-1);
  170.                         }
  171.                         if(minus2!=0)
  172.                         {
  173.                             num2=num2*(-1);
  174.                         }
  175.                         if(second_num!=0)
  176.                         {
  177.                                 switch(flag)
  178.                                 {
  179.                                         case 1:result=num1+num2;break;
  180.                                         case 2:result=num1-num2;break;
  181.                                         case 3:result=num1*num2;break;
  182.                                         case 4:
  183.                                                         if(num2!=0)
  184.                                                          {  
  185.                                                                   result=num1/num2;
  186.                                                           }
  187.                                                         else
  188.                                                         {
  189.                                                                   write_com(0x80+0x40+10);
  190.                                                                   for(i=0;i<5;i++)
  191.                                                                   {
  192.                                                                                   write_Dat(table2[i]);
  193.                                                                   }        
  194.                                                                    error=1;
  195.                                                         } break;
  196.                                         case 5:        result=pow(num1,num2);break;
  197.                                         case 6: result=pow(num1,1/num2);break;                                                                                                                                          
  198.                                 }
  199.                         }
  200.                
  201.                         if(error!=1)
  202.                          display(result);
  203.                 }
  204.         
  205.                 if(Key_num==20)                //清零
  206.                 {
  207.                         num1=num2=result=0;
  208. ……………………

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

所有资料51hei提供下载:
基于单片机计算器.rar (85.18 KB, 下载次数: 62)


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

使用道具 举报

沙发
ID:242547 发表于 2018-5-2 21:21 | 只看该作者
楼主,目标无法创建怎么回事啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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