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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

紅外控制時鐘(遙控器51單片機程序)

[復制鏈接]
跳轉到指定樓層
樓主
ID:76127 發表于 2015-4-18 03:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #define DataPort P2  //8位數據口(硬件)
  5. #define Busy 0x80
  6. #define LED P0
  7. //#define HLED P3
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. sbit jia=P1^1;
  11. sbit jian=P1^2;
  12. sbit IR=P3^2;
  13. sbit P1_6=P1^6;
  14. sbit P1_7=P1^7;
  15. sbit jiguang=P1^5;
  16. unsigned char a[4];
  17. unsigned int LowTime,HighTime; //
  18. uchar yaokong;
  19. uchar SecondL = 0;         //時間秒低位
  20. uchar SecondH = 0;         //時間秒高位
  21. uchar MinuteL =2;         //時間分低位
  22. uchar MinuteH =3;         //時間分高
  23. uchar hourh=0;
  24. uchar hourl=7;
  25. bit  kai=0;
  26. uchar yueh=0,yuel=5;
  27. uchar rih=2,ril=8;
  28. uchar xingqi=3;
  29. unsigned char IRCode[4],num, shu;
  30. //uchar ircount;
  31. //uchar irtime[33];
  32. //uchar irdate[33];
  33. //uchar irnum;
  34. //uchar irflag;
  35. //sbit irflag=P3^2;
  36. // irrecOK;
  37. //uchar ircode[4];
  38. //uchar irvalue;
  39. //uchar dsirOK;
  40. //uchar code16H[8];
  41. //uchar irtranOK;   
  42. /*********************************************
  43.                 引腳位定義
  44. **********************************************/
  45. sbit RS=P3^7;  //寄存器選擇輸入端(硬件)
  46. sbit RW=P3^6;  //讀寫控制輸入端(硬件)
  47. sbit E =P3^5;  //使能信號輸入端(硬件)
  48. /*********************************************
  49. 函數名稱: delay
  50. 函數功能: 簡易延時函數,us級延時
  51. 函數輸入: j-延時時間控制變量
  52. 函數輸出: 無
  53. **********************************************/
  54. void delay(unsigned int j)
  55. {
  56.   for(j;j>0;j--);
  57. }
  58. /*********************************************
  59. 函數名稱: Delay5Ms
  60. 函數功能: 固定延時時間延時函數,延時5ms
  61. 函數輸入: 無
  62. 函數輸出: 無
  63. **********************************************/

  64. void  DelayA(void)
  65.   {
  66. unsigned int TempCyc;
  67. for (TempCyc=0;
  68. TempCyc<3500; TempCyc++); //3.5ms
  69.   }
  70. void DelayB(void)
  71. {
  72. unsigned int TempCyc;
  73. for (TempCyc=0; TempCyc<840; TempCyc++); // 0.84ms
  74. }


  75. void Delay5Ms(void)
  76. {
  77.   unsigned int TempCyc = 4552;
  78.   while(TempCyc--);
  79. }
  80. /*********************************************
  81. 函數名稱: Lcddelay
  82. 函數功能: LCD毫秒級延時函數
  83. 函數輸入: MS-延時時間為MS*ms
  84. 函數輸出: 無
  85. **********************************************/
  86. void Lcddelay(uint MS)
  87. {
  88.   unsigned char i,j;
  89.   while(MS!=0)
  90.    {
  91.      j = 4;
  92.      while(j!=0)
  93.       {
  94.         i=0xf0;
  95.         while(i!=0){i--;}
  96.         j--;
  97.       }
  98.      MS--;
  99.    }
  100. }
  101. /*********************************************
  102. 函數名稱: WaitForEnable
  103. 函數功能: 檢測lcd狀態。注意有的LCD檢測忙時會一直處
  104.            于忙狀態,導致程序不能正常工作,這時可以
  105.            講忙檢測屏蔽掉試試。
  106. 函數輸入: 無
  107. 函數輸出: 無
  108. **********************************************/
  109. void WaitForEnable(void)
  110. {
  111.    DataPort=0xff;
  112.    RS=0;
  113.    RW=1;
  114.    Lcddelay(5);
  115.    _nop_();
  116.    E=1;
  117.    _nop_();
  118.    _nop_();
  119.    while(DataPort&Busy);
  120.    E=0;
  121. }

  122. /*********************************************
  123. 函數名稱: LcdWriteCommand
  124. 函數功能: 向LCD寫命令
  125. 函數輸入: CMD-LCD命令
  126.            AttribC-忙檢測使能變量
  127. 函數輸出: 無
  128. **********************************************/
  129. void LcdWriteCommand(unsigned char CMD)
  130. {
  131.    RS=0;
  132.    RW=0;
  133.    _nop_();
  134.    DataPort=CMD;
  135.    Lcddelay(5);
  136.    _nop_();
  137.    E=1;
  138.    _nop_();
  139.    _nop_();
  140.    E=0;
  141. }
  142. /*********************************************
  143. 函數名稱: LocateXY
  144. 函數功能: 確定LCD的坐標
  145. 函數輸入: polx-LCD橫坐標
  146.            poly-LCD縱坐標
  147. 函數輸出: 無
  148. **********************************************/
  149. void LocateXY(char polx,char poly)
  150. {
  151.    unsigned char temp;
  152.    temp=polx&0xf;
  153.    poly&=0x01;
  154.    if(poly) temp|=0x40;
  155.    temp|=0x80;
  156.    LcdWriteCommand(temp);
  157. }
  158. /*********************************************
  159. 函數名稱: LcdWriteData
  160. 函數功能: 向LCD寫數據
  161. 函數輸入: DataW-LCD數據
  162. 函數輸出: 無
  163. **********************************************/
  164. void LcdWriteData(char DataW)
  165. {
  166.    RS=1;
  167.    RW=0;
  168.    _nop_();
  169.    DataPort=DataW;
  170.    Lcddelay(5);
  171.    _nop_();
  172.    E=1;
  173.    _nop_();
  174.    _nop_();
  175.    E=0;
  176. }
  177. /*********************************************
  178. 函數名稱: DispOneChar
  179. 函數功能: 在指定位置顯示單個字符
  180. 函數輸入: x-橫坐標
  181.            y-縱坐標
  182.            Wlata-字符數據(單個)
  183. 函數輸出: 無
  184. **********************************************/
  185. void DispOneChar(unsigned char x,unsigned char y,unsigned char WData)
  186. {
  187.    LocateXY(x,y);
  188.    LcdWriteData(WData);
  189. }
  190. /*********************************************
  191. 函數名稱: LcdReset
  192. 函數功能: LCD1602初始化
  193. 函數輸入: 無
  194. 函數輸出: 無
  195. **********************************************/
  196. void LcdReset(void)
  197. {
  198.    LcdWriteCommand(0x38);
  199.    Lcddelay(5);
  200.    LcdWriteCommand(0x38);
  201.    Lcddelay(5);
  202.    LcdWriteCommand(0x38);
  203.    Lcddelay(5);
  204.    LcdWriteCommand(0x38);// 清屏
  205.    LcdWriteCommand(0x08);
  206.    LcdWriteCommand(0x01);
  207.    LcdWriteCommand(0x06);
  208.    LcdWriteCommand(0x0c);
  209. }
  210. /*********************************************
  211. 函數名稱: DisplayListChar
  212. 函數功能: 在指定位置顯示字符串
  213. 函數輸入: x-橫坐標
  214.            y-縱坐標
  215.            *Dlata-字符串數據指針
  216. 函數輸出: 無
  217. **********************************************/
  218. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *SData,unsigned char L)
  219. {
  220.    unsigned char i;
  221.    for(i=0;i<L;i++)
  222.    DispOneChar(X++,Y,SData[i]);
  223. }
  224. void Init_Timer(void)
  225. {
  226.    TMOD = 0x11;             //設定T1的工作模式為1,設定T0工作模式1
  227.    //----裝入定時器初值 -----//
  228.    TH0 = 0x95;              //100us定時
  229.    TL0 = 0x95;
  230.    TH1 = (65536-50000)/256; //50ms定時            
  231.    TL1 = (65536-50000)%256;
  232.    IT0 = 1;
  233.    IP  = 0x03;
  234.    EA  = 1;                 // 開總中斷
  235.    ET0 = 1;                 // 定時器0允許中斷
  236.    ET1 = 1;                 // 定時器1允許中斷
  237.    TR1 = 1;                 // 啟動定時器1
  238.    TR0 = 1;                 // 啟動定時器0
  239. }
  240. void Timer1_ISR() interrupt 3      
  241. {
  242. uint cnt;
  243. TH1 = (65536-50000)/256;            
  244. TL1 = (65536-50000)%256;
  245. cnt++;
  246. if(cnt >=20)
  247. {
  248.     cnt = 0;
  249.     ++SecondL;
  250.     if(SecondL == 10)
  251.     {
  252.     SecondL = 0;
  253.     ++SecondH;
  254.     if(SecondH == 6)
  255.     {
  256.     SecondH = 0;
  257.     ++MinuteL;
  258.     if(MinuteL == 10)
  259.     {
  260.     MinuteL = 0;
  261.     ++MinuteH;
  262.     if(MinuteH==6)
  263.     {MinuteH=0;
  264.     ++hourl;
  265.     if(hourl==10)
  266.     { hourl=0;
  267.     ++hourh;
  268.     if((hourh==2)&(hourl=4))
  269.     {hourh=0;hourl=0;
  270.     ++ril;++xingqi;if(xingqi==8) xingqi=1;
  271.     if(ril==10)
  272.     {ril=0;++rih;
  273.     if((rih==3)&ril==1)
  274.     {
  275.     rih=1;ril=1;
  276.     ++yuel;if(yuel==10)
  277.     {yuel=0;++yueh;
  278.     if((yueh==1)&(yuel==3)){ yuel=1;yueh=1; }
  279.     }
  280.      }
  281.     }
  282.     }   
  283.     }
  284.      }
  285.     }
  286.     }
  287.      }
  288.      }
  289.    }
  290. /*void ComOutChar(unsigned char OutData)
  291. {
  292. SBUF = OutData; //輸出字符
  293. while(!TI); //空語句判斷字符是否發完
  294. TI = 0; //清TI
  295. }
  296. void INT0Fun(void) interrupt 0 using 2
  297. {
  298. //unsigned char IRCode[2], IROK;
  299. unsigned int TempCyc,  TempCycA;  EX0 = 0; //外部中斷0關閉
  300.   IROK = 0;
  301. DelayA(); //延時等待引導碼的前半部結束
  302.   DelayA();
  303. if (!P3_2)  //檢驗前半部是否過早結束,防干擾  
  304. {
  305.   
  306.     {
  307.      DelayA();
  308.      if (P3_2)  //檢驗前半部是否過早結束,防干擾 ,檢驗是否是正確的輸入信號   
  309.     {
  310.        for (TempCyc=0; TempCyc<3500; TempCyc++)        
  311.     if (!P3_2) break; //等待第一個位,      
  312.     if (TempCyc<3500) //超時檢驗
  313.      for (TempCycA=0; TempCycA<4; TempCycA++)
  314.         {
  315.          for (TempCyc=0; TempCyc<8; TempCyc++)      
  316.       {
  317.            while(!P3_2); //等待P3_2拉高,開始位的下部分
  318.            DelayB(); //這里沒設超時,實際應用在多功能的設計時應設超時         
  319.       IRCode[TempCycA] = IRCode[TempCycA]>>1;         
  320.      if (P3_2) //當延時750us后P3_2仍為高則當前位為1        
  321.        {
  322.              IRCode[TempCycA] = IRCode[TempCycA] | 0x80;      
  323.     // for (TempCycB=0; TempCycB<840; TempCycB++)              
  324.     // if (!P3_2) break; //等待下個位 當位1時高電平為1.5ms,            
  325.     // if (TempCycB>840) //之前已延時了750us, 所以超時應大于1.5ms-750us
  326.              //;  // goto endchk; //這里最大為1ms
  327.             }
  328.    else   IRCode[TempCycA] = IRCode[TempCycA]&0x00;
  329.           }
  330.         }
  331.       // else       // goto endchk;
  332.       }
  333.     // else      // goto endchk;
  334.     // IROK++; //當自定碼和數據碼都完成時為2
  335.   LcdWriteCommand(0x01);
  336. LcdWriteCommand(0x0c);
  337. if(IRCode[2]=IRCode[3])
  338.    DispOneChar(0,1,IRCode[2]+0x30);
  339.     }

  340. }  */
  341. /*endchk:  if (IROK==2)
  342. {
  343.    ComOutChar(IRCode[0]);
  344.    ComOutChar(IRCode[1]); //連接PC串口查看自定義碼和數據碼

  345.    if (IRCode[1]==0x10) //1號鍵  //只演示點亮2只LED,讀者可以自行擴展控制別的器件   
  346.     P1_7 = ~P1_7;    if (IRCode[1]==0x11) //2號鍵
  347.     P1_6 = ~P1_6;    for (TempCyc=0; TempCyc<300; TempCyc++)
  348.     DelayA(); //延時
  349.      
  350. }         
  351. EX0 = 1;
  352.    
  353. }        */
  354. void busy()
  355. {
  356. LcdWriteCommand(0x01);  
  357. LcdWriteCommand(0x0c);  
  358. DisplayListChar(0,0,"STC89c52Rc",10);
  359. DisplayListChar(0,1,"hongwai yaokong",15);
  360. LcdWriteCommand(0x01);
  361. LcdWriteCommand(0x0c);
  362. }
  363. void hled()
  364. {char i, j;
  365. LcdWriteCommand(0x01);
  366. LcdWriteCommand(0x0c);
  367. DisplayListChar(0,0,"JIGUANFDENG$laba",16);
  368. DisplayListChar(0,1,"note:p1.5kou",12);
  369. for(j=30;j>0;j--)
  370. for(i=30;i>0;i--)
  371. {jiguang=0;
  372. delay(500);
  373. jiguang=1;
  374. delay(500); }
  375. }
  376. void led()
  377. {char i,j;
  378. LcdWriteCommand(0x01);
  379. LcdWriteCommand(0x0c);
  380. DisplayListChar(0,0,"liushuideng mode ",16);
  381. DisplayListChar(0,1,"da dang jia zuo",15);
  382. for(j=30;j>0;j--)
  383. for(i=0;i<8;i++)
  384. {LED=~(1<<i);
  385. delay(500); }
  386. }
  387. void time()
  388. { uchar i; ET1=1;TR1=1;
  389.           LcdWriteCommand(0x01);
  390.      LcdWriteCommand(0x0c);
  391.          DisplayListChar(0,0,"Time",4);  
  392.                   DispOneChar(9,0,':');
  393.                   DispOneChar(6,0,':');
  394.              DispOneChar(4,0,hourh+0x30); //顯示時間”分“的十位
  395.                DispOneChar(5,0,hourl+0x30); //顯示時間”分“的個
  396.       DispOneChar(7,0,MinuteH+0x30); //顯示時間”分“的十位
  397.       DispOneChar(8,0,MinuteL+0x30);
  398.       DisplayListChar(0,1,"2014",4);
  399.                   DispOneChar(5,1,yueh+0x30); //顯示時間”分“的十位
  400.                DispOneChar(6,1,yuel+0x30); //顯示時間”分“的個
  401.       DispOneChar(7,1,'-');
  402.       DispOneChar(8,1,rih+0x30); //顯示時間”分“的十位
  403.                DispOneChar(9,1,ril+0x30); //顯示時間”分“的個位
  404.                DispOneChar(11,1,xingqi+0x30); //顯示時間”秒“的十位
  405.       for(i=255;i>0;i--)
  406.        {
  407.       DispOneChar(8,0,MinuteL+0x30); //顯示時間”分“的個位
  408.       DispOneChar(10,0,SecondH+0x30); //顯示時間”秒“的十位
  409.                   DispOneChar(11,0,SecondL+0x30); //顯示時間”秒“的個位
  410.       }
  411.               //    DispOneChar(12,1,SecondL+0x30); //顯示
  412.    // delay(1000);
  413.    }

  414.   bit DeCode(void)
  415. {
  416. unsigned char i,j;
  417. unsigned char temp;
  418. LcdWriteCommand(0x01);
  419. LcdWriteCommand(0x0c);
  420. DisplayListChar(0,0,"start",4);
  421. DispOneChar(4,0,':');
  422. for(i=0;i<4;i++)
  423. {
  424. for(j=0;j<8;j++)
  425. {
  426. temp=temp>>1;
  427. TH0=0;
  428. TL0=0;
  429. TR0=1;
  430. while(IR==0);
  431. TR0=0;
  432. LowTime=TH0*256+TL0;
  433. TH0=0;
  434. TL0=0;
  435. TR0=1;
  436. while(IR==1);
  437. TR0=0;
  438. HighTime=TH0*256+TL0;
  439. if((LowTime<370)||(LowTime>640))
  440. return 0;
  441. if((HighTime>420)&&(HighTime<620))
  442. temp=temp&0x7f;
  443. if((HighTime>1300)&&(HighTime<1800))
  444. temp=temp|0x80;
  445. }
  446. a[i]=temp; }
  447. if(a[2]=~a[3])return 1;
  448. }
  449. void codedisplay()
  450. {uchar i;
  451. i=0;
  452. while(a[i]!="\0")
  453. { i++;
  454. }
  455. }
  456. void yaokong1()
  457. {
  458. LcdWriteCommand(0x0c);
  459. DisplayListChar(0,0,"enter the label",15);
  460. EA=1;
  461. ET1=0;
  462. TR1=0;
  463. ET0=1;
  464. DispOneChar(0,1,a[0]/100+0x30);
  465. DispOneChar(1,1,a[0]%100/10+0x30);
  466. DispOneChar(2,1,a[0]%10+0x30);
  467. while(1);
  468. }
  469.   void key()
  470. {uchar k;
  471. P1=0xff;
  472. k=P1;
  473. if(k==0xff)
  474. return;  
  475. Lcddelay(20);
  476. if(k==0xff)
  477. return;
  478. while(P1!=0xff)
  479. switch(k)
  480. {case 0xf3:LcdWriteCommand(0x01);   break;
  481.   case 0xFF:LcdWriteCommand(0x0c);DisplayListChar(0,0,"open the 1602",13); break;
  482.   case 0xfd:busy();yaokong1();break;
  483.   case 0xfb: hled(); break;
  484.   case 0xf7:time();   break;
  485.   case 0xef:led(); break;
  486. }
  487. }
  488.    void main(void)
  489. {

  490.   shu=0;
  491. LcdReset();         //液晶初始化
  492. Init_Timer();       //Timer0、Timer1初始化
  493.     DisplayListChar(0,0,"name:da dang jia",16);
  494.     DisplayListChar(0,1,"note:20121003920",16);
  495.      yaokong=1;  kai=0;
  496. while(1)
  497. {
  498. key();
  499. }   
  500. }

  501.   void Int0(void) interrupt 0
  502. {EX0=0;
  503. TH0=0;
  504. TL0=0;
  505. TR0=1;
  506. while(IR==0);
  507. TR0=0;
  508. LowTime=TH0*256+TL0;
  509. TH0=0;
  510. TL0=0;
  511. TR0=1;
  512. while(IR==1);
  513. TR0=0;
  514. HighTime=TH0*256+TL0;
  515. if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
  516. {
  517. if(DeCode()==1)
  518. {
  519. codedisplay();}}
  520. EX0=1;

  521. }   
