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

QQ登錄

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

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

stm32的rtc定時(shí)控制開(kāi)關(guān)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:825614 發(fā)表于 2021-8-10 21:21 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include "stm32f10x.h" //STM32頭文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "buzzer.h"
#include "usart.h"
#include "rtc.h"
#include "NVIC.h"
#include "adc.h"
#include "oled.h"




extern vu16 ADC_DMA_IN4; //聲明外部變量
extern u8 INT_MARK;//中斷標(biāo)志?
extern u32 ui;//用于遙控變量
extern u8 q;
u16 d=0;
u8 w;




void key(){
                if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //讀按鍵接口的電平
                                GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鳴器接口輸出高電平1
                        delay_ms(20); //延時(shí)去抖動(dòng)
                        if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //讀按鍵接口的電平
                                GPIO_WriteBit(LEDPORT,LED3,(BitAction)(q++));
                                while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按鍵松開(kāi)
                                if(q==3){q=0;}
                                        GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
                                        }                                                                                                                                                }
               
                                                                                                                                                                                }


void key2(){
                if(GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //讀按鍵接口的電平
                                GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鳴器接口輸出高電平1
                        if(GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //讀按鍵接口的電平
                                GPIO_WriteBit(LEDPORT,LED3,(BitAction)(q++));
                                while(GPIO_ReadInputDataBit(KEYPORT,KEY2)); //等待按鍵松開(kāi)
                                if(q==3){q=0;}
                                        GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
                                        }                                                                                                                                                }
               
                                                                                                                                                                                }       
void key3(){
                if(GPIO_ReadInputDataBit(KEYPORT,KEY3)){ //讀按鍵接口的電平
                                GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鳴器接口輸出高電平1
                        if(GPIO_ReadInputDataBit(KEYPORT,KEY3)){ //讀按鍵接口的電平
                                GPIO_WriteBit(LEDPORT,LED3,(BitAction)(q++));
                                while(GPIO_ReadInputDataBit(KEYPORT,KEY3)); //等待按鍵松開(kāi)
                                if(q==3){q=0;}
                                        GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
                                        }                                                                                                                                                }
               
                                                                                                                                                                                }
void key4(){
                if(GPIO_ReadInputDataBit(KEYPORT,KEY4)){ //讀按鍵接口的電平
                                GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鳴器接口輸出高電平1
                        if(GPIO_ReadInputDataBit(KEYPORT,KEY4)){ //讀按鍵接口的電平
                                GPIO_WriteBit(LEDPORT,LED3,(BitAction)(q++));
                                while(GPIO_ReadInputDataBit(KEYPORT,KEY4)); //等待按鍵松開(kāi)
                                if(q==3){q=0;}
                                        GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
                                        }                                                                                                                                                }
               
                                                                                                                                                                                }
void key5(){
                if(GPIO_ReadInputDataBit(KEYPORT,KEY5)){ //讀按鍵接口的電平
                                GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鳴器接口輸出高電平1
                        if(GPIO_ReadInputDataBit(KEYPORT,KEY5)){ //讀按鍵接口的電平
                                GPIO_WriteBit(LEDPORT,LED3,(BitAction)(q++));
                                while(GPIO_ReadInputDataBit(KEYPORT,KEY5)); //等待按鍵松開(kāi)
                                if(q==3){q=0;}
                                        GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
                                        }                                                                                                                                                }
               
                                                                                                                                                                                }


