找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机计算器源程序 可发送给上位机 可红外

[复制链接]
ID:817736 发表于 2020-9-19 16:25 | 显示全部楼层 |阅读模式
基于51计算器可发送给上位机可红外

单片机源程序如下:
  1. #include"lcd12864.h"
  2. #include"reg52.h"
  3. #include"i2c.h"
  4. #include"math.h"
  5. sbit IRIN=P3^2;
  6. int app=0;
  7. unsigned char IrValue[6];
  8. unsigned char Time;
  9. unsigned char code smgduan[17]={
  10. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  11. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
  12. void chuan()
  13. {
  14. TMOD=0X20;
  15. TH1=0XFD;
  16. TL1=0XFD;
  17. TR1=1;
  18. REN=1;
  19. SM0=1;
  20. SM1=1;
  21. }
  22. void delay(unsigned int i)
  23. {
  24.         while(i--);       
  25. }
  26. void IrInit()
  27. {
  28.         IT0=1;//下降沿触发
  29.         EX0=1;//打开中断0允许
  30.         EA=1;        //打开总中断

  31.         IRIN=1;//初始化端口
  32. }  
  33. char hongwai()
  34. {
  35.   if((smgduan[IrValue[2]/16]==0x06)&&(smgduan[IrValue[2]%16]==0x7d))
  36.   return '0';
  37.   if((smgduan[IrValue[2]/16]==0x3f)&&(smgduan[IrValue[2]%16]==0x39))
  38.   return '1';
  39.   if((smgduan[IrValue[2]/16]==0x06)&&(smgduan[IrValue[2]%16]==0x7f))
  40.   return '2';
  41.   if((smgduan[IrValue[2]/16]==0x6d)&&(smgduan[IrValue[2]%16]==0x79))
  42.   return '3';
  43.   if((smgduan[IrValue[2]/16]==0x3f)&&(smgduan[IrValue[2]%16]==0x7f))
  44.   return '4';
  45.   if((smgduan[IrValue[2]/16]==0x06)&&(smgduan[IrValue[2]%16]==0x39))
  46.   return '5';
  47.   if((smgduan[IrValue[2]/16]==0x6d)&&(smgduan[IrValue[2]%16]==0x77))
  48.   return '6';
  49.   if((smgduan[IrValue[2]/16]==0x66)&&(smgduan[IrValue[2]%16]==0x5b))
  50.   return '7';
  51.   if((smgduan[IrValue[2]/16]==0x6d)&&(smgduan[IrValue[2]%16]==0x5b))
  52.   return '8';
  53.   if((smgduan[IrValue[2]/16]==0x66)&&(smgduan[IrValue[2]%16]==0x77))
  54.   return '9';
  55.   if((smgduan[IrValue[2]/16]==0x3f)&&(smgduan[IrValue[2]%16]==0x6f))
  56.   return '+';
  57.   if((smgduan[IrValue[2]/16]==0x06)&&(smgduan[IrValue[2]%16]==0x6d))
  58.   return '-';
  59.   if((smgduan[IrValue[2]/16]==0x66)&&(smgduan[IrValue[2]%16]==0x4f))
  60.   return '/';
  61.   if((smgduan[IrValue[2]/16]==0x66)&&(smgduan[IrValue[2]%16]==0x3f))
  62.   return 'x';
  63.   if((smgduan[IrValue[2]/16]==0x3f)&&(smgduan[IrValue[2]%16]==0x07))
  64.   return '=';
  65.   if((smgduan[IrValue[2]/16]==0x66)&&(smgduan[IrValue[2]%16]==0x07))
  66.   return '.';
  67.    if((smgduan[IrValue[2]/16]==0x66)&&(smgduan[IrValue[2]%16]==0x7d))
  68.    return 'p';
  69.    if((smgduan[IrValue[2]/16]==0x66)&&(smgduan[IrValue[2]%16]==0x6d))
  70.    return '|';
  71.   else return 0xff;
  72. }
  73. main()
  74. {

  75.         char i,sign,s,j,k,h=0;
  76.        unsigned char num;                 
  77.   char temp[16];   //最大输入16个
  78.      bit firstflag;

  79.      double a=0,b=0;
  80.          chuan();
  81.      IrInit();
  82.      LCD_Init();

  83. //    LCD_Write_com(0x01); //清屏
  84.    
  85.     while(1)

  86.     {    if(app==1)
  87.              {num=hongwai();
  88.                  app=0;
  89.              }
  90.          else
  91.                   num = KeyPro();

  92.         if(num!=0xff)
  93.         {
  94.             if(j == 0)
  95.                 LCD_Write_com(0x01);
  96.                                 j=1;
  97.              if(num=='|')
  98.                          {
  99.                            a=At24c02Read(1);
  100.                            firstflag = 1;
  101.                          }
  102.             if(('+' == num) || ('-' == num) || ('x' == num) || ('/' == num) || ('=' == num)|| ('p' == num))
  103.             {
  104.                              if(num=='p')
  105.                          {
  106.                            LCD_Write_Char(i,0,num);
  107.                            i++;
  108.                            h=1;
  109.                          }
  110.                             else
  111.                                 {k=0;
  112.                 if(firstflag==0)     //flag=1为第一个数,0为第二个数
  113.                 {
  114.                     sscanf(temp,"%f " ,&a);
  115.                     firstflag = 1;
  116.                                         if(h==1)
  117.                                         a=a*a;
  118.                 }        
  119.                 else
  120.                     {sscanf(temp," %f " ,&b);
  121.                                         if(h==1)
  122.                                         b=b*b;}

  123.                 for(s = 0;s<16;s++)
  124.                     temp[s] = 0;
  125.                                         LCD_Write_Char(i,0,num);
  126.                                         i++        ;
  127.              //////////////////
  128.                 if(num != '=')
  129.                     sign = num;
  130.                 else
  131.                 {        j=0;
  132.                                     i=0;
  133.                     firstflag = 0;
  134.                     switch(sign)
  135.                     {
  136.                         case '+' :a = a+b;break;
  137.                         case '-' :a = a-b;break;
  138.                         case 'x' :a = a*b;break;
  139.                         case '/' :a = a/b;break;
  140.                         default:break;
  141.                     }
  142.                     //LCD_Write_Char(1,1,answer);
  143.                                         At24c02Write(1,a);   //在地址1内写入数据num
  144.                     sprintf(temp,"%.2f",a);    //输出浮点型,无用的0不输出
  145.                      Write_String(0,3,temp);//显示到液晶屏
  146.                                          for(s=0;temp[s]!='\0';s++)
  147.                                          {SBUF=temp[s];
  148.                                          while(!TI);
  149.                                          TI=0;
  150.                                          }
  151.                                           SBUF=' ';
  152.                                          while(!TI);
  153.                                          TI=0;
  154.                     sign = 0;
  155.                     a = 0;
  156.                     b = 0;
  157.                     for(s=0;s<16;s++)
  158.                           temp[s]=0;

  159.                 }
  160.                                 }
  161.             }
  162.             else if((i<24)&&(num!='s')&&(num!='p')&&(num!='k'))
  163.             {
  164.                 if((1==i)&&(temp[0]=='0'))
  165.                 {
  166.                     if(num == '.')
  167.                     {
  168.                         temp[k]=num;
  169.                          LCD_Write_Char(1,0,num);//输出数据
  170.                           i++;
  171.                                                   k++;
  172.                     }
  173.                     else
  174.                     {
  175.                         temp[0] = num;
  176.                         LCD_Write_Char(0,0,num);
  177.                     }

  178.                 }
  179.                 else
  180.                 {
  181.                     temp[k] = num;
  182.                                         LCD_Write_Char(i,0,num);
  183.                     i++;
  184.                                         k++;
  185.                 }                    
  186.             }
  187.         }
  188.     }
  189. }
  190. void ReadIr() interrupt 0
  191. {
  192.         unsigned char j,k;
  193.         unsigned  err;
  194.         Time=0;                                         
  195.         delay(700);        //7ms
  196.         if(IRIN==0)                //确认是否真的接收到正确的信号
  197.         {         
  198.                
  199.                 err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
  200.                 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  201.                 侯,程序死在这里*/       
  202.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                 
  203.                 {                       
  204.                         delay(1);
  205.                         err--;
  206.                 }
  207.                 if(IRIN==1)                        //如果正确等到9ms低电平
  208.                 {
  209.                         err=500;
  210.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
  211.                         {
  212.                                 delay(1);
  213.                                 err--;
  214.                         }
  215.                         for(k=0;k<4;k++)                //共有4组数据
  216.                         {                               
  217.                                 for(j=0;j<8;j++)        //接收一组数据
  218.                                 {

  219.                                         err=60;               
  220.                                         while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  221.                                         {
  222.                                                 delay(1);
  223.                                                 err--;
  224.                                         }
  225.                                         err=500;
  226.                                         while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
  227.                                         {
  228.                                                 delay(10);         //0.1ms
  229.                                                 Time++;
  230.                                                 err--;
  231.                                                 if(Time>30)
  232.                                                 {
  233.                                                         return;
  234.                                                 }
  235.                                         }
  236.                                         IrValue[k]>>=1;         //k表示第几组数据
  237.                                         if(Time>=8)                        //如果高电平出现大于565us,那么是1
  238.                                         {
  239.                                                 IrValue[k]|=0x80;
  240.                                         }
  241.                                         Time=0;                //用完时间要重新赋值                                                       
  242.                                 }
  243.                         }
  244.                 }
  245.                 if(IrValue[2]!=~IrValue[3])
  246.                 {
  247.                         return;
  248.                 }
  249.                 app=1;
  250.         }                       
  251. }  
复制代码

所有程序51hei提供下载:
计算机.7z (29.38 KB, 下载次数: 15)

评分

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

查看全部评分

回复

使用道具 举报

ID:817736 发表于 2020-9-19 16:26 | 显示全部楼层
欢迎提问
回复

使用道具 举报

ID:328014 发表于 2020-9-20 18:07 | 显示全部楼层
能分享一下原理图吗?
回复

使用道具 举报

ID:817736 发表于 2020-9-26 02:22 | 显示全部楼层
51hei团团 发表于 2020-9-20 18:07
能分享一下原理图吗?

原理图照着单片机的焊就行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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