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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8647|回復(fù): 16
收起左側(cè)

單片機(jī)紅外遙控計(jì)算器(仿真)

  [復(fù)制鏈接]
ID:258850 發(fā)表于 2017-12-26 16:45 | 顯示全部樓層 |閱讀模式
紅外遙控控制顯示計(jì)算功能
紅外遙控+LCD1602+計(jì)算器
紅瓦遙控模塊設(shè)計(jì)分為紅外發(fā)送及紅外接收
紅瓦發(fā)送模塊為遙控器,編碼在實(shí)驗(yàn)說明部分
0.jpg
        圖一 紅外接收模塊
LCD1602顯示模塊:
0.jpg
計(jì)算器顯示可通過紅外遙控或按鍵實(shí)現(xiàn)計(jì)算。

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

單片機(jī)源程序如下:
  1. #include<reg51.h>   //頭文件
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit lcden=P2^7; //LCD1602控制引腳
  5. sbit rs=P2^6;
  6. sbit rw=P2^5;
  7. sbit busy=P0^7;//LCD忙
  8. sbit IRIN=P3^2;

  9. char i,j,temp;
  10. uchar IrValue[6];
  11. char Time,flag_1=0,flag_2=0;
  12. long a,b,c;     //a,第一個(gè)數(shù) b,第二個(gè)數(shù) c,得數(shù)
  13. char flag,fuhao;//flag表示是否有運(yùn)算符鍵按下,fuhao表征按下的是哪個(gè)運(yùn)算符
  14. //flag=1表示運(yùn)算符鍵按下,flag=0表示運(yùn)算符鍵沒有按下;
  15. //fuhao=1為加法,fuhao=2為減法,fuhao=3為乘法,fuhao=4為除法。

  16. uchar code table[]={//運(yùn)算數(shù)字輸入數(shù)組
  17. 7,8,9,0,
  18. 4,5,6,0,
  19. 1,2,3,0,
  20. 0,0,0,0};
  21. uchar code table1[]={        //經(jīng)處理后進(jìn)行鍵輸入顯示準(zhǔn)備的數(shù)組
  22. 7,8,9,0x2f-0x30,        //7,8,9,÷
  23. 4,5,6,0x2a-0x30,        //4, 5, 6,×
  24. 1,2,3,0x2d-0x30,        //1, 2, 3,-
  25. 0x01-0x30,0,0x3d-0x30,0x2b-0x30//C,0,=,+
  26. };
  27. void delay(uchar z) // 延遲函數(shù)
  28. {
  29. uchar y;
  30. for(z;z>0;z--)
  31.    for(y=0;y<110;y++);
  32. }
  33. void LcdWriteCom(uchar com) // 寫指令函數(shù)
  34. {
  35.         rs=0;
  36.         P0=com;    //com指令付給P0口
  37.         delay(5);lcden=1;delay(5); lcden=0;
  38. }

  39. void LcdWriteData(uchar date) // 寫數(shù)據(jù)函數(shù)
  40. {
  41.         rs=1; P0=date; delay(5);
  42.         lcden=1; delay(5); lcden=0;
  43. }

  44. void init() //初始化
  45. {
  46. lcden=1; //使能信號(hào)為高電平
  47. rw=0;
  48. LcdWriteCom(0x38); //8位,2行
  49. delay(5); LcdWriteCom(0x38); //8位,2行
  50. delay(5); LcdWriteCom(0x0c); //顯示開,光標(biāo)關(guān),不閃爍*/
  51. delay(1); LcdWriteCom(0x06); //增量方式不移位 顯竟獗暌貧 柚?
  52. delay(1); LcdWriteCom(0x80); //檢測(cè)忙信號(hào)
  53. delay(1); LcdWriteCom(0x01); //顯示開,光標(biāo)關(guān),不閃爍
  54. i=0; j=0;
  55. a=0;     //第一個(gè)參與運(yùn)算的數(shù)
  56. b=0;     //第二個(gè)參與運(yùn)算的數(shù)
  57. c=0;
  58. flag=0; //flag表示是否有符號(hào)鍵按下,
  59. fuhao=0; // fuhao表征按下的是哪個(gè)符號(hào)
  60. }
  61. void IrInit()
  62. {
  63.         IT0=1;//下降沿觸發(fā)
  64.         EX0=1;//打開中斷0允許
  65.         EA=1;        //打開總中斷

  66.         IRIN=1;//初始化端口
  67. }
  68. char Judge()
  69. {
  70.         char num=-1;
  71.         if(flag_1)
  72.         {
  73.                 flag_1=2;flag_2=0;
  74.                 switch(IrValue[2])
  75.                 {
  76.                         case 0x19:num=12;break;
  77.                         case 0x40:num=15;break;
  78.                         case 0x43:num=7;break;
  79.                         case 0x15:num=11;break;
  80.                         case 0x09:num=3;break;
  81.                         case 0x0D:num=14;break;
  82.                         case 0x16:num=13;break;
  83.                         case 0x0C:num=8;break;
  84.                         case 0x18:num=9;break;
  85.                         case 0x5E:num=10;break;
  86.                         case 0x08:num=4;break;
  87.                         case 0x1C:num=5;break;
  88.                         case 0x5A:num=6;break;
  89.                         case 0x42:num=0;break;
  90.                         case 0x52:num=1;break;
  91.                         case 0x4A:num=2;break;
  92.                         default :num=16;break;  //
  93.                         }
  94.                 }
  95.                 return num;
  96.        
  97. }
  98. char keyscan() // 鍵盤掃描程序
  99. {
  100.         char num=-1;
  101.         P1=0xfe;
  102.         if(P1!=0xfe)
  103.         {
  104.            delay(20);// 延遲20ms
  105.            if(P1!=0xfe) {  temp=P1&0xf0;flag_2=2;
  106.             switch(temp)
  107.             {
  108.              case 0xe0:num=0;   break;        //7
  109.              case 0xd0:num=1;   break;         //8
  110.              case 0xb0:num=2;   break;        //9
  111.              case 0x70:num=3;   break;        //÷
  112.             }
  113.            }   while(P1!=0xfe);
  114.         }
  115.         P1=0xfd;
  116.         if(P1!=0xfd)
  117.         {
  118.            delay(20);
  119.            if(P1!=0xfd){  temp=P1&0xf0;flag_2=2;
  120.             switch(temp)
  121.             {
  122.              case 0xe0:num=4; break; //4
  123.              case 0xd0:num=5; break; //5
  124.              case 0xb0:num=6; break; //6
  125.              case 0x70:num=7; break; //×
  126.             }
  127.            }   while(P1!=0xfd);//等待按鍵釋放
  128.    }

  129.         P1=0xfb;
  130.         if(P1!=0xfb){  delay(20);
  131.            if(P1!=0xfb) { temp=P1&0xf0;flag_2=2;
  132.             switch(temp)
  133.             {
  134.              case 0xe0:num=8;    break;         //1
  135.              case 0xd0:num=9;    break;         //2
  136.              case 0xb0:num=10;   break;         //3
  137.              case 0x70:num=11;   break;         //-
  138.             }
  139.            }   while(P1!=0xfb);
  140.           
  141.    }
  142.         P1=0xf7;
  143.         if(P1!=0xf7){   delay(20);
  144.            if(P1!=0xf7){ temp=P1&0xf0;flag_2=2;
  145.             switch(temp)
  146.             {
  147.              case 0xe0:num=12; break;  //清0鍵   
  148.              case 0xd0:num=13; break;  //數(shù)字0   
  149.              case 0xb0:num=14; break;  //等于鍵   
  150.              case 0x70:num=15; break;  //加
  151.             }                                                                  
  152.                 } while(P1!=0xf7);
  153.         }
  154.          return num;  
  155. }
  156. void display(char num)
  157. {
  158.         if(flag_1==2||flag_2==2)
  159.         {
  160.                
  161.                 flag_1=0;
  162.                 flag_2=0;
  163.                 if(num<12&&num>=0)
  164.                 {
  165.                        
  166.                  if(num==0||num==1||num==2||num==4||num==5||num==6||num==8||num==9||num==10)//如果按下的是'7','8'或'9
  167.                    {  
  168.                            if(j!=0){LcdWriteCom(0x01); j=0;  }
  169.                            if(flag==0)//沒有按過運(yùn)算符鍵
  170.                                 { a=a*10+table[num];    } //按下數(shù)字存儲(chǔ)到a
  171.                                 else //如果按過運(yùn)算符鍵
  172.                                 {    b=b*10+table[num];   }//按下數(shù)字存儲(chǔ)到b
  173.                    }
  174.                    else if(num==3)//如果按下的是'/'            除法
  175.                    {
  176.                         // count++;
  177.                         flag=1;         //按下運(yùn)算符
  178.                         fuhao=4;//4表示除號(hào)已按
  179.                    }
  180.                   
  181.                    else if(num==7&&flag<=1)//如果按下的是'×'
  182.                    {
  183.                           
  184.                           // count++;
  185.                            flag=1;
  186.                           fuhao=3;//3表示乘號(hào)已按
  187.                    }
  188.                    else if(num==11)//如果按下的是'-'
  189.                    {
  190.                           
  191.                           //count++;
  192.                         flag=1;
  193.                         fuhao=2;//2表示減號(hào)已按
  194.                    }
  195.                         i=table1[num];  //數(shù)據(jù)顯示做準(zhǔn)備
  196.                         LcdWriteData(0x30+i);//顯示數(shù)據(jù)或操作符號(hào)
  197.            }
  198.            else
  199.            {
  200.                 switch(num)
  201.                    {
  202.                         case 12:{LcdWriteCom(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"
  203.                                         break;
  204.                         case 13:{                //按下的是"0"
  205.                            if(flag==0)//沒有按過運(yùn)算符鍵
  206.                            { a=a*10;  LcdWriteData(0x30);       }
  207.                            else if(flag==1)//如果按過運(yùn)算符鍵
  208.                            {  b=b*10;   LcdWriteData(0x30);       }
  209.                           }     break;
  210.                         case 14:{j=1; //按下等于鍵,根據(jù)運(yùn)算符號(hào)進(jìn)行不同的算術(shù)處理
  211.                                            if(fuhao==1)           //加法運(yùn)算
  212.                                            {
  213.                                                   
  214.                                                         LcdWriteCom(0x80+0x4f);//按下等于鍵,光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處
  215.                                                         LcdWriteCom(0x04);     //設(shè)置從后住前寫數(shù)據(jù),每寫完一個(gè)數(shù)據(jù),光標(biāo)后退一格       
  216.                                                         c=a+b;
  217.                                                         while(c!=0){LcdWriteData(0x30+c%10);        c=c/10;                }
  218.                                                         LcdWriteData(0x3d);     //再寫"="
  219.                                                         a=0;b=0;flag=0;fuhao=0;
  220.                                            }
  221.                                          else if(fuhao==2)         //減法運(yùn)算
  222.                                            {
  223.                                                         LcdWriteCom(0x80+0x4f);//光標(biāo)前進(jìn)至第二行最后一個(gè)顯示處
  224.                                                         LcdWriteCom(0x04);     //設(shè)置從后住前寫數(shù)據(jù),每寫完一個(gè)數(shù)據(jù),光標(biāo)后退一格(這個(gè)照理說順序不對(duì),可顯示和上段一樣)
  225.                                                         if(a-b>0)                 c=a-b;
  226.                                                         else                      c=b-a;
  227.                                                         while(c!=0)        { LcdWriteData(0x30+c%10);c=c/10;         }
  228.                                                         if(a-b<0)          LcdWriteData(0x2d);
  229.                                                          LcdWriteData(0x3d);     //再寫"="           
  230.                                                          a=0;b=0;flag=0;fuhao=0;
  231.                                            }
  232.                                          else if(fuhao==3)        //乘法運(yùn)算
  233.                                                 {LcdWriteCom(0x80+0x4f);            LcdWriteCom(0x04);
  234.                                                         c=a*b;
  235.                                                         while(c!=0)        {LcdWriteData(0x30+c%10);        c=c/10;              }
  236.                                                         LcdWriteData(0x3d);           a=0;b=0;flag=0;fuhao=0;
  237.                                                  }
  238.                                           else if(fuhao==4)//除法運(yùn)算       
  239.                                                         {
  240.                                                                 LcdWriteCom(0x80+0x4f);
  241.                                                                 LcdWriteCom(0x04);
  242.                                                                 i=0;
  243.                                                                 if(b!=0)
  244.                                                                 {
  245.                                                                         c=(long)(((float)a/b)*1000);
  246.                                                                         while(c!=0)
  247.                                                                         {
  248.                                                                                  LcdWriteData(0x30+c%10);
  249.                                                                                  c=c/10;
  250.                                                                                 i++; if(i==3) LcdWriteData(0x2e);
  251.                                                                          }
  252.                                                                          if(a/b<=0)
  253.                                                                          {
  254.                                                                                 if(i<=2)
  255.                                                                                  {       
  256.                                                                                        
  257.                                                                                         if(i==1) LcdWriteData(0x30);
  258.                                                                                         LcdWriteData(0x2e);           //  .
  259.                                                                                         LcdWriteData(0x30);
  260.                                                                                  }
  261.                                                                                
  262.                                                                                 LcdWriteData(0x30);           //
  263.                                                                         }
  264.                                                                         LcdWriteData(0x3d);                              
  265.                                                                          a=0;b=0;flag=0;fuhao=0;
  266.                                                                 }
  267.                                                                 else
  268.                                                                 {
  269.                                                                         LcdWriteData('!');LcdWriteData('R');LcdWriteData('O');
  270.                                                                         LcdWriteData('R');LcdWriteData('R');LcdWriteData('E');
  271.                                                                 }
  272.                                                         }
  273.                                        
  274.                           }  break;
  275.                          case 15:LcdWriteData(0x30+table1[num]);flag++;fuhao=1;break;        //加鍵         設(shè)置加標(biāo)志fuhao=1;
  276.                         }
  277.                 }//P1!=0xf7
  278.         }
  279. }
  280. main()
  281. {
  282.         init();                //系統(tǒng)初始化
  283.         IrInit();
  284.         while(1)
  285.         {
  286.            char s=keyscan();//鍵掃描
  287.                 char s1=Judge();
  288.                 if(flag_2==2)
  289.                 display(s);
  290.                 if(flag_1==2)
  291.                         display(s1);
  292.         }
  293. }

  294. void ReadIr() interrupt 0
  295. {
  296.         uchar j,k;
  297.         uint err;
  298.         Time=0;       
  299.         flag_1=1;       
  300.         delay(700);        //7ms
  301.         if(IRIN==0)                //確認(rèn)是否真的接收到正確的信號(hào)
  302.         {         
  303.                
  304.                 err=1000;                                //1000*10us=10ms,超過說明接收到錯(cuò)誤的信號(hào)
  305.                 /*當(dāng)兩個(gè)條件都為真是循環(huán),如果有一個(gè)條件為假的時(shí)候跳出循環(huán),免得程序出錯(cuò)的時(shí)
  306.                 侯,程序死在這里*/       
  307.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過去                 
  308.                 {                       
  309.                         delay(1);
  310.                         err--;
  311.                 }
  312.                 if(IRIN==1)                        //如果正確等到9ms低電平
  313.                 {
  314.                         err=500;
  315.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過去
  316.                         {
  317.                                 delay(1);
  318.                                 err--;
  319.                         }
  320. ……………………

  321. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
LCD1602+IR+計(jì)算器(仿真).zip (185.73 KB, 下載次數(shù): 131)

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
好大的溫暖 + 5 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:275432 發(fā)表于 2018-1-13 01:06 | 顯示全部樓層
樓主可以分享一份資料嗎
回復(fù)

使用道具 舉報(bào)

ID:275432 發(fā)表于 2018-1-13 01:07 | 顯示全部樓層
學(xué)到了學(xué)到了
回復(fù)

使用道具 舉報(bào)

ID:303466 發(fā)表于 2018-4-11 08:59 | 顯示全部樓層
很好.....
回復(fù)

使用道具 舉報(bào)

ID:303466 發(fā)表于 2018-4-11 09:00 | 顯示全部樓層
謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:258850 發(fā)表于 2018-5-17 16:28 | 顯示全部樓層
好大的溫暖 發(fā)表于 2018-1-13 01:06
樓主可以分享一份資料嗎

好久沒來了,資料都在呢
回復(fù)

使用道具 舉報(bào)

ID:342288 發(fā)表于 2018-6-2 17:31 | 顯示全部樓層
樓主為啥我只能使用按鍵輸入遙控沒有響應(yīng)。。
回復(fù)

使用道具 舉報(bào)

ID:342288 發(fā)表于 2018-6-2 18:57 | 顯示全部樓層
樓主紅外功能不能使用啊
回復(fù)

使用道具 舉報(bào)

ID:258850 發(fā)表于 2018-6-3 10:53 | 顯示全部樓層
遙控編碼對(duì)應(yīng)下,不能用遙控就是編碼問題。
回復(fù)

使用道具 舉報(bào)

ID:342288 發(fā)表于 2018-6-3 16:50 | 顯示全部樓層
筱筱123 發(fā)表于 2018-6-3 10:53
遙控編碼對(duì)應(yīng)下,不能用遙控就是編碼問題。

        case 0x19:num=12;break;
                        case 0x40:num=15;break;
                        case 0x43:num=7;break;
                        case 0x15:num=11;break;
                        case 0x09:num=3;break;
                        case 0x0D:num=14;break;
                        case 0x16:num=13;break;
                        case 0x0C:num=8;break;
                        case 0x18:num=9;break;
                        case 0x5E:num=10;break;
                        case 0x08:num=4;break;
                        case 0x1C:num=5;break;
                        case 0x5A:num=6;break;
                        case 0x42:num=0;break;
                        case 0x52:num=1;break;
                        case 0x4A:num=2;break;
                        default :num=16;break;  //
                        }
是這段和電源 :45H
Mode :46H
聲音 :47H
>>|  : 44H
左   :40H
右         :43H
EQ         :07H
VOL- :15H
VOL+ :09H
RPT         :19H
U/SD :0DH
0         :16H
1         :0CH
2         :18H
3         :5EH
4         :08H
5         :1CH
6         :5AH
7         :42H
8         :52H
9         :4AH
這段對(duì)應(yīng)嗎? 那10以后的num對(duì)應(yīng)什么
回復(fù)

使用道具 舉報(bào)

ID:258850 發(fā)表于 2018-6-4 09:32 | 顯示全部樓層
onetotwo 發(fā)表于 2018-6-3 16:50
case 0x19:num=12;break;
                        case 0x40:num=15;break;
                        case 0x43:num=7;break;

不用看num,看case的編碼,舉個(gè)例子:0x0D對(duì)應(yīng)num=14,說明U/SD按鍵對(duì)應(yīng)的值是14,這個(gè)num值是方便處理數(shù)據(jù)用的;0x09對(duì)應(yīng)num=3,說明RPT鍵按下對(duì)應(yīng)的num值是3.這里的按鍵我是根據(jù)遙控器上面畫的。不止16個(gè)按鍵,但我只寫了16個(gè),你還可以寫num=17、18、19,我用的矩陣鍵盤只有16個(gè),所以沒多寫。
回復(fù)

使用道具 舉報(bào)

ID:363782 發(fā)表于 2018-7-6 15:56 | 顯示全部樓層
為什么打不開?????
回復(fù)

使用道具 舉報(bào)

ID:454386 發(fā)表于 2018-12-25 14:42 | 顯示全部樓層
很不錯(cuò)
回復(fù)

使用道具 舉報(bào)

ID:557368 發(fā)表于 2019-6-10 21:04 | 顯示全部樓層
請(qǐng)問一下,那這個(gè)紅外發(fā)射部分要怎么弄呢??
回復(fù)

使用道具 舉報(bào)

ID:556935 發(fā)表于 2019-6-30 22:01 | 顯示全部樓層
紅外遙控是真的不行,樓主可以指教下么
回復(fù)

使用道具 舉報(bào)

ID:616547 發(fā)表于 2020-1-1 10:20 | 顯示全部樓層
為什么我鍵碼都是對(duì)的,但是就是紅外用不了呢
回復(fù)

使用道具 舉報(bào)

ID:1055982 發(fā)表于 2023-10-19 15:24 | 顯示全部樓層
紅外沒法實(shí)現(xiàn),只能用鍵盤
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产成人精品免费视频大全最热 | 久久99国产精一区二区三区 | 精品国产精品国产偷麻豆 | 国产在线观看免费 | 成人av观看| 超碰成人免费 | 中文久久| 国产日韩久久 | 人人爱干 | 久久国产99 | 在线成人福利 | 欧美精品中文字幕久久二区 | 亚洲精品一区二区三区中文字幕 | www.9191| 黄色免费av| 国产精品久久久久aaaa九色 | 自拍偷拍在线视频 | 最新中文字幕在线 | 国产免费看 | 在线免费黄色小视频 | 久久精品视频12 | 色婷综合网 | 日韩精品一区二区三区 | 午夜在线精品 | 蜜桃视频成人 | 搞av.com| 午夜影视免费片在线观看 | 国产亚洲欧美在线 | 国产高清视频在线 | 性一爱一乱一交一视频 | 欧美激情在线精品一区二区三区 | 成人在线观看中文字幕 | 91久久精品国产91久久 | 成人午夜免费视频 | av在线视 | 欧美日韩亚洲一区 | 久久一二| av中文字幕在线 | 日本字幕在线观看 | 国产一区二区三区 | 国产精品成av人在线视午夜片 |