int main (void){//主程序
        u8 bya;
//        w=0;
INT_MARK=0;//中斷標(biāo)志位
        ui=0;
        q=0;
        RCC_Configuration(); //系統(tǒng)時(shí)鐘初始化
        RTC_Config(); //實(shí)時(shí)時(shí)鐘初始化
        LED_Init();//LED初始化
        KEY_Init();//按鍵初始化
        BUZZER_Init();//蜂鳴器初始化
        USART1_Init(115200); //串口初始化,參數(shù)中寫(xiě)波特率
//        USART1_Init(9600); //串口初始化,參數(shù)中寫(xiě)波特率
        USART1_RX_STA=0xC000; //初始值設(shè)為有回車的狀態(tài),即顯示一次歡迎詞
//        KEY_INT_INIT();
        TIMENVIC_INT_INIT ();


       
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);  //使能電源PWR時(shí)鐘
//                RTC_Set(2021,8,8,20,59,00);       
//                RTC_Alarm_Set(2020,12,13,00,00,10);
//                                MIDI_PLAY();
                ADC_Configuration(); //ADC初始化設(shè)置
                OLED_Init();                        //初始化OLED  
                OLED_Clear();






        while(1){
                GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
                d=(ADC_DMA_IN4-120)/71.428571428571*100;
               
//                if(ADC_DMA_IN4<880){
//                                                                                                GPIO_WriteBit(LEDPORT,LED2,(BitAction)(0));GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));
//                                                                                                GPIO_WriteBit(LEDPORT1,LED4,(BitAction)(0));


//                                                                                         }
               
               
                                                                                         
                                                        if(ui==0xa1){q=1;printf("打開(kāi)路由器          \r\n");ui=0;}
                                                                if(ui==0xa2){q=2;printf("打開(kāi)燈光         \r\n");ui=0;}
                                                                                if(ui==0xa0){q=0;printf("關(guān)閉所有          \r\n");ui=0;}else{ui=0;}


//                OLED_ShowNum(48,6,rsec,3,16);//顯示ASCII字符       
//                OLED_ShowNum(103,6,rmin,3,16);//顯示ASCII字符的碼值
               
//                                PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);//進(jìn)入停機(jī)模式


//                RCC_Configuration(); //系統(tǒng)時(shí)鐘初始化(停機(jī)喚醒后會(huì)改用HSI時(shí)鐘,需要重新對(duì)時(shí)鐘初始化)
//                delay_ms(500);
                        if(q==1){q=2;}
                        if(q==0){GPIO_WriteBit(LEDPORT,LED2,(BitAction)(0));OLED_ShowCHinese(54,0,17);GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));OLED_ShowCHinese(54,2,17);}
                        if(q==1){GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1));OLED_ShowCHinese(54,0,16);GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));OLED_ShowCHinese(54,2,17);}
                        if(q==2){GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1));OLED_ShowCHinese(54,0,16);GPIO_WriteBit(LEDPORT,LED3,(BitAction)(1));OLED_ShowCHinese(54,2,16);}                       
               
key();key2();key3();key4();key5();
                if(USART1_RX_STA&0xC000){ //如果標(biāo)志位是0xC000表示收到數(shù)據(jù)串完成,可以處理。
                        if((USART1_RX_STA&0x3FFF)==0){ //單獨(dú)的回車鍵再顯示一次歡迎詞
                                if(RTC_Get()==0){ //讀出時(shí)間值,同時(shí)判斷返回值是不是0,非0時(shí)讀取的值是錯(cuò)誤的。
                                        printf(" 洋桃開(kāi)發(fā)板STM32實(shí)時(shí)時(shí)鐘測(cè)試程序   \r\n");
                                        printf(" 現(xiàn)在實(shí)時(shí)時(shí)間:%d-%d-%d %d:%d:%d  ",ryear,rmon,rday,rhour,rmin,rsec);//顯示日期時(shí)間
                                        if(rweek==0)printf("星期日   \r\n");//rweek值為0時(shí)表示星期日
                                        if(rweek==1)printf("星期一   \r\n");
                                        if(rweek==2)printf("星期二   \r\n");
                                        if(rweek==3)printf("星期三   \r\n");
                                        if(rweek==4)printf("星期四   \r\n");
                                        if(rweek==5)printf("星期五   \r\n");
                                        if(rweek==6)printf("星期六   \r\n");
                                        printf(" 單按回車鍵更新時(shí)間。輸入字母C初始化時(shí)鐘 \r\n");
                                        printf(" 請(qǐng)輸入設(shè)置時(shí)間,格式20170806120000,按回車鍵確定! \r\n");
                                }else{
                                        printf("讀取失敗!\r\n");
                                }
                        }else if((USART1_RX_STA&0x3FFF)==1){ //判斷數(shù)據(jù)是不是2個(gè)


                                if(USART1_RX_BUF[0]=='c' || USART1_RX_BUF[0]=='C'){
                                        RTC_First_Config(); //鍵盤(pán)輸入c或C,初始化時(shí)鐘
                                        BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);//配置完成后,向后備寄存器中寫(xiě)特殊字符0xA5A5
                                        printf("初始化成功!      \r\n");//顯示初始化成功
                                }else{
                                        printf("指令錯(cuò)誤!          \r\n"); //顯示指令錯(cuò)誤!
                                }
                        }
                       
