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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+12864+DS1302+紅外遙控+溫度顯示+農歷時鐘程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:465981 發(fā)表于 2019-1-10 17:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. #include "STC12C5A60S2.H"
  2. #include "Delay.h"
  3. #include "LCD12864.h"
  4. #include "Display.h"
  5. #include "DS1302.h"
  6. #include "UART.h"
  7. #define uint  unsigned  int
  8. #define uchar unsigned char

  9. //sfr IAP_CONTR   = 0xC7; //STC12C5A60S2復位寄存器
  10. bit ReadTimeFlag;//定義讀時間標志
  11. sbit backlight=P1^4; //控制液晶的繼電器
  12. sbit IRIN = P3^2;         //紅外接收器數據線
  13. uchar IRCOM[7];
  14. uchar Key; //紅外遙控器鍵值

  15. void Init_Timer0()         //定時器0初始化
  16. {
  17.         TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
  18.         EA=1;            //總中斷打開
  19.         ET0=1;           //定時器中斷打開
  20.         TR0=1;           //定時器開關打開
  21. }

  22. void Init_Int0() // 外部中斷0初始化
  23. {
  24.         IT0 = 1;   //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
  25.         EX0 = 1;   //使能外部中斷
  26.         EA = 1;    //開總中斷
  27. }

  28. void main()
  29. {
  30.         uchar i=0; //
  31.         lcm_init(); //液晶初始化
  32.         welcome();  //調用歡迎信息
  33.         Ds1302_Init(); //初始化DS1302
  34.         UART_Init(); //串口初始化
  35.         Init_Timer0();         //定時器0初始化
  36.         Init_Int0(); // 外部中斷0初始化
  37.         delay(1000);
  38.         lcm_clr(); //清屏
  39.         Clean_12864_GDRAM(); //清屏
  40.         while(1)
  41.         {
  42.                 if(SetFlag)     //如果接收到串口信息則更新時鐘
  43.                 {
  44.                         for(i=0;i<8;i++)
  45.                         {
  46.                                 time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//數據整合,如2個數 1和5整合成15
  47.                         }
  48.                         Ds1302_Write_Time();//接收更新的時間然后寫入ds1302
  49.                         SetFlag=0;          //時鐘信息更新后標志位清零
  50.                 }
  51.                 if(ReadTimeFlag)
  52.                 {
  53.                         ReadTimeFlag=0;
  54.                         //lcd_display(); //LCD12864顯示

  55.                         displaydate();         //顯示日期
  56.                         displayxq();     //顯示星期
  57.                         displaytime();         //顯示時間
  58.                         disptemp();      //顯示溫度
  59.                         displaynl();         //顯示農歷

  60.                         Ds1302_Read_Time(); //DS1302讀取時間
  61.                 }        
  62.         }
  63. }

  64. void Timer0_isr() interrupt 1
  65. {
  66.         static unsigned int num;
  67.         TH0=(65536-2000)/256;                  //重新賦值 2ms
  68.         TL0=(65536-2000)%256;

  69.         num++;
  70.         if(num==50)        //大致100ms
  71.         {
  72.                 num=0;
  73.                 ReadTimeFlag=1; //讀標志位置1
  74.         }
  75. }

  76. void Red_Ray(uchar a) //紅外遙控處理函數
  77. {
  78.         switch(a)
  79.         {
  80.                 case(0x64)://開關背光
  81.                         backlight=!backlight;                        
  82.                         break;
  83.                 case(0x90)://系統(tǒng)軟復位
  84.                         IAP_CONTR=0x60;                        
  85.                         break;
  86.                 case(0x44)://年+
  87.                         if(backlight) //如果LCD12864背光開啟
  88.                         {
  89.                                 time_buf1[1]++;
  90.                                 if(time_buf1[1]==100)
  91.                                 {
  92.                                         time_buf1[1]=0;
  93.                                 }   
  94.                                 Ds1302_Write_Time();
  95.                         }                        
  96.                         break;
  97.                 case(0x04)://年-
  98.                         if(backlight) //如果LCD12864背光開啟
  99.                         {
  100.                                 time_buf1[1]--;
  101.                                 if(time_buf1[1]==255)
  102.                                 {
  103.                                         time_buf1[1]=99;
  104.                                 }  
  105.                                 Ds1302_Write_Time();
  106.                         }                        
  107.                         break;
  108.                 case(0x70)://月+
  109.                         if(backlight) //如果LCD12864背光開啟
  110.                         {
  111.                                 time_buf1[2]++;
  112.                                 if(time_buf1[2]==13)
  113.                                 {
  114.                                         time_buf1[2]=1;
  115.                                 }   
  116.                                 Ds1302_Write_Time();
  117.                         }                        
  118.                         break;
  119.                 case(0x51)://月-
  120.                         if(backlight) //如果LCD12864背光開啟
  121.                         {
  122.                                 time_buf1[2]--;
  123.                                 if(time_buf1[2]==0)
  124.                                 {
  125.                                         time_buf1[2]=12;
  126.                                 }  
  127.                                 Ds1302_Write_Time();
  128.                         }                        
  129.                         break;
  130.                 case(0x61)://日+
  131.                         if(backlight) //如果LCD12864背光開啟
  132.                         {
  133.                                 time_buf1[3]++;
  134.                                 if(time_buf1[3]==32)
  135.                                 {
  136.                                         time_buf1[3]=1;
  137.                                 }   
  138.                                 Ds1302_Write_Time();
  139.                         }                        
  140.                         break;
  141.                 case(0x91)://日-
  142.                         if(backlight) //如果LCD12864背光開啟
  143.                         {
  144.                                 time_buf1[3]--;
  145.                                 if(time_buf1[3]==0)
  146.                                 {
  147.                                         time_buf1[3]=31;
  148.                                 }  
  149.                                 Ds1302_Write_Time();
  150.                         }                        
  151.                         break;
  152.                 case(0x30)://小時+
  153.                         if(backlight) //如果LCD12864背光開啟
  154.                         {
  155.                                 time_buf1[4]++;
  156.                                 if(time_buf1[4]==24)
  157.                                 {
  158.                                         time_buf1[4]=0;
  159.                                 }   
  160.                                 Ds1302_Write_Time();
  161.                         }                        
  162.                         break;
  163.                 case(0x81)://小時-
  164.                         if(backlight) //如果LCD12864背光開啟
  165.                         {
  166.                                 time_buf1[4]--;
  167.                                 if(time_buf1[4]==255)
  168.                                 {
  169.                                         time_buf1[4]=23;
  170.                                 }  
  171.                                 Ds1302_Write_Time();
  172.                         }                        
  173.                         break;
  174.                 case(0x80)://分鐘+
  175.                         if(backlight) //如果LCD12864背光開啟
  176.                         {
  177.                                 time_buf1[5]++;
  178.                                 if(time_buf1[5]==60)
  179.                                 {
  180.                                         time_buf1[5]=0;
  181.                                 }     
  182.                                 Ds1302_Write_Time();
  183.                         }                        
  184.                         break;
  185.                 case(0x31)://分鐘-
  186.                         if(backlight) //如果LCD12864背光開啟
  187.                         {
  188.                                 time_buf1[5]--;
  189.                                 if(time_buf1[5]==255)
  190.                                 {
  191.                                         time_buf1[5]=59;
  192.                                 }
  193.                                 Ds1302_Write_Time();
  194.                         }                        
  195.                         break;
  196.                 case(0x24)://秒+
  197.                         if(backlight) //如果LCD12864背光開啟
  198.                         {
  199.                                 time_buf1[6]++;
  200.                                 if(time_buf1[6]==60)
  201.                                 {
  202.                                         time_buf1[6]=0;
  203.                                 }     
  204.                                 Ds1302_Write_Time();
  205.                         }                        
  206.                         break;
  207.                 case(0x25)://秒-
  208.                         if(backlight) //如果LCD12864背光開啟
  209.                         {
  210.                                 time_buf1[6]--;
  211.                                 if(time_buf1[6]==255)
  212.                                 {
  213.                                         time_buf1[6]=59;
  214.                                 }
  215.                                 Ds1302_Write_Time();
  216.                         }                        
  217.                         break;                        
  218.         }
  219. }

  220. void delay1(uchar x)    //x*0.14MS 紅外接收專用延時函數
  221. {
  222.         uchar i;
  223.         while(x--)
  224.         {
  225.                 //for (i = 0; i<13; i++); //12T
  226.                 for (i = 0; i<70; i++);           //1T
  227.         }
  228. }

  229. void Int0_isr() interrupt 0 //外部中斷0服務函數
  230. {
  231.         uchar j,k,N=0;
  232.         EX0 = 0;   
  233.         delay1(15);
  234.         if (IRIN==1)
  235.         {
  236.                 EX0 =1;
  237.                 return;
  238.         }                           //確認IR信號出現
  239.         while(!IRIN)            //等IR變?yōu)楦唠娖剑^9ms的前導低電平信號。
  240.         {
  241.                 delay1(1);
  242.         }
  243.         for(j=0;j<4;j++)         //收集四組數據
  244.         {
  245.                 for (k=0;k<8;k++)        //每組數據有8位
  246.                 {
  247.                         while(IRIN)            //等 IR 變?yōu)榈碗娖剑^4.5ms的前導高電平信號。
  248.                         {
  249.                                 delay1(1);
  250.                         }
  251.                         while(!IRIN)          //等 IR 變?yōu)楦唠娖?br />
  252.                         {
  253.                                 delay1(1);
  254.                         }
  255.                         while(IRIN)           //計算IR高電平時長
  256.                         {
  257.                                 delay1(1);
  258.                                 N++;           
  259.                                 if (N>=30)
  260.                                 {
  261.                                         EX0=1;
  262.                                         return;
  263.                                 }                  //0.14ms計數過長自動離開。
  264.                         }                        //高電平計數完畢               
  265.                         IRCOM[j]=IRCOM[j] >> 1;                  //數據最高位補“0”
  266.                         if(N>=8)
  267.                         {
  268.                                 IRCOM[j] = IRCOM[j] | 0x80;
  269.                         }  //數據最高位補"1"
  270.                         N=0;
  271.                 }
  272.         }   
  273.         if(IRCOM[2]!=~IRCOM[3])
  274.         {
  275.                 EX0=1;
  276.                 return;
  277.         }
  278.         IRCOM[5]=IRCOM[2] & 0x0F;     //取鍵碼的低四位
  279.         IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位變?yōu)榈退奈?br />
  280.         if(IRCOM[5]>9)
  281.         {
  282.                 IRCOM[5]=IRCOM[5]+0x37;
  283.         }
  284.         else
  285.         {
  286.                 IRCOM[5]=IRCOM[5]+0x30;
  287.         }
  288.         if(IRCOM[6]>9)
  289.         {
  290.                 IRCOM[6]=IRCOM[6]+0x37;
  291.         }
  292.         else
  293.         {
  294.                 IRCOM[6]=IRCOM[6]+0x30;
  295.         }
  296.         EX0 = 1;
  297.         Key=(16*IRCOM[5]+IRCOM[6]-17*'0');
  298.         
  299.         Red_Ray(Key);        
  300. }

  301. /*
  302. ====================
  303.   紅外遙控器鍵值表
  304.   0x54  0x64  0x74
  305.   0x44  0x04  0x34
  306.   0x70  0x51  0x90
  307.   0x61  0x91  0x40
  308.   0x30  0x81  0x55
  309.   0x80  0x31  0x15
  310.   0x24  0x25  0x14
  311. ====================
  312. */
