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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3953|回復: 0
打印 上一主題 下一主題
收起左側

單片機紅外遙控計算器源碼(個位數相加)

[復制鏈接]
跳轉到指定樓層
樓主
通過紅外遙控,實現簡單地計算器,并通過數碼管顯示出來


單片機源程序如下:
  1. #include "stc15.h"
  2. #include "intrins.h"
  3. #include "gpio.h"
  4. #include "uart.h"
  5. #include "595hc.h"

  6. #define MAIN_Fosc       11059200L   //定義主時鐘
  7. #define SysTick     10000       // 次/秒, 系統滴答頻率, 在4000~16000之間
  8. #define Timer0_Reload   (65536UL - ((MAIN_Fosc + SysTick/2) / SysTick))     //Timer 0 中斷頻率, 在config.h中指定系統滴答頻率, 在4000~16000之間.

  9. u8 i=0,j,k;
  10. u8 number;
  11. u8 cnt_1ms;  //1ms基本計時
  12. bit B_1ms;   //1ms標志

  13.         
  14. /*************  紅外接收程序變量聲明    **************/
  15. sbit    P_IR_RX = P3^6;         //定義紅外接收輸入IO口

  16. u8  IR_SampleCnt;       //采樣計數
  17. u8  IR_BitCnt;          //編碼位數
  18. u8  IR_UserH;           //用戶碼(地址)高字節
  19. u8  IR_UserL;           //用戶碼(地址)低字節
  20. u8  IR_data;            //數據原碼
  21. u8  IR_DataShit;        //數據移位

  22. bit P_IR_RX_temp;       //Last sample
  23. bit B_IR_Sync;          //已收到同步標志
  24. bit B_IR_Press;         //安鍵動作發生
  25. u8  IR_code;            //紅外鍵碼
  26. u16 UserCode;           //用戶碼
  27. /*********************************/

  28. #define IR_SAMPLE_TIME      (1000000UL/SysTick)         //查詢時間間隔, us, 紅外接收要求在60us~250us之間

  29. #if ((IR_SAMPLE_TIME <= 250) && (IR_SAMPLE_TIME >= 60))
  30.         #define D_IR_sample         IR_SAMPLE_TIME      //定義采樣時間,在60us~250us之間
  31. #endif

  32. #define D_IR_SYNC_MAX       (15000/D_IR_sample) //SYNC max time
  33. #define D_IR_SYNC_MIN       (9700 /D_IR_sample) //SYNC min time
  34. #define D_IR_SYNC_DIVIDE    (12375/D_IR_sample) //decide data 0 or 1
  35. #define D_IR_DATA_MAX       (3000 /D_IR_sample) //data max time
  36. #define D_IR_DATA_MIN       (600  /D_IR_sample) //data min time
  37. #define D_IR_DATA_DIVIDE    (1687 /D_IR_sample) //decide data 0 or 1
  38. #define D_IR_BIT_NUMBER     32                  //bit number
  39. #define SysTick     10000       // 次/秒, 系統滴答頻率, 在4000~16000之間

  40. //*******************************************************************************************
  41. //**************************** IR RECEIVE MODULE ********************************************
  42. void IR_RX_NEC(void)
  43. {
  44.     u8  SampleTime;

  45.     IR_SampleCnt++;                         //Sample + 1

  46.     F0 = P_IR_RX_temp;                      //Save Last sample status
  47.     P_IR_RX_temp = P_IR_RX;                 //Read current status
  48.     if(F0 && !P_IR_RX_temp)                 //Pre-sample is high,and current sample is low, so is fall edge
  49.     {
  50.         SampleTime = IR_SampleCnt;          //get the sample time
  51.         IR_SampleCnt = 0;                   //Clear the sample counter

  52.              if(SampleTime > D_IR_SYNC_MAX)     B_IR_Sync = 0;  //large the Maxim SYNC time, then error
  53.         else if(SampleTime >= D_IR_SYNC_MIN)                    //SYNC
  54.         {
  55.             if(SampleTime >= D_IR_SYNC_DIVIDE)
  56.             {
  57.                 B_IR_Sync = 1;                  //has received SYNC
  58.                 IR_BitCnt = D_IR_BIT_NUMBER;    //Load bit number
  59.             }
  60.         }
  61.         else if(B_IR_Sync)                      //has received SYNC
  62.         {
  63.             if(SampleTime > D_IR_DATA_MAX)      B_IR_Sync=0;    //data samlpe time too large
  64.             else
  65.             {
  66.                 IR_DataShit >>= 1;                  //data shift right 1 bit
  67.                 if(SampleTime >= D_IR_DATA_DIVIDE)  IR_DataShit |= 0x80;    //devide data 0 or 1
  68.                 if(--IR_BitCnt == 0)                //bit number is over?
  69.                 {
  70.                     B_IR_Sync = 0;                  //Clear SYNC
  71.                     if(~IR_DataShit == IR_data)     //判斷數據正反碼
  72.                     {
  73.                         UserCode = ((u16)IR_UserH << 8) + IR_UserL;
  74.                         IR_code      = IR_data;
  75.                         B_IR_Press   = 1;           //數據有效
  76.                     }
  77.                 }
  78.                 else if((IR_BitCnt & 7)== 0)        //one byte receive
  79.                 {
  80.                     IR_UserL = IR_UserH;            //Save the User code high byte
  81.                     IR_UserH = IR_data;             //Save the User code low byte
  82.                     IR_data  = IR_DataShit;         //Save the IR data byte
  83.                 }
  84.             }
  85.         }
  86.     }
  87. }
  88. //*********************************** MODULE END ********************************************
  89. //*******************************************************************************************


  90. ///********************** Timer0初始化 ************************/
  91. void Timer0Init(void)                //1毫秒 @11.0592MHz
  92. {
  93.         AUXR = 0x80;                //定時器時鐘1T模式
  94.         TMOD = 0x00;                //設置定時器模式
  95.         TL0 = (u8)(Timer0_Reload % 256);                //設置定時初值
  96.         TH0 = (u8)(Timer0_Reload / 256);                //設置定時初值
  97.         EA = 1;                    //開啟總中斷
  98.         ET0 = 1;                //允許定時器0中斷
  99.         TF0 = 0;                //清除TF0標志
  100.         TR0 = 1;                //定時器0開始計時
  101. }
  102. ///********************** Timer0中斷函數 ************************/
  103. void timer0 (void) interrupt 1
  104. {
  105.         IR_RX_NEC();
  106.         if(--cnt_1ms == 0)
  107.         {
  108.                         cnt_1ms = SysTick / 1000;
  109.                         B_1ms = 1;      //1ms標志
  110.                         DisplayScan();  //1ms掃描顯示一位
  111.         }
  112. }


  113. int Addend;  //數
  114. int Augend;  //被數
  115. int Sum_Sub;  //和_差
  116. int Middle_Number;  //中間數
  117. int Buffer;  //緩沖暫存
  118. bit Catch_Flag = 0;
  119. u8 Addition_Flag = 0;
  120. void main(void)
  121. {
  122.         GPIO();
  123.         Timer0Init();
  124.         
  125.         cnt_1ms = SysTick / 1000;
  126.         for(i=0; i<8; i++)  LED8[i] = 16;
  127.         LED8[0] = 12;  //C
  128.         LED8[1] = 10;  //A
  129.         LED8[2] = 21;  //L
  130.         LED8[3] = 12;  //C
  131.         LED8[4] = 25;  //U
  132.         LED8[5] = 21;  //L
  133.         LED8[6] = 10;  //A
  134.         LED8[7] = 17;  //-
  135.         

  136.         
  137.         
  138. while (1)
  139. {
  140.         
  141.                 if(B_1ms)   //1ms到
  142.                 {                        
  143.                         B_1ms = 0;
  144.                         if(B_IR_Press)      //檢測到收到紅外鍵碼
  145.                         {
  146.                                 B_IR_Press = 0;
  147.                                        
  148.         //                                        LED8[0] = (u8)((UserCode >> 12) & 0x0f);    //用戶碼高字節的高半字節
  149.         //                                        LED8[1] = (u8)((UserCode >> 8)  & 0x0f);    //用戶碼高字節的低半字節
  150.         //                                        LED8[2] = (u8)((UserCode >> 4)  & 0x0f);    //用戶碼低字節的高半字節
  151.         //                                        LED8[3] = (u8)(UserCode & 0x0f);            //用戶碼低字節的低半字節
  152.         //                                        LED8[6] = IR_code >> 4;
  153.         //                                        LED8[7] = IR_code & 0x0f;
  154.                                 
  155.                                 switch(IR_code)
  156.                                 {
  157.                                         case 0x16: Middle_Number = 0;Catch_Flag = 1;
  158.                                                 break;
  159.                                         case 0x0C: Middle_Number = 1;Catch_Flag = 1;
  160.                                                 break;
  161.                                         case 0x18: Middle_Number = 2;Catch_Flag = 1;
  162.                                                 break;
  163.                                         case 0x5E: Middle_Number = 3;Catch_Flag = 1;
  164.                                                 break;
  165.                                         case 0x08: Middle_Number = 4;Catch_Flag = 1;
  166.                                                 break;
  167.                                         case 0x1C: Middle_Number = 5;Catch_Flag = 1;
  168.                                                 break;
  169.                                         case 0x5A: Middle_Number = 6;Catch_Flag = 1;
  170.                                                 break;
  171.                                         case 0x42: Middle_Number = 7;Catch_Flag = 1;
  172.                                                 break;
  173.                                         case 0x52: Middle_Number = 8;Catch_Flag = 1;
  174.                                                 break;
  175.                                         case 0x4A: Middle_Number = 9;Catch_Flag = 1;
  176.                                                 break;
  177.                                         case 0x07: Middle_Number = 10;Catch_Flag = 1;  // -
  178.                                                 break;
  179.                                         case 0x15: Middle_Number = 11;Catch_Flag = 1;  // +
  180.                                                 break;
  181.                                         case 0x09: Middle_Number = 12;Catch_Flag = 1;  // =
  182.                                                 break;
  183.                                 }
  184.                                 
  185.                         if(Catch_Flag == 1)
  186.                         {
  187.                                         Catch_Flag = 0;
  188.                                 
  189.                                         if(Addition_Flag == 0)
  190.                                         {
  191. First:
  192.                                                 for(i=0;i<8;i++) LED8[i] = 16;  //清屏
  193.                                                 Augend = Middle_Number;
  194.                                                 LED8[0] = Augend;
  195.                                                 Addition_Flag = 1;
  196.                                         }
  197.                                         else if(Addition_Flag == 1)
  198.                                         {
  199.                                                 Buffer = Middle_Number;
  200.                                                 if((Buffer - 10) < 0) goto First;  //如果不是符號,則跳轉
  201.                                                 if(Buffer == 10) LED8[1] = 17;
  202.                                                 if(Buffer == 11) LED8[1] = 24;
  203.                                                 Addition_Flag = 2;
  204.                                         }
  205.                                         else if(Addition_Flag == 2)
  206.                                         {
  207.                                                 Addend = Middle_Number;
  208.                                                 LED8[2] = Addend;
  209.                                                 Addition_Flag = 3;
  210.                                         }
  211.                                        
  212.                                         if(Middle_Number == 12)
  213.                                         {
  214.                                                 if(Buffer == 10)
  215.                                                 {
  216.                                                         Sum_Sub = Augend - Addend;
  217.                                                         if(Sum_Sub < 0)
  218. ……………………

  219. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
紅外遙控 - 計算器(個位數相加).rar (43.2 KB, 下載次數: 34)


評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区三区免费视频 | 国产成人精品免费 | 色五月激情五月 | 日韩中文字幕一区 | 亚洲日韩中文字幕一区 | 91视频国产区 | 亚洲欧美国产毛片在线 | 国产激情视频在线 | 亚洲一区二区成人 | 久久国产免费 | 国产精品久久久久久久久免费相片 | 国产免费让你躁在线视频 | 国产精品99久久免费观看 | 亚洲国产成人精品女人久久久 | 中文在线a在线 | 香蕉二区| 国产精品成人av | 国产精品久久久久久影视 | 亚洲福利在线视频 | 日本中出视频 | 99综合| 8x国产精品视频一区二区 | 蜜臀91视频| 欧美一区二区三区在线观看 | 日韩免费一区二区 | 欧美一区二区三区视频 | 一区二区久久 | 91国内精品久久 | 日韩精品一区二区三区视频播放 | 日韩在线播放视频 | 国产成人久久精品一区二区三区 | 欧美在线观看免费观看视频 | av日日操| 天天操操| h肉视频 | 韩日一区二区 | 亚洲综合国产 | 久久国| xxxcom在线观看 | 视频在线一区 | 免费久久网 |