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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2741|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32紅外遙控RTC時鐘溫度采集報警儀程序源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:427027 發(fā)表于 2018-11-20 10:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
采用學(xué)過的STM32微控制器芯片設(shè)計一個溫度采集報警儀。該溫度采集報警儀可以通過數(shù)...

1、溫度采集和顯示功能:通過電位器模擬溫度傳感器,量程范圍0~3.3V對應(yīng)-10~+200度,在LCD上顯示電位器所模擬的溫度值;蛘咄ㄟ^DS18B20數(shù)字溫度傳感器采集環(huán)境溫度,并通過LCD進(jìn)行顯示。
2、溫度報警功能:環(huán)境溫度如果超過設(shè)定的溫度高報警值,報警指示燈LED1開始閃爍,溫度越高閃爍的頻率越快;如果低于溫度高報警值,LED1熄滅,在LCD上顯示溫度報警值。
3、溫度高報警值修改功能:可以通過紅外遙控器或按鍵調(diào)整溫度高報警值。
4、在LCD上顯示自己的中文名字。
5、時鐘功能:在LCD上顯示當(dāng)前的時間。
6、定時控制功能:根據(jù)設(shè)定的動作時間控制LED2開始閃爍或停止閃爍(熄滅);也可在定時控制動作后延遲一段時間熄滅LED2燈,或者通過紅外遙控器及按鍵直接消除LED2的閃爍(類似鬧鐘功能)。
7、時間修改功能:可以通過紅外遙控器或按鍵調(diào)整當(dāng)前時間和定時時間。

