久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2236|回復: 3
打印 上一主題 下一主題
收起左側(cè)

基于51單片機計算器源程序 可發(fā)送給上位機 可紅外

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:817736 發(fā)表于 2020-9-19 16:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
基于51計算器可發(fā)送給上位機可紅外

單片機源程序如下:
  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;//下降沿觸發(fā)
  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為第一個數(shù),0為第二個數(shù)
  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內(nèi)寫入數(shù)據(jù)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);//輸出數(shù)據(jù)
  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.                 /*當兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
  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組數(shù)據(jù)
  216.                         {                               
  217.                                 for(j=0;j<8;j++)        //接收一組數(shù)據(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表示第幾組數(shù)據(jù)
  237.                                         if(Time>=8)                        //如果高電平出現(xiàn)大于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, 下載次數(shù): 16)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:817736 發(fā)表于 2020-9-19 16:26 | 只看該作者
歡迎提問
回復

使用道具 舉報

板凳
ID:328014 發(fā)表于 2020-9-20 18:07 | 只看該作者
能分享一下原理圖嗎?
回復

使用道具 舉報

地板
ID:817736 發(fā)表于 2020-9-26 02:22 | 只看該作者
51hei團團 發(fā)表于 2020-9-20 18:07
能分享一下原理圖嗎?

原理圖照著單片機的焊就行
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黑人巨大精品欧美黑白配亚洲 | 亚洲夜射 | 国产精品毛片无码 | 日韩一区二区三区在线观看视频 | 99精品国产一区二区三区 | 日韩精品一区二区三区中文字幕 | 国产成在线观看免费视频 | 亚洲精品日韩视频 | wwww.8888久久爱站网 | 欧美日韩一区在线 | 毛片免费观看 | 亚洲人人 | 日日干天天干 | 亚洲欧美一区二区三区在线 | 亚洲毛片 | 国产精品一区二区在线播放 | 久久国产亚洲精品 | 国产精品欧美一区二区三区不卡 | 成人免费毛片片v | 成人av一区 | 久久久久久久久久久久91 | 国产一区二区三区免费 | h视频在线观看免费 | 亚洲一区视频在线 | 99爱在线| 精品国产伦一区二区三区观看说明 | 国产在线精品一区二区三区 | 免费在线观看一区二区 | 剑来高清在线观看 | 8x国产精品视频一区二区 | 在线观看国产视频 | 亚洲免费在线 | 狠狠色综合网站久久久久久久 | 在线免费看91 | 欧美一级免费黄色片 | 日本三级电影免费观看 | www.久久久.com | 一级毛片网 | 亚洲国产精品一区二区www | 午夜日韩| 精产国产伦理一二三区 |