else if((USART1_RX_STA&0x3FFF)==14){ //判斷數(shù)據(jù)是不是14個(gè)
                                //將超級(jí)終端發(fā)過(guò)來(lái)的數(shù)據(jù)換算并寫(xiě)入RTC
                                ryear = (USART1_RX_BUF[0]-0x30)*1000+(USART1_RX_BUF[1]-0x30)*100+(USART1_RX_BUF[2]-0x30)*10+USART1_RX_BUF[3]-0x30;
                                rmon = (USART1_RX_BUF[4]-0x30)*10+USART1_RX_BUF[5]-0x30;//串口發(fā)來(lái)的是字符,減0x30后才能得到十進(jìn)制0~9的數(shù)據(jù)
                                rday = (USART1_RX_BUF[6]-0x30)*10+USART1_RX_BUF[7]-0x30;
                                rhour = (USART1_RX_BUF[8]-0x30)*10+USART1_RX_BUF[9]-0x30;
                                rmin = (USART1_RX_BUF[10]-0x30)*10+USART1_RX_BUF[11]-0x30;
                                rsec = (USART1_RX_BUF[12]-0x30)*10+USART1_RX_BUF[13]-0x30;
                                bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec); //將數(shù)據(jù)寫(xiě)入RTC計(jì)算器的程序
                                if(bya==0)printf("寫(xiě)入成功!      \r\n");//顯示寫(xiě)入成功
                                else printf("寫(xiě)入失!       \r\n"); //顯示寫(xiě)入失敗
                        }else{ //如果以上都不是,即是錯(cuò)誤的指令。
                                printf("指令錯(cuò)誤!          \r\n"); //如果不是以上正確的操作,顯示指令錯(cuò)誤!
                        }
                        USART1_RX_STA=0; //將串口數(shù)據(jù)標(biāo)志位清0
                }
               
               
                        if(RTC_Get()==0){ //讀出時(shí)間值,同時(shí)判斷返回值是不是0,非0時(shí)讀取的值是錯(cuò)誤的。


//                OLED_ShowString(20,4,ryear/rmon/rday,16);
                               
                               
                               
                OLED_ShowCHinese(0,0,10); //路
                OLED_ShowCHinese(18,0,11);//由
                OLED_ShowCHinese(36,0,12);//器
                               
//                OLED_ShowCHinese(54,0,16);//開(kāi)               


                OLED_ShowCHinese(0,2,13); //照
                OLED_ShowCHinese(18,2,14);//明
                OLED_ShowCHinese(36,2,15);//燈                       


//                OLED_ShowCHinese(54,2,17);//關(guān)                                       
               
//                OLED_ShowNum(80,0,d,6,16);     //10.95v=900 13v=1050                                                                        82.19178082
                OLED_ShowNum(82,0,(d/100),2,16);
                OLED_ShowString(98,0,".",16);               
                OLED_ShowNum(100,0,(d%100),2,16);
                OLED_ShowString(120,0,"v",16);                       
                               
               
                               
                               
                OLED_ShowNum(0,4,ryear,5,16);
                OLED_ShowString(40,4,"/",16);               
                OLED_ShowNum(47,4,rmon,3,16);
                OLED_ShowString(73,4,"/",16);
                OLED_ShowNum(80,4,rday,3,16);               
                               
                OLED_ShowNum(0,6,rhour,3,16);
                OLED_ShowString(23,6,":",16);          
                OLED_ShowNum(28,6,rmin,3,16);
                OLED_ShowString(51,6,":",16);
                OLED_ShowNum(56,6,rsec,3,16);       


                OLED_ShowCHinese(102,6,18);//周
//                OLED_ShowString(95,6,"NO:",16);
                if(rweek!=0){w=rweek;}//rweek值為0時(shí)表示星期日
                if(rweek==0){w=7;}//rweek值為0時(shí)表示星期日
                OLED_ShowNum(120,6,w,1,16);                               
               


//                        GPIO_WriteBit(LEDPORT,LED2,(BitAction)(rmin%2)); //LED2接口
                        if(ADC_DMA_IN4>890){                if(rhour==20){if(rmin==30){if(rsec==1){q=2;}}}}
                        if(rhour==0){if(rmin==30){if(rsec==1){q=0;}}}
                        if(rhour==2){if(rmin==00){if(rsec==1){q=0;}}}
                        if(rhour==8){if(rmin==30){if(rsec==1){q=0;}}}
                        if(rhour==0){if(rmin==29){if(rsec==1){
                        if(GPIO_ReadInputDataBit(LEDPORT,LED3)){
                        GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));delay_ms(500);
                        GPIO_WriteBit(LEDPORT,LED3,(BitAction)(1));delay_ms(500);
                        GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));delay_ms(500);
                        GPIO_WriteBit(LEDPORT,LED3,(BitAction)(1));delay_ms(500);
                        GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));delay_ms(500);
                        GPIO_WriteBit(LEDPORT,LED3,(BitAction)(1));
                                                                                                                                                                                 }
                                                                                                                                                                                }                               
                                                                                                                                }
                                                                                }
                        if(ADC_DMA_IN4<890){GPIO_WriteBit(LEDPORT1,LED4,(BitAction)(rsec%2));}
                        if(ADC_DMA_IN4>900){GPIO_WriteBit(LEDPORT1,LED4,(BitAction)(1));}
                        key();key2();key3();key4();key5();
                                                                                        }


//                        GPIO_WriteBit(LEDPORT1,LED4,(BitAction)(0));


                                                                                                                                               
        }
}

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

使用道具 舉報(bào)

沙發(fā)
ID:229641 發(fā)表于 2021-10-22 13:51 來(lái)自觸屏版 | 只看該作者
沒(méi)有工程?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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