找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 1941|回復(fù): 1
收起左側(cè)

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

[復(fù)制鏈接]
ID:465981 發(fā)表于 2019-1-10 17:02 | 顯示全部樓層 |閱讀模式
單片機(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;            //總中斷打開(kāi)
  19.         ET0=1;           //定時(shí)器中斷打開(kāi)
  20.         TR0=1;           //定時(shí)器開(kāi)關(guān)打開(kāi)
  21. }

  22. void Init_Int0() // 外部中斷0初始化
  23. {
  24.         IT0 = 1;   //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
  25.         EX0 = 1;   //使能外部中斷
  26.         EA = 1;    //開(kāi)總中斷
  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í)間然后寫(xiě)入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)://開(kāi)關(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背光開(kāi)啟
  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背光開(kāi)啟
  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背光開(kāi)啟
  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背光開(kāi)啟
  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背光開(kāi)啟
  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背光開(kāi)啟
  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背光開(kāi)啟
  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背光開(kāi)啟
  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背光開(kāi)啟
  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背光開(kāi)啟
  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背光開(kāi)啟
  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背光開(kāi)啟
  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 紅外接收專(zhuān)用延時(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)楦唠娖�,跳過(guò)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)榈碗娖�,跳過(guò)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í)長(zhǎng)
  256.                         {
  257.                                 delay1(1);
  258.                                 N++;           
  259.                                 if (N>=30)
  260.                                 {
  261.                                         EX0=1;
  262.                                         return;
  263.                                 }                  //0.14ms計(jì)數(shù)過(guò)長(zhǎng)自動(dòng)離開(kāi)。
  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.         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. */
復(fù)制代碼

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


回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2019-1-10 17:22 | 顯示全部樓層
補(bǔ)全原理圖或者詳細(xì)說(shuō)明一下電路連接即可獲得100+黑幣
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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