復制代碼


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

使用道具 舉報

沙發
ID:60515 發表于 2015-4-18 05:21 | 只看該作者
不知是解碼什么型號的遙控,電路圖????
回復

使用道具 舉報

板凳
ID:66287 發表于 2015-6-2 09:02 | 只看該作者
支持樓主的分享精神
回復

使用道具 舉報

地板
ID:66287 發表于 2015-6-2 09:06 | 只看該作者
解碼思路清晰,程序寫的很不錯
回復

使用道具 舉報

5#
ID:97497 發表于 2015-11-28 20:55 | 只看該作者
木有電路圖,,,,,看程序表示理解起來不容易
回復

使用道具 舉報

6#
ID:326450 發表于 2018-10-28 18:54 | 只看該作者
這個遙控怎么接?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美国产视频 | 九九热在线观看 | 国产麻豆一区二区三区 | 中文字幕91av| 成人一区二区三区 | 欧美日韩一区精品 | 视频在线一区二区 | 国产精品久久久久一区二区三区 | 日韩精品成人网 | 超碰520| 成人在线视频一区 | 国产精品美女一区二区 | 国产精品久久亚洲7777 | 7799精品视频天天看 | 久久精品播放 | 国产一区二区视频免费在线观看 | 国产一区在线免费 | 日韩三区| av黄色片| 日本在线视频不卡 | 精品亚洲一区二区 | 色综合桃花网 | 天天操操| 亚洲精品日韩在线 | 日本精品在线观看 | 亚洲精品久久久一区二区三区 | 久久久精品影院 | 亚洲 欧美 日韩 在线 | 超碰人人人人 | 亚洲精品乱码久久久久久蜜桃 | 日韩有码一区 | 久久久久91 | 中文字幕成人av | 开操网| 欧美成人不卡 | 日本一区二区三区视频在线 | 国产精品视频一区二区三区四蜜臂 | 本道综合精品 | 国产成人综合网 | www国产成人免费观看视频,深夜成人网 | 日韩精品一区二区三区在线播放 |