單片機(jī)源程序如下:
  1. /******************** 尚學(xué)科技 **************************
  2. * 實(shí)驗平臺:開拓者STM32開發(fā)板
  3. * 庫版本  :ST3.5.0
  4. * 本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
  5. *版權(quán)所有,盜版必究。
  6. **********************************************************************************/
  7. #include "usart1.h"
  8. #include "lcd.h"
  9. #include "text.h"
  10. #include "temperature.h"
  11. #include "delay.h"
  12. #include "text.h"
  13. #include "LED.h"
  14. #include "Key.h"
  15. #include "rtc.h"
  16. #include "remote.h"


  17. const unsigned char HZ_1616[][32]={
  18. {0x00, 0x10, 0x1F, 0xF8, 0x10, 0x10, 0x10, 0x10, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x10, 0x3F, 0xF8,
  19. 0x01, 0x00, 0x01, 0x04, 0xFF, 0xFE, 0x02, 0x80, 0x02, 0x40, 0x04, 0x20, 0x18, 0x1C, 0x60, 0x08,},
  20. {0x00, 0x08, 0x7F, 0xFC, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x10, 0x3F, 0xF8,
  21. 0x01, 0x00, 0x01, 0x00, 0x01, 0x40, 0x01, 0x30, 0x01, 0x10, 0x01, 0x04, 0xFF, 0xFE, 0x00, 0x00,},
  22. {0x10, 0x40, 0x10, 0x24, 0x13, 0xFE, 0x10, 0x00, 0xFC, 0xF8, 0x24, 0x88, 0x24, 0xF8, 0x24, 0x00,
  23. 0x27, 0xFE, 0x4A, 0x02, 0x29, 0xFC, 0x10, 0x20, 0x28, 0x20, 0x44, 0x20, 0x84, 0xA0, 0x00, 0x40}
  24. };
  25. void LCD_DrawPoint1(u16 x,u16 y,u16 Color)
  26. {
  27.         LCD_SetCursor(x,y);//設(shè)置光標(biāo)位置
  28.         LCD_WriteRAM_Prepare();        //開始寫入GRAM
  29.         LCD_WR_DATA(Color);
  30. }
  31. void LCD_ShowHZ(u16 x,u16 y,u8 num,u8 size,u8 mode,u16 Color)
  32. {  

  33.     u8 temp;
  34.     u8 j,k;
  35.           u8 count;
  36.         u16 x0=x;   
  37. //   Char_Horizontal_or_Vertical_Set();
  38.     if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;            
  39.         //設(shè)置窗口                  
  40.           ;//得到偏移后的值
  41.         if(mode==0) //正常顯示
  42.         {
  43.                 for(j=0;j<size;j++)
  44.                 {
  45.                         //字體大小選擇
  46.                                 temp=HZ_1616[num][2*j];        
  47.                                 count=8;
  48.                         for(k=0;k<count;k++)
  49.                     {                 
  50.                     if(temp&0x80)
  51.                                 {
  52.                                 LCD_DrawPoint1(x,y,BLACK);        
  53.                                 }
  54.                                 else
  55.                                 {
  56.                                 LCD_DrawPoint1(x,y,WHITE);        
  57.                                 }
  58.                                 temp<<=1;
  59.                                 x++;
  60.                     }
  61.                                 
  62.                                 temp=HZ_1616[num][2*j+1];        
  63.                                 count=8;
  64.                         for(k=0;k<count;k++)
  65.                     {                 
  66.                     if(temp&0x80)
  67.                                 {
  68.                                 LCD_DrawPoint1(x,y,BLACK);        
  69.                                 }
  70.                                 else
  71.                                 {
  72.                                 LCD_DrawPoint1(x,y,WHITE);        
  73.                                 }
  74.                                 temp<<=1;
  75.                                 x++;
  76.                     }
  77.                         x=x0;
  78.                         y++;
  79.                 }        
  80.         }
  81. }
  82. void LED2_GPIO_Config(void)
  83. {
  84.          GPIO_InitTypeDef GPIO_InitStructure;

  85.         /*開啟GPIOC的外設(shè)時鐘*/
  86.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

  87.         /*選擇要控制的GPIOC引腳*/                                                                                                                           
  88.      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;        

  89.         /*設(shè)置引腳模式為通用推挽輸出*/
  90.            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  91.         /*設(shè)置引腳速率為50MHz */   
  92.            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  93.         /*調(diào)用庫函數(shù),初始化GPIOC*/
  94.      GPIO_Init(GPIOD, &GPIO_InitStructure);
  95.          
  96. }
  97. void TIME_NVIC_Configuration(void)
  98. {
  99.         NVIC_InitTypeDef NVIC_InitStructure;
  100.         /*設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級*/
  101.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        
  102.         /*TIM3中斷*/
  103.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  104.   /*先占優(yōu)先級0級*/        
  105.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  106.   /*從優(yōu)先級3級*/        
  107.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  108.   /*IRQ通道被使能*/        
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  110.         /*根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器*/
  111.         NVIC_Init(&NVIC_InitStructure);  
  112. }
  113. void TIME_Configuration(void)
  114. {
  115.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  116.         /*定時器TIM3時鐘使能*/
  117.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  118.   /*設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值,計數(shù)到5000為500ms*/
  119.         TIM_TimeBaseStructure.TIM_Period = 36000-1;
  120.         /*設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值*/
  121.         TIM_TimeBaseStructure.TIM_Prescaler =(2000-1);
  122.   /*設(shè)置時鐘分割:TDTS = Tck_tim*/  
  123.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  124.         /*TIM向上計數(shù)模式*/
  125.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  126.   /*根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位*/
  127.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  128.   /*使能或者失能指定的TIM中斷*/
  129.         TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE);
  130.         /*使能TIMx外設(shè)*/
  131. //        TIM_Cmd(TIM3, ENABLE);  
  132. }
  133. void TIM3_IRQHandler(void)   
  134. {if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
  135.                 {
  136.                         GPIOD->ODR^=1<<2;
  137.                         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除標(biāo)志位
  138.                 }
  139. }


  140. int main(void)
  141. {
  142.          u8 acer;
  143.          u8 ACER;
  144.          u8 H=18;
  145.          u8 M=1;
  146.          u8 S;
  147.          u8 flag;
  148.          u8 FLAG;
  149.         u16 temp;
  150.          u8 key;
  151.         float t,A=0;
  152.   float temp_value;
  153.         float temperate;
  154.         float temp_set=40;
  155.         char str[5];
  156.         unsigned char value=0;
  157.         USART1_Config();                        //串口初始化
  158.         
  159.         Stm32_Clock_Init(9);        //系統(tǒng)時鐘設(shè)置        
  160.         uart_init(72,9600);                 //串口初始化為9600
  161.          delay_init(72);                            //延時初始化
  162.          LED_GPIO_Config();                //LED 端口初始化
  163.         Key_GPIO_Config();                // 按鍵端口初始化
  164.   Temperature_Adc_Init();//溫度轉(zhuǎn)換器初始化
  165. Remote_Init();                        //紅外接收初始化
  166.           LED2_GPIO_Config();               
  167.                  TIME_NVIC_Configuration();
  168.   TIME_Configuration();
  169.         GPIO_WriteBit(GPIOD,GPIO_Pin_2,(BitAction)1);

  170.         RTC_Init();
  171.         POINT_COLOR=RED;
  172.         LCD_Init();                                                //屏幕初始化
  173.         LCD_Clear(WHITE);
  174.         LCD_ShowString(30,30,"wu yu ting",POINT_COLOR);        
  175.         LCD_ShowString(30,70,"1503150108",POINT_COLOR);        
  176.         LCD_ShowString(30,90,"warninig:",POINT_COLOR);
  177.         LCD_ShowString(90,110,"C:",POINT_COLOR);
  178.         LCD_ShowString(30,130,"temp:",POINT_COLOR);
  179.         LCD_ShowString(90,150,"C",POINT_COLOR);


  180.          LCD_ShowString(30,170,"RTC IS READY!   ",POINT_COLOR);
  181.          LCD_ShowString(30,190,"    -  -     ",POINT_COLOR);           
  182.          LCD_ShowString(30,210,"  :  :  ",POINT_COLOR);
  183.          LCD_ShowString(30,250,"  :  :  ",POINT_COLOR);        
  184.          LCD_ShowHZ(30,50,0,16,0,BLACK);
  185.           LCD_ShowHZ(55,50,1,16,0,BLACK);
  186.                   LCD_ShowHZ(80,50,2,16,0,BLACK);


  187.   while(1)
  188.         {                 temp=Get_Temperature_value();//得到內(nèi)部溫度的數(shù)字量的值
  189.                         temperate=temp*(3.3/4095);//保存溫度傳感器的電壓值
  190.                         temp_value=(1.43-temperate)/0.0043+25;        //得到芯片內(nèi)部的溫度
  191.         key=Remote_Scan();        
  192.                         if(key)
  193.                 {        
  194.                   switch(key)
  195.                         {   
  196.                                    case 56://按鍵5
  197.                                         FLAG=0;
  198.                                               ACER=0;
  199.                                   LCD_ShowString(30,10,"                ",POINT_COLOR);break;
  200.                                              
  201.                                          case 226: //按鍵MENU
  202.                                                  {        FLAG++;
  203.                                                                                         if(FLAG==1){LCD_ShowString(30,10,"Set year",POINT_COLOR);flag=1;break;}
  204.                                                                                         else if(FLAG==2){LCD_ShowString(30,10,"Set month",POINT_COLOR);flag=2;break;}
  205.                                                                                         else if(FLAG==3){LCD_ShowString(30,10,"Set date     ",POINT_COLOR);flag=3;break;}
  206.                                                                                         else if(FLAG==4){LCD_ShowString(30,10,"Set hour     ",POINT_COLOR);flag=4;break;}
  207.                                                                                         else if(FLAG==5){LCD_ShowString(30,10,"Set min      ",POINT_COLOR);flag=5;break;}
  208.                                                                                         else if(FLAG==6){LCD_ShowString(30,10,"Set sec      ",POINT_COLOR);flag=6;break;}
  209.                                                                                         else if(FLAG>6&&FLAG%6==1){FLAG==1;LCD_ShowString(30,10,"Set year",POINT_COLOR);flag=1;break;}
  210.                                                                                         break;
  211.                                                                                 }
  212.                                                 case 144://按鍵right
  213.                                                                                 {
  214.                                                                                         if(flag==1){calendar.w_year++;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  215.                                                                                         else if(flag==2){calendar.w_month++;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  216.                                                                                         else if(flag==3){calendar.w_date++;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  217.                                                                                         else if(flag==4){calendar.hour++;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  218.                                                                                         else if(flag==5){calendar.min++;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  219.                                                                                         else if(flag==6){calendar.sec++;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  220.                                                                                         break;
  221.                                                                                 }
  222.                                                 case 224: //按鍵left
  223.                                                                                 {
  224.                       if(flag==1){calendar.w_year--;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  225.                                                                                         else if(flag==2){calendar.w_month--;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  226.                                                                                         else if(flag==3){calendar.w_date--;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  227.                                                                                         else if(flag==4){calendar.hour--;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  228.                                                                                         else if(flag==5){calendar.min--;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}
  229.                                                                                         else if(flag==6){calendar.sec--;RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);break;}        
  230.                                                                                         break;
  231.                                                                                 }
  232.                                                                                                 
  233.                           case 152:
  234.                                          temp_set =temp_set -1;                                //("按鍵:VOL- \r\n");
  235.                                         break;
  236.                                 case 2:
  237.                                           temp_set=temp_set +1;                                //("按鍵:VOL+\r\n");
  238.                                                                
  239.                                              case 162://按鍵power
  240.                                                        {  ACER++;
  241.                                                                                         if(ACER==1){LCD_ShowString(30,10,"Set clock hour",POINT_COLOR);acer=1;break;}
  242.                                                                                         else if(ACER==2){LCD_ShowString(30,10,"Set clock min",POINT_COLOR);acer=2;break;}
  243.                                                                                         else if(ACER==3){LCD_ShowString(30,10,"Set clock sec ",POINT_COLOR);acer=3;break;}
  244.                                                                       else if(ACER>3&&ACER%3==1){ACER==1;LCD_ShowString(30,10,"Set clock hour",POINT_COLOR);acer=1;break;}
  245.                                                                                         break;
  246.                                                                                 }
  247.                                                 case 90://按鍵6
  248.                                                                                 {
  249.                                                                                         if(acer==1){H++;break;}
  250.                                                                                         else if(acer==2){M++;break;}
  251.                                                                                         else if(acer==3){S++;break;}
  252.                                                                                   break;
  253.                                                                                 }
  254.                                                 case 16://按鍵4
  255.                                                                                 {
  256.                       if(acer==1){H--;break;}
  257.                                                                                         else if(acer==2){M--;break;}
  258.                                                                                         else if(acer==3){S--;break;}
  259.                       break;
  260.                                                                                 }
  261.                                                                                           case 34: //按鍵:text
  262.                                     A=1;
  263.                                         break;                        
  264.                                            }
  265.                                          }
  266.                         if((calendar.hour==H)&&(calendar.min==M)&&(calendar.sec==S))
  267.                         {TIM_Cmd(TIM3, ENABLE);}
  268.                         if(A)                                
  269.      {
  270.              {
  271.                                  TIM_Cmd(TIM3,DISABLE );
  272.          LED2_OFF;
  273.                                  A=0;
  274.                          }
  275. }
  276.                 //時間顯示
  277.    POINT_COLOR=RED;
  278.                 if(t!=calendar.sec)
  279.                 {
  280.                         t=calendar.sec;
  281.       LCD_ShowNum(30,190,calendar.w_year,4,16);                                                                          
  282.                         LCD_ShowNum(70,190,calendar.w_month,2,16);                                                                          
  283.                         LCD_ShowNum(94,190,calendar.w_date,2,16);
  284.       LCD_ShowNum(30,210,calendar.hour,2,16);                                                                          
  285.                         LCD_ShowNum(54,210,calendar.min,2,16);                                                                          
  286.                         LCD_ShowNum(78,210,calendar.sec,2,16);
  287.       LCD_ShowNum(30,250,H,2,16);                                                                          
  288.                         LCD_ShowNum(54,250,M,2,16);                                                                          
  289.                         LCD_ShowNum(78,250,S,2,16);               
  290.                         switch(calendar.week)
  291.                                                 {
  292.                                                         case 0:
  293.                                                                 LCD_ShowString(30,230,"Sunday   ",POINT_COLOR);
  294.                                                                 break;
  295.                                                         case 1:
  296.                                                                 LCD_ShowString(30,230,"Monday   ",POINT_COLOR);
  297.                                                                 break;
  298.                                                         case 2:
  299.                                                                 LCD_ShowString(30,230,"Tuesday  ",POINT_COLOR);
  300.                                                                 break;
  301.                                                         case 3:
  302.                                                                 LCD_ShowString(30,230,"Wednesday",POINT_COLOR);
  303.                                                                 break;
  304.                                                         case 4:
  305.                                                                 LCD_ShowString(30,230,"Thursday ",POINT_COLOR);
  306.                                                                 break;
  307.                                                         case 5:
  308.                                                                 LCD_ShowString(30,230,"Friday   ",POINT_COLOR);
  309.                                                                 break;
  310.                                                         case 6:
  311.                                                                 LCD_ShowString(30,230,"Saturday ",POINT_COLOR);
  312.                                                                 break;  
  313.                                                  }        
  314.                  
  315.             }         
  316.                
  317.                 /*按鍵控制報警上限*/
  318.                 {        
  319.                         value=KEY_Scan(); //獲取按鍵值
  320.                    if(value==2)
  321.                                  temp_set+=1;
  322.                    else if(value==1)
  323.                                  temp_set-=1;

  324.                 }
  325.                
  326.                 /*報警閃爍*/
  327.                 {        if(temp_value>temp_set)
  328.                                 {          LED1_ON;
  329.                                                 Delay(100000/(temp_value-temp_set));
  330.                                                 LED1_OFF;
  331.                                                 Delay(100000/(temp_value-temp_set));
  332.                                 }
  333.                         else
  334.                                 {                LED1_OFF;
  335.                                 }
  336.                 }
  337.                
  338.                 /*溫度顯示*/
  339.                 {        
  340.                         fun(temp_set,str);
  341.                         LCD_ShowString(50,110,str,POINT_COLOR);
  342.                         fun(temp_value,str);
  343.                         LCD_ShowString(50,150,str,POINT_COLOR);
  344.                         Delay(500000);
  345.                 }
  346.   }        
  347. }
復(fù)制代碼

rtc程序:
  1. #include "delay.h"
  2. #include "usart.h"
  3. #include "rtc.h"                     

  4.           
  5. _calendar_obj calendar;//時鐘結(jié)構(gòu)體        
  6.    
  7. //實(shí)時時鐘配置
  8. //初始化RTC時鐘,同時檢測時鐘是否工作正常
  9. //BKP->DR1用于保存是否第一次配置的設(shè)置
  10. //返回0:正常
  11. //其他:錯誤代碼
  12. u8 RTC_Init(void)
  13. {
  14.         //檢查是不是第一次配置時鐘
  15.         u8 temp=0;
  16.         if(BKP->DR1!=0X5050)//第一次配置
  17.         {         
  18.                   RCC->APB1ENR|=1<<28;     //使能電源時鐘            
  19.                 RCC->APB1ENR|=1<<27;     //使能備份時鐘            
  20.                 PWR->CR|=1<<8;           //取消備份區(qū)寫保護(hù)
  21.                 RCC->BDCR|=1<<16;        //備份區(qū)域軟復(fù)位          
  22.                 RCC->BDCR&=~(1<<16);     //備份區(qū)域軟復(fù)位結(jié)束                   
  23.             RCC->BDCR|=1<<0;         //開啟外部低速振蕩器
  24.             while((!(RCC->BDCR&0X02))&&temp<250)//等待外部時鐘就緒         
  25.                 {
  26.                         temp++;
  27.                         delay_ms(10);
  28.                 };
  29.                 if(temp>=250)return 1;//初始化時鐘失敗,晶振有問題          
  30.                 RCC->BDCR|=1<<8; //LSI作為RTC時鐘             
  31.                 RCC->BDCR|=1<<15;//RTC時鐘使能          
  32.                   while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成         
  33.             while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步  
  34.             RTC->CRH|=0X01;                    //允許秒中斷
  35.             while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成         
  36.                 RTC->CRL|=1<<4;           //允許配置         
  37.                 RTC->PRLH=0X0000;
  38.                 RTC->PRLL=32767;          //時鐘周期設(shè)置(有待觀察,看是否跑慢了?)理論值:32767       
  39.                 RTC_Set(2017,6,22,18,00,00);  //設(shè)置時間          
  40.                 RTC->CRL&=~(1<<4);           //配置更新
  41.                 while(!(RTC->CRL&(1<<5)));   //等待RTC寄存器操作完成                                                                                           
  42.                 BKP->DR1=0X5050;  
  43.                  printf("FIRST TIME\n");
  44.         }else//系統(tǒng)繼續(xù)計時
  45.         {
  46.             while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步  
  47.             RTC->CRH|=0X01;                    //允許秒中斷
  48.             while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
  49.                 printf("OK\n");
  50.         }                                                      
  51.         MY_NVIC_Init(0,0,RTC_IRQn,2);//優(yōu)先級設(shè)置   
  52.         RTC_Get();//更新時間
  53.         return 0; //ok
  54. }                                                     
  55. //RTC時鐘中斷
  56. //每秒觸發(fā)一次           
  57. void RTC_IRQHandler(void)
  58. {                 
  59.         if(RTC->CRL&0x0001)//秒鐘中斷
  60.         {                                                       
  61.                 RTC_Get();//更新時間   
  62.                 //printf("sec:%d\r\n",calendar.sec);
  63.         }
  64.         if(RTC->CRL&0x0002)//鬧鐘中斷
  65.         {
  66.                 RTC->CRL&=~(0x0002);                //清鬧鐘中斷          
  67.                   //printf("Alarm!\n");                  
  68.           }                                                                                                    
  69.     RTC->CRL&=0X0FFA;         //清除溢出,秒鐘中斷標(biāo)志
  70.         while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成                                                                                           
  71. }
  72. //判斷是否是閏年函數(shù)
  73. //月份   1  2  3  4  5  6  7  8  9  10 11 12
  74. //閏年   31 29 31 30 31 30 31 31 30 31 30 31
  75. //非閏年 31 28 31 30 31 30 31 31 30 31 30 31
  76. //year:年份
  77. //返回值:該年份是不是閏年.1,是.0,不是
  78. u8 Is_Leap_Year(u16 year)
  79. {                          
  80.         if(year%4==0) //必須能被4整除
  81.         {
  82.                 if(year%100==0)
  83.                 {
  84.                         if(year%400==0)return 1;//如果以00結(jié)尾,還要能被400整除           
  85.                         else return 0;   
  86.                 }else return 1;   
  87.         }else return 0;       
  88. }                                   
  89. //設(shè)置時鐘
  90. //把輸入的時鐘轉(zhuǎn)換為秒鐘
  91. //以1970年1月1日為基準(zhǔn)
  92. //1970~2099年為合法年份
  93. //返回值:0,成功;其他:錯誤代碼.
  94. //月份數(shù)據(jù)表                                                                                         
  95. u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數(shù)據(jù)表          
  96. //平年的月份日期表
  97. const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  98. //syear,smon,sday,hour,min,sec:年月日時分秒
  99. //返回值:設(shè)置結(jié)果。0,成功;1,失敗。
  100. u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
  101. {
  102.         u16 t;
  103.         u32 seccount=0;
  104.         if(syear<1970||syear>2099)return 1;          
  105.         for(t=1970;t<syear;t++)        //把所有年份的秒鐘相加
  106.         {
  107.                 if(Is_Leap_Year(t))seccount+=31622400;//閏年的秒鐘數(shù)
  108.                 else seccount+=31536000;                          //平年的秒鐘數(shù)
  109.         }
  110.         smon-=1;
  111.         for(t=0;t<smon;t++)           //把前面月份的秒鐘數(shù)相加
  112.         {
  113.                 seccount+=(u32)mon_table[t]*86400;//月份秒鐘數(shù)相加
  114.                 if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//閏年2月份增加一天的秒鐘數(shù)          
  115.         }
  116.         seccount+=(u32)(sday-1)*86400;//把前面日期的秒鐘數(shù)相加
  117.         seccount+=(u32)hour*3600;//小時秒鐘數(shù)
  118.     seccount+=(u32)min*60;         //分鐘秒鐘數(shù)
  119.         seccount+=sec;//最后的秒鐘加上去
  120.                                                                                                             
  121.         //設(shè)置時鐘
  122.     RCC->APB1ENR|=1<<28;//使能電源時鐘
  123.     RCC->APB1ENR|=1<<27;//使能備份時鐘
  124.         PWR->CR|=1<<8;    //取消備份區(qū)寫保護(hù)
  125.         //上面三步是必須的!
  126.         RTC->CRL|=1<<4;   //允許配置
  127.         RTC->CNTL=seccount&0xffff;
  128.         RTC->CNTH=seccount>>16;
  129.         RTC->CRL&=~(1<<4);//配置更新
  130.         while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
  131.         RTC_Get();//設(shè)置完之后更新一下數(shù)據(jù)        
  132.         return 0;            
  133. }
  134. //得到當(dāng)前的時間,結(jié)果保存在calendar結(jié)構(gòu)體里面
  135. //返回值:0,成功;其他:錯誤代碼.
  136. u8 RTC_Get(void)
  137. {
  138.         static u16 daycnt=0;
  139.         u32 timecount=0;
  140.         u32 temp=0;
  141.         u16 temp1=0;          
  142.         timecount=RTC->CNTH;//得到計數(shù)器中的值(秒鐘數(shù))
  143.         timecount<<=16;
  144.         timecount+=RTC->CNTL;                         

  145.         temp=timecount/86400;   //得到天數(shù)(秒鐘數(shù)對應(yīng)的)
  146.         if(daycnt!=temp)//超過一天了
  147.         {          
  148.                 daycnt=temp;
  149.                 temp1=1970;        //從1970年開始
  150.                 while(temp>=365)
  151.                 {                                 
  152.                         if(Is_Leap_Year(temp1))//是閏年
  153.                         {
  154.                                 if(temp>=366)temp-=366;//閏年的秒鐘數(shù)
  155.                                 else break;  
  156.                         }
  157.                         else temp-=365;          //平年
  158.                         temp1++;  
  159.                 }   
  160.                 calendar.w_year=temp1;//得到年份
  161.                 temp1=0;
  162.                 while(temp>=28)//超過了一個月
  163.                 {
  164.                         if(Is_Leap_Year(calendar.w_year)&&temp1==1)//當(dāng)年是不是閏年/2月份
  165.                         {
  166.                                 if(temp>=29)temp-=29;//閏年的秒鐘數(shù)
  167.                                 else break;
  168.                         }
  169.                         else
  170.                         {
  171.                                 if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年
  172.                                 else break;
  173.                         }
  174.                         temp1++;  
  175.                 }
  176.                 calendar.w_month=temp1+1;        //得到月份
  177.                 calendar.w_date=temp+1;          //得到日期
  178.         }
  179.         temp=timecount%86400;                     //得到秒鐘數(shù)             
  180.         calendar.hour=temp/3600;             //小時
  181.         calendar.min=(temp%3600)/60;         //分鐘       
  182.         calendar.sec=(temp%3600)%60;         //秒鐘
  183.         calendar.week=RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);//獲取星期   
  184.         return 0;
  185. }         
  186. //獲得現(xiàn)在是星期幾
  187. //功能描述:輸入公歷日期得到星期(只允許1901-2099年)
  188. //year,month,day:公歷年月日
  189. //返回值:星期號                                                                                                                                                                                 
  190. u8 RTC_Get_Week(u16 year,u8 month,u8 day)
  191. {       
  192.         u16 temp2;
  193.         u8 yearH,yearL;
  194.        
  195.         yearH=year/100;        yearL=year%100;
  196.         // 如果為21世紀(jì),年份數(shù)加100  
  197.         if (yearH>19)yearL+=100;
  198.         // 所過閏年數(shù)只算1900年之后的  
  199.         temp2=yearL+yearL/4;
  200.         temp2=temp2%7;
  201.         temp2=temp2+day+table_week[month-1];
  202.         if (yearL%4==0&&month<3)temp2--;
  203.         return(temp2%7);
  204. }
復(fù)制代碼

紅外遙控程序:
  1. #include "remote.h"
  2. #include "delay.h"


  3. void Remote_Init(void)                              
  4. {  

  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         NVIC_InitTypeDef NVIC_InitStructure;
  7.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  8.         TIM_ICInitTypeDef  TIM_ICInitStructure;  

  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  10.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);       

  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 //PA1 輸入
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                 //上拉輸入
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  14.         GPIO_SetBits(GPIOA,GPIO_Pin_1);        //初始化GPIOA1
  15.        
  16.                                                   
  17.         TIM_TimeBaseStructure.TIM_Period = 10000; //設(shè)定計數(shù)器自動重裝值 最大10ms溢出  
  18.         TIM_TimeBaseStructure.TIM_Prescaler =(72-1);         //預(yù)分頻器,1M的計數(shù)頻率,1us加1.          
  19.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_tim
  20.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式

  21.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx

  22.   TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;  // 選擇輸入端 IC2映射到TI2上
  23.   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕獲
  24.   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  25.   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置輸入分頻,不分頻
  26.   TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置輸入濾波器 8個定時器時鐘周期濾波
  27.   TIM_ICInit(TIM2, &TIM_ICInitStructure);//初始化定時器輸入捕獲通道

  28.   TIM_Cmd(TIM2,ENABLE );         //使能定時器2

  29.                                                
  30.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中斷
  31.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占優(yōu)先級0級
  32.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //從優(yōu)先級3級
  33.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  34.         NVIC_Init(&NVIC_InitStructure);  //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器       

  35.         TIM_ITConfig( TIM2,TIM_IT_Update|TIM_IT_CC2,ENABLE);//允許更新中斷 ,允許CC2IE捕獲中斷       
  36. }


  37. //遙控器接收狀態(tài)
  38. //[7]:收到了引導(dǎo)碼標(biāo)志
  39. //[6]:得到了一個按鍵的所有信息
  40. //[5]:保留       
  41. //[4]:標(biāo)記上升沿是否已經(jīng)被捕獲                                                                  
  42. //[3:0]:溢出計時器
  43. u8         RmtSta=0;                    
  44. u16 Dval;                //下降沿時計數(shù)器的值
  45. u32 RmtRec=0;        //紅外接收到的數(shù)據(jù)                               
  46. u8  RmtCnt=0;        //按鍵按下的次數(shù)          
  47. //定時器5中斷服務(wù)程序         
  48. void TIM2_IRQHandler(void)
  49. {                              
  50.   if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  51.         {
  52.                 if(RmtSta&0x80)//上次有數(shù)據(jù)被接收到了
  53.                 {       
  54.                         RmtSta&=~0X10;                                                //取消上升沿已經(jīng)被捕獲標(biāo)記
  55.                         if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//標(biāo)記已經(jīng)完成一次按鍵的鍵值信息采集
  56.                         if((RmtSta&0X0F)<14)RmtSta++;
  57.                         else
  58.                         {
  59.                                 RmtSta&=~(1<<7);//清空引導(dǎo)標(biāo)識
  60.                                 RmtSta&=0XF0;        //清空計數(shù)器       
  61.                         }                                                                   
  62.                 }                                                            
  63.         }
  64.         if(TIM_GetITStatus(TIM2,TIM_IT_CC2)!=RESET)
  65.         {          
  66.                 if(RDATA)//上升沿捕獲
  67.                 {

  68.                         TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling);                //CC2P=1 設(shè)置為下降沿捕獲                               
  69.             TIM_SetCounter(TIM2,0);                   //清空定時器值
  70.                         RmtSta|=0X10;                                        //標(biāo)記上升沿已經(jīng)被捕獲
  71.                 }else //下降沿捕獲
  72.                 {                       
  73.                         Dval=TIM_GetCapture2(TIM2);//讀取CCR2也可以清CC2IF標(biāo)志位
  74.                         TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC2P=0        設(shè)置為上升沿捕獲
  75.                        
  76.                         if(RmtSta&0X10)                                        //完成一次高電平捕獲
  77.                         {
  78.                                 if(RmtSta&0X80)//接收到了引導(dǎo)碼
  79.                                 {
  80.                                        
  81.                                         if(Dval>300&&Dval<800)                        //560為標(biāo)準(zhǔn)值,560us
  82.                                         {
  83.                                                 RmtRec<<=1;        //左移一位.
  84.                                                 RmtRec|=0;        //接收到0          
  85.                                         }else if(Dval>1400&&Dval<1800)        //1680為標(biāo)準(zhǔn)值,1680us
  86.                                         {
  87.                                                 RmtRec<<=1;        //左移一位.
  88.                                                 RmtRec|=1;        //接收到1
  89.                                         }else if(Dval>2200&&Dval<2600)        //得到按鍵鍵值增加的信息 2500為標(biāo)準(zhǔn)值2.5ms
  90.                                         {
  91.                                                 RmtCnt++;                 //按鍵次數(shù)增加1次
  92.                                                 RmtSta&=0XF0;        //清空計時器               
  93.                                         }
  94.                                 }else if(Dval>4200&&Dval<4700)                //4500為標(biāo)準(zhǔn)值4.5ms
  95.                                 {
  96.                                         RmtSta|=1<<7;        //標(biāo)記成功接收到了引導(dǎo)碼
  97.                                         RmtCnt=0;                //清除按鍵次數(shù)計數(shù)器
  98.                                 }                                                 
  99.                         }
  100.                         RmtSta&=~(1<<4);
  101.                 }                                                                                                            
  102.         }
  103. TIM_ClearFlag(TIM2,TIM_IT_Update|TIM_IT_CC2);            
  104. }

  105. //處理紅外鍵盤
  106. //返回值:
  107. //         0,沒有任何按鍵按下
  108. //其他,按下的按鍵鍵值.
  109. u8 Remote_Scan(void)
  110. {        
  111.         u8 sta=0;      
  112.   u8 t1,t2;  
  113.         if(RmtSta&(1<<6))//得到一個按鍵的所有信息了
  114.         {
  115.             t1=RmtRec>>24;                        //得到地址碼
  116.             t2=(RmtRec>>16)&0xff;        //得到地址反碼
  117.             if((t1==(u8)~t2)&&t1==REMOTE_ID)//檢驗遙控識別碼(ID)及地址
  118.             {
  119.                 t1=RmtRec>>8;
  120.                 t2=RmtRec;        
  121.                 if(t1==(u8)~t2)sta=t1;//鍵值正確         
  122.                         }   
  123.                         if((sta==0)||((RmtSta&0X80)==0))//按鍵數(shù)據(jù)錯誤/遙控已經(jīng)沒有按下了
  124.                         {
  125.                                 RmtSta&=~(1<<6);//清除接收到有效按鍵標(biāo)識
  126.                                 RmtCnt=0;                //清除按鍵次數(shù)計數(shù)器
  127.                         }
  128.                         RmtSta&=~(1<<6);//清除接收到有效按鍵標(biāo)識       
  129.         }
  130.        
  131.   return sta;
  132. }
復(fù)制代碼

所有資料51hei提供下載:
基礎(chǔ)功能_RTC-修改-定時器.rar (336.2 KB, 下載次數(shù): 22)


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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产亚洲精品综合一区 | 国产精品国产精品国产专区不卡 | 国产在线观 | 亚洲精品视频一区二区三区 | 日韩国产精品一区二区三区 | 特级黄色毛片 | 欧美一区二区三区四区视频 | 国产精品久久久久久亚洲调教 | 久久av.com | 九九热re | 欧美精品久久久久 | 欧美色性 | 久久99深爱久久99精品 | 一区二区国产在线 | 国产精品久久久久9999鸭 | 免费在线观看一区二区三区 | 免费的网站www | 久草在线青青草 | 日韩欧美三区 | 精品国模一区二区三区欧美 | 久久精品一区二区视频 | 欧美一区久久 | 国产精品久久久久久久久久免费 | 国产毛片av | 国产高清视频在线播放 | 午夜精品久久久 | 日韩免费在线观看视频 | 成人性视频免费网站 | av一区二区三区四区 | 日韩在线视频精品 | 国产高清一区二区三区 | 伊色综合久久之综合久久 | 青青草av| 精品一区二区久久久久久久网站 | 精品一二区 | 乱码av午夜噜噜噜噜动漫 | 91精品导航 | 国产精品视频一区二区三区 | 国产精品久久久久久妇女6080 | 国产精品色综合 | 午夜精品一区二区三区在线观看 |