復制代碼

所有資料51hei提供下載:
12864 DS1302 紅外遙控 溫度顯示 農歷時鐘程序.rar (250.92 KB, 下載次數: 30)


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

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2019-1-10 17:22 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品99 | 国产精品视频www | 日本超碰 | 精品国产18久久久久久二百 | 激情网五月天 | 国产一区二区三区在线看 | 日韩亚洲视频 | 国产一区免费 | 免费精品国产 | 精品一二三 | 99成人 | 超碰男人天堂 | 91精品国产91久久久久久吃药 | 一区在线播放 | 亚洲精品久久久 | 成人在线免费 | 久久久久九九九女人毛片 | 亚洲欧美中文日韩在线v日本 | 国产在线中文字幕 | av手机在线免费观看 | 中文字幕国产视频 | 最新国产精品精品视频 | 超碰天天 | 国产精品自产av一区二区三区 | 国产区精品在线观看 | 国产一区二区三区四区五区加勒比 | 国产日韩精品一区 | 午夜丰满少妇一级毛片 | 特黄av| 久久久青草婷婷精品综合日韩 | 国产精品一区二区免费 | 羞羞涩涩在线观看 | 国产亚洲精品美女久久久久久久久久 | 国产成人av免费看 | 日韩精品一区二区三区中文在线 | 91在线观看视频 | 国产999精品久久久 午夜天堂精品久久久久 | 人人看人人射 | 毛片毛片毛片毛片毛片 | 91麻豆精品国产91久久久资源速度 | 亚洲国产成人av好男人在线观看 |