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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
12864+DS1302+紅外遙控+溫度顯示+農歷時鐘程序


單片機源程序如下:
  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下降沿觸發,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)://系統軟復位
  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變為高電平,跳過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 變為低電平,跳過4.5ms的前導高電平信號。
  248.                         {
  249.                                 delay1(1);
  250.                         }
  251.                         while(!IRIN)          //等 IR 變為高電平
  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. ……………………

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

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


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

使用道具 舉報

沙發
ID:1 發表于 2017-5-31 03:11 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:412696 發表于 2019-2-17 21:53 | 只看該作者

好資料,51黑有你更精彩!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品国产免费一区二区三区 | 欧美日韩综合视频 | 久久这里只有精品首页 | 亚洲欧美在线一区 | 密乳av | 热re99久久精品国99热观看 | 日本黄色高清视频 | 先锋资源吧 | 99久久婷婷国产综合精品电影 | 久久曰视频 | 日韩免费一二三区 | 免费日韩av | 99久久精品免费 | 国产在线高清 | 在线观看成人小视频 | 成人免费网站视频 | 狠狠干网| av黄色在线 | 一区二区三区高清在线观看 | 在线播放一区二区三区 | 国产一区亚洲 | 最新中文字幕在线 | 亚洲成网 | 成人教育av | 欧美激情网站 | 欧美日韩手机在线观看 | 91在线| 男人的天堂久久 | 亚洲精品久久久久久久久久吃药 | 亚洲精品一 | 超碰天天 | 黄色综合| 欧美日韩最新 | 精品免费看 | 成年人黄色一级毛片 | 天天插天天操 | 亚洲一区免费视频 | 国产精品毛片久久久久久久 | 美女久久久久久久 | 精品伊人 | 在线日韩av电影 |