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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

8051單片機制作的紅外遙控器控制的數碼管時鐘,可顯示溫度,并將溫度值寫入24c02.

[復制鏈接]
跳轉到指定樓層
樓主
可以用紅外遙控器控制的數碼管時鐘,不同按鍵控制寫入ds1302的時間值,從而調整時間。也可通過按鍵顯示溫度,每次顯示后將溫度值順序記入24c02。可以通過仿真查看24c02內的值。不同遙控器需要更改紅外讀入的鍵值,才能正常使用。仿真中用按鍵代替了紅外顯示溫度。實物在普中開發板上運行通過。部分程序借用普中開發板附帶代碼修改而成。

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


單片機源程序如下:
  1. /*******************************************************************************
  2. 8 digits LED display Ds1302 Real time clock with IR remote adjust and temperature display
  3. ********************************************************************************/
  4. #include<reg52.h>
  5. #include<intrins.h>

  6. sbit SCL = P2^1;      /* 定義位變量 */             // I2C總線的時鐘信號
  7. sbit SDA = P2^0;                                   // I2C總線的數據信號

  8. sbit DS1302_CK = P3^6;        //時鐘       
  9. sbit DS1302_IO = P3^4;        //數據       
  10. sbit DS1302_CE = P3^5;// DS1302復位

  11. sbit LS138A = P2^2;         
  12. sbit LS138B = P2^3;          
  13. sbit LS138C = P2^4;       
  14. sbit BEEP = P1^5;
  15. sbit IRIN = P3^2;


  16. unsigned char t0,miao,fen,shi;
  17. unsigned int tabe2[8];
  18. unsigned char IRCOM[7];
  19. unsigned char AT24C02Address = 0;

  20. unsigned char code tabe1[]={~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90,~0x40,};

  21. void display();
  22. void display_date();
  23. void display_temp();
  24. void Read_RTC();
  25. extern unsigned int ReadTemperature(void);
  26. extern void InitDS1302();
  27. extern void DS1302SingleWrite(unsigned char reg, unsigned char dat);
  28. extern unsigned char DS1302SingleRead(unsigned char reg);
  29. extern void DS1302SingleWriteRAM(unsigned char ram, unsigned char dat);
  30. extern unsigned char DS1302SingleReadRAM(unsigned char ram);

  31. extern void AT24C02_Write1Byte(        unsigned char AT24C02_Address, unsigned char AT24C02_1Byte);


  32. /******************************************************************/
  33. /*                   讀時鐘數據                                   */
  34. /******************************************************************/
  35. void Read_RTC(void)                //讀取 日歷
  36. {
  37. //unsigned char i,*p;
  38. //p=read_rtc_address;             //地址傳遞
  39. //for(i=0;i<7;i++)                    //分7次讀取 秒分時日月周年
  40. //{
  41.   //tmpdate[i]=Read_Ds1302(*p);
  42.   //p++;
  43. //}
  44. miao=DS1302SingleRead(0x80); miao=(miao>>4)*10+(miao&0x0f);
  45. fen= DS1302SingleRead(0x81); fen=(fen>>4)*10+(fen&0x0f);
  46. shi= DS1302SingleRead(0x82); shi=(shi>>4)*10+(shi&0x0f);
  47. }


  48. void delay(unsigned int a)
  49. {
  50.     unsigned char i;
  51.     while(a--)
  52.          {
  53.             for(i=0;i<=80;i++)
  54.                 ;
  55.          }
  56.           
  57. }

  58. void delayIR(unsigned char x)    //x*0.14MS
  59. {
  60. unsigned char y;
  61.   while(x--)
  62. {
  63.   for (y = 0; y<13; y++) {}
  64. }
  65. }

  66. //=================================BEEP驅動===========================================//

  67. //sbit        Bell_Out        =        P3 ^ 0;//元件是動圈式揚聲器(并非有源蜂鳴器),需要MCU驅動發聲

  68. /********************************************************************************************/
  69. void bell(        unsigned char a,unsigned char b,unsigned char c,unsigned char d)
  70. {
  71.         for(;a>0;a--){//第一個聲音的長度
  72.                 BEEP = !BEEP;//取反揚聲器驅動口,以產生音頻
  73.                 delay(b);//音調設置延時
  74.         }
  75.         for(;c>0;c--){//同上
  76.                 BEEP = !BEEP;
  77.                 delay(d);//
  78.         }
  79.         BEEP = 1;
  80. }
  81. /********************************************************************************************/
  82. //--------------------------------------------揚聲器--按鍵音
  83. //void beep_k(void){beep(10,60,5,250); }
  84. //--------------------------------------------揚聲器--鬧鐘報警
  85. //void beep_a(void){beep(250,16,150,40); }//BELL
  86. //--------------------------------------------揚聲器--成功音
  87. //void beep_y(void){beep(50,30,100,50); }//BELL
  88. //--------------------------------------------揚聲器--無效音
  89. //void beep_n(void){beep(50,80,100,100); }//BELL
  90. /********************************************************************************************/

  91. void beep(void)
  92. {
  93.   unsigned char i;
  94.             for (i=0;i<100;i++)
  95.                    {
  96.                    delay(1);
  97.                    BEEP=!BEEP;                 //BEEP reverse
  98.             }
  99.                   BEEP=1;                      //close buzzer
  100. }

  101. void main()
  102. {

  103.         BEEP = 1;                        //close buzzer
  104.            IT0=1;                       //enable timer 0
  105.            //IT1=1;      
  106.            EX0=1;                                //enable int 0
  107.         EX1=1;                                //enable int 1
  108.           TMOD=0x01,TH0=0x3c,TL0=0xb0, EA=1;//定時器0方式1, enable all int
  109.            ET0=1;                                //INT0下降沿有效
  110.            TR0=1;
  111.           
  112.    InitDS1302();
  113.         //DS1302SingleWrite(0x83,0x11);                 //set DATE
  114.         //DS1302SingleWrite(0x84,0x12);                 //set MONTH
  115.         //DS1302SingleWrite(0x85,0x05);                 //set DAY         Sun=0,Mon=1
  116.         //DS1302SingleWrite(0x86,0x14);                 //set YEAR
  117.     // DS1302SingleWriteRAM(0x00,0x21);        //set Alarm1 Hour
  118.     // DS1302SingleWriteRAM(0x01,0x15);        //set Alarm1 Minute
  119.    //DS1302SingleWriteRAM(0x02,0x18);        //set Alarm2 Hour
  120.    //DS1302SingleWriteRAM(0x03,0x15);        //set Alarm2 Minute

  121.    while(1)
  122.    {
  123.          display();
  124.          if (fen==0&miao<3)
  125.          bell(4,1,8,1);
  126.          //if (DS1302SingleReadRAM(0x00) == ((shi/10)*16+shi%10)
  127.         //                        &DS1302SingleReadRAM(0x01) == ((fen/10)*16+fen%10))
  128.                           
  129.         //                                {bell(4,1,8,1);}
  130.                                
  131.         //if (DS1302SingleReadRAM(0x02) == ((shi/10)*16+shi%10)
  132.         //                        &DS1302SingleReadRAM(0x03) == ((fen/10)*16+fen%10))               
  133.         //                        {bell(4,1,8,1); }
  134.                        
  135.    }
  136. }

  137. //外部中斷0         IR Remote

  138. void IR_IN() interrupt 0 //using 0
  139. {
  140.   unsigned char j,k,N=0;
  141.   P0=0x00;
  142.         //char bx;
  143.      EX0 = 0;                     //關掉外部中斷防止中斷的再次發生進入檢測引導碼階段(9ms的低電平4.5ms的高電平)
  144.          delayIR(15);
  145.          if (IRIN==1)
  146.      { EX0 =1;                          //9ms的檢測檢測結束從新打開外部中斷
  147.            return;
  148.           }
  149.                            //確認IR信號出現
  150.   while (!IRIN)            //等IR變為高電平,跳過9ms的前導低電平信號。
  151.     {delayIR(1);}

  152. for (j=0;j<4;j++)         //收集四組數據
  153. {
  154.           for (k=0;k<8;k++)        //每組數據有8位
  155.           {
  156.                    while (IRIN)            //等 IR 變為低電平,跳過4.5ms的引導高電平信號。
  157.                      {delayIR(1);}
  158.                     while (!IRIN)          //等 IR 變為高電平
  159.                      {delayIR(1);}
  160.                      while (IRIN)           //計算IR高電平時長(0和1的低電平的時長一樣的,只要判斷高電平時長超過0.56ms并小于1.12ms為1否則為0)
  161.                       {
  162.                             delayIR(1);
  163.                             N++;           
  164.                                 if (N>=30)
  165.                                          {
  166.                                                  EX0=1;
  167.                                                  return;
  168.                                          }                  //0.14ms計數過長自動離開。
  169.                       }                        //高電平計數完畢               
  170.                      IRCOM[j]=IRCOM[j] >> 1;                  //數據最高位補“0”
  171.                      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //高電平持續時間大于1.12ms則數據最高位補“1”
  172.                      N=0;
  173.           }                                                                //end for k
  174. }                                                                        //end for j
  175.    
  176.    if (IRCOM[2]!=~IRCOM[3])                  // 判斷有沒有誤碼(有責放棄沒有判斷鍵碼)
  177.    { EX0=1;
  178.      return;
  179.    }
  180.         beep();
  181.         DS1302SingleWrite(0x8e,0x00);                                //allow write to DS1302
  182.              switch(IRCOM[2])
  183.                  {                        
  184.                         case 0x40: if (fen>0) {fen--;} else{fen=59;} DS1302SingleWrite(0x81,((fen/10)*16+fen%10));  break;//minute-1,write to ds1302
  185.                         case 0x43: fen++;          if (fen>=60) {fen=0;}   DS1302SingleWrite(0x81,((fen/10)*16+fen%10));  break;//minute+1
  186.                         case 0x15: if (shi>0) {shi--;} else{shi=23;} DS1302SingleWrite(0x82,((shi/10)*16+shi%10));  break;//hour-1
  187.                         case 0x09: shi++;    if (shi>=24) {shi=0;}   DS1302SingleWrite(0x82,((shi/10)*16+shi%10));  break;//hour+1
  188.                         case 0x47: miao=0;                                                                        DS1302SingleWrite(0x80,0x00);                    break;//second=0
  189.                         case 0x44:
  190.                        
  191.                                 display_date();        //display year,month,date
  192.                                 break;
  193.                         case 0x45:
  194.                                 display_temp();
  195.                 }
  196.          DS1302SingleWrite(0x8e,0x80);                        // protect write to DS1302
  197.          EX0 = 1;
  198. }


  199. void display()
  200. {
  201.      unsigned char i;
  202.          tabe2[7]=tabe1[miao%10];
  203.          tabe2[6]=tabe1[miao/10];
  204.          tabe2[5]=0x40;
  205.          tabe2[4]=tabe1[fen%10];
  206.          tabe2[3]=tabe1[fen/10];
  207.          tabe2[2]=0x40;
  208.          tabe2[1]=tabe1[shi%10];
  209.          tabe2[0]=tabe1[shi/10];
  210.         for(i=0;i<8;i++)
  211.           {
  212.                      switch(i)                                            
  213.                      {
  214.                           case 0:LS138A=0; LS138B=0; LS138C=0;  break;         
  215.                   case 1:LS138A=1; LS138B=0; LS138C=0;  break;                    
  216.                   case 2:LS138A=0; LS138B=1; LS138C=0;  break;
  217.                   case 3:LS138A=1; LS138B=1; LS138C=0;  break;
  218.                           case 4:LS138A=0; LS138B=0; LS138C=1;  break;
  219.                           case 5:LS138A=1; LS138B=0; LS138C=1;  break;
  220.                           case 6:LS138A=0; LS138B=1; LS138C=1;  break;
  221.                           case 7:LS138A=1; LS138B=1; LS138C=1;  break;            
  222.                                                         
  223.                                   }
  224.                          P0=tabe2[i];
  225.                          delay(5);
  226.           }
  227. }

  228. /* every second timer update second,minute,hour 2 times.*/
  229. void timer0(void) interrupt 1
  230. {
  231.          

  232.      TH0=0x3c,TL0=0xb0;
  233.          t0++;
  234.          //display();
  235.            if(t0==10)
  236.               {
  237.                        
  238.                         t0= 0;
  239.                         Read_RTC();
  240.                        
  241.                   }  
  242. }



  243. void display_date(void)
  244. {
  245.         unsigned char i;
  246.         miao=DS1302SingleRead(0x83); miao=(miao>>4)*10+(miao&0x0f);
  247.         fen= DS1302SingleRead(0x84); fen=(fen>>4)*10+(fen&0x0f);
  248.         shi= DS1302SingleRead(0x86); shi=(shi>>4)*10+(shi&0x0f);
  249.         for (i=1;i<255;i++)
  250.         display();
  251.        
  252. }

  253. void display_temp(void)                          
  254. {
  255.         unsigned char n;
  256.         P0=0x00;
  257.         miao = 0;
  258.         fen = ReadTemperature();
  259.         shi = 0;
  260.         AT24C02_Write1Byte(AT24C02Address,fen);
  261.         AT24C02Address++;
  262.         for (n=1;n<255;n++)
  263.         display();
  264. }


  265. void ButtonPress() interrupt 2 //using INT1
  266. {
  267.        
  268.         display_temp();
  269. }
