找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

12864+DS1302+紅外遙控+溫度顯示+農(nóng)歷時(shí)鐘程序 51單片機(jī)設(shè)計(jì)

[復(fù)制鏈接]
ID:205119 發(fā)表于 2017-5-26 16:36 | 顯示全部樓層 |閱讀模式
12864+DS1302+紅外遙控+溫度顯示+農(nóng)歷時(shí)鐘程序
0.png 0.png

單片機(jī)源程序如下:
  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復(fù)位寄存器
  10. bit ReadTimeFlag;//定義讀時(shí)間標(biāo)志
  11. sbit backlight=P1^4; //控制液晶的繼電器
  12. sbit IRIN = P3^2;         //紅外接收器數(shù)據(jù)線
  13. uchar IRCOM[7];
  14. uchar Key; //紅外遙控器鍵值

  15. void Init_Timer0()         //定時(shí)器0初始化
  16. {
  17.         TMOD |= 0x01;          //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
  18.         EA=1;            //總中斷打開
  19.         ET0=1;           //定時(shí)器中斷打開
  20.         TR0=1;           //定時(shí)器開關(guān)打開
  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();  //調(diào)用歡迎信息
  33.         Ds1302_Init(); //初始化DS1302
  34.         UART_Init(); //串口初始化
  35.         Init_Timer0();         //定時(shí)器0初始化
  36.         Init_Int0(); // 外部中斷0初始化
  37.         delay(1000);
  38.         lcm_clr(); //清屏
  39.         Clean_12864_GDRAM(); //清屏
  40.         while(1)
  41.         {
  42.                 if(SetFlag)     //如果接收到串口信息則更新時(shí)鐘
  43.                 {
  44.                         for(i=0;i<8;i++)
  45.                         {
  46.                                 time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//數(shù)據(jù)整合,如2個(gè)數(shù) 1和5整合成15
  47.                         }
  48.                         Ds1302_Write_Time();//接收更新的時(shí)間然后寫入ds1302
  49.                         SetFlag=0;          //時(shí)鐘信息更新后標(biāo)志位清零
  50.                 }
  51.                 if(ReadTimeFlag)
  52.                 {
  53.                         ReadTimeFlag=0;
  54.                         //lcd_display(); //LCD12864顯示

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

  60.                         Ds1302_Read_Time(); //DS1302讀取時(shí)間
  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; //讀標(biāo)志位置1
  74.         }
  75. }

  76. void Red_Ray(uchar a) //紅外遙控處理函數(shù)
  77. {
  78.         switch(a)
  79.         {
  80.                 case(0x64)://開關(guān)背光
  81.                         backlight=!backlight;                       
  82.                         break;
  83.                 case(0x90)://系統(tǒng)軟復(fù)位
  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)://小時(shí)+
  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)://小時(shí)-
  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 紅外接收專用延時(shí)函數(shù)
  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服務(wù)函數(shù)
  230. {
  231.         uchar j,k,N=0;
  232.         EX0 = 0;   
  233.         delay1(15);
  234.         if (IRIN==1)
  235.         {
  236.                 EX0 =1;
  237.                 return;
  238.         }                           //確認(rèn)IR信號(hào)出現(xiàn)
  239.         while(!IRIN)            //等IR變?yōu)楦唠娖,跳過9ms的前導(dǎo)低電平信號(hào)。
  240.         {
  241.                 delay1(1);
  242.         }
  243.         for(j=0;j<4;j++)         //收集四組數(shù)據(jù)
  244.         {
  245.                 for (k=0;k<8;k++)        //每組數(shù)據(jù)有8位
  246.                 {
  247.                         while(IRIN)            //等 IR 變?yōu)榈碗娖,跳過4.5ms的前導(dǎo)高電平信號(hào)。
  248.                         {
  249.                                 delay1(1);
  250.                         }
  251.                         while(!IRIN)          //等 IR 變?yōu)楦唠娖?br />
  252.                         {
  253.                                 delay1(1);
  254.                         }
  255.                         while(IRIN)           //計(jì)算IR高電平時(shí)長
  256.                         {
  257.                                 delay1(1);
  258.                                 N++;           
  259.                                 if (N>=30)
  260.                                 {
  261.                                         EX0=1;
  262.                                         return;
  263.                                 }                  //0.14ms計(jì)數(shù)過長自動(dòng)離開。
  264.                         }                        //高電平計(jì)數(shù)完畢               
  265.                         IRCOM[j]=IRCOM[j] >> 1;                  //數(shù)據(jù)最高位補(bǔ)“0”
  266.                         if(N>=8)
  267.                         {
  268.                                 IRCOM[j] = IRCOM[j] | 0x80;
  269.                         }  //數(shù)據(jù)最高位補(bǔ)"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. ……………………

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

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


相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2017-5-31 03:11 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:412696 發(fā)表于 2019-2-17 21:53 | 顯示全部樓層

好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表