復制代碼

所有資料51hei提供下載:
紅外遙控器調節時間的數碼管時鐘.zip (34.97 KB, 下載次數: 67)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:744410 發表于 2020-5-5 14:10 | 只看該作者
大佬,你的那個紅外遙控器控制的數碼管時鐘里面,數碼管下面的RN1在proteus中的名稱是什么
回復

使用道具 舉報

板凳
ID:808676 發表于 2020-11-30 05:24 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

地板
ID:315554 發表于 2020-12-2 16:21 | 只看該作者
學習了,其它代碼很多都不成功,特別是遙控部份,鍵碼都改不對,;謝謝分享
回復

使用道具 舉報

5#
ID:853394 發表于 2020-12-2 21:48 | 只看該作者
寫的很好,小白看著好厲害
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区 | 99国产精品久久久 | 欧美日韩综合一区 | 亚洲欧美日韩在线 | 久久伊人影院 | 成人免费网站在线 | 伊人网站视频 | 一区二区国产精品 | 日韩一级黄色毛片 | 国产中文在线 | 一区二区三区四区av | 9久9久 | 午夜色婷婷 | 国产免费又色又爽又黄在线观看 | 国产乱码精品一区二区三区五月婷 | 夜夜草 | 精品成人在线视频 | 国产久 | 91精品国产91久久久久久最新 | 国产精品美女久久久久久久网站 | 91p在线观看 | 国产精品亚洲一区二区三区在线观看 | 91久久久久久久久 | 日韩免费视频 | 中文在线视频 | 国产一区二区三区日韩 | 欧美激情精品久久久久久变态 | 精品一二区 | 成人欧美一区二区三区白人 | 日日操操 | 美日韩免费视频 | 亚洲精品电影网在线观看 | 在线成人免费观看 | 婷婷在线视频 | 亚洲精品久久久久中文字幕欢迎你 | 久久国产精品一区二区三区 | 在线精品国产 | 在线色网| 亚洲 欧美 另类 综合 偷拍 | 欧美一区二区三区视频 | 国产精品中文字幕在线播放 |