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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32單片機程序:溫度、萬年歷、PWM、輸入捕捉高電平、ADC、DAC、EEPROM、IIC

  [復制鏈接]
跳轉到指定樓層
樓主
STM32單片機程序:溫度、萬年歷、PWM、輸入捕捉高電平、ADC、DAC、EEPROM、IIC



單片機源程序如下:
  1. #include "SysTick.h"
  2. #include "public.h"
  3.                     

  4.           
  5. _calendar calendar;//時鐘結構體

  6. static void RTC_NVIC_Config(void)
  7. {       
  8.         NVIC_InitTypeDef NVIC_InitStructure;
  9.         NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;                //RTC全局中斷
  10.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //先占優先級1位,從優先級3位
  11.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //先占優先級0位,從優先級4位
  12.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //使能該通道中斷
  13.         NVIC_Init(&NVIC_InitStructure);                //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
  14. }


  15. /*******************************************************************************
  16. * 函 數 名         : RTC_Init
  17. * 函數功能                   : RTC初始化
  18. * 輸    入         : 無
  19. * 輸    出         : 0,初始化成功
  20.                                  1,LSE開啟失敗
  21. *******************************************************************************/
  22. u8 RTC_Init(void)
  23. {
  24.         //檢查是不是第一次配置時鐘
  25.         u8 temp=0;
  26.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);        //使能PWR和BKP外設時鐘   
  27.         PWR_BackupAccessCmd(ENABLE);        //使能后備寄存器訪問  
  28.         if (BKP_ReadBackupRegister(BKP_DR1) != 0xA0A0)                //從指定的后備寄存器中讀出數據:讀出了與寫入的指定數據不相乎
  29.         {                        
  30.                 //????RTC
  31.                 //RTC_Configuration();                
  32.                 BKP_DeInit();        //復位備份區域        
  33.                 RCC_LSEConfig(RCC_LSE_ON);        //設置外部低速晶振(LSE),使用外設低速晶振
  34.                 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)        //檢查指定的RCC標志位設置與否,等待低速晶振就緒
  35.                 {
  36.                         temp++;
  37.                         delay_ms(10);
  38.                 }
  39.                 if(temp>=250)return 1;//初始化時鐘失敗,晶振有問題            
  40.                 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);                //設置RTC時鐘(RTCCLK),選擇LSE作為RTC時鐘   
  41.                 RCC_RTCCLKCmd(ENABLE);        //使能RTC時鐘  
  42.                 RTC_WaitForLastTask();        //等待最近一次對RTC寄存器的寫操作完成
  43.                 RTC_WaitForSynchro();                //等待RTC寄存器同步  
  44.                 RTC_ITConfig(RTC_IT_SEC, ENABLE);                //使能RTC秒中斷
  45.                 RTC_WaitForLastTask();        //等待最近一次對RTC寄存器的寫操作完成
  46.                 RTC_EnterConfigMode();// 允許配置       
  47.                 RTC_SetPrescaler(32767); //設置RTC預分頻的值
  48.                 RTC_WaitForLastTask();        //等待最近一次對RTC寄存器的寫操作完成
  49.                 RTC_Set(2018,8,20,14,39,55);  //設置時間       
  50.                 RTC_ExitConfigMode(); //退出配置模式  
  51.                 BKP_WriteBackupRegister(BKP_DR1, 0XA0A0);        //向指定的后備寄存器中寫入用戶程序數據
  52.         }
  53.         else//系統繼續計時
  54.         {
  55.                 RTC_WaitForSynchro();        //等待最近一次對RTC寄存器的寫操作完成
  56.                 RTC_ITConfig(RTC_IT_SEC, ENABLE);        //使能RTC秒中斷
  57.                 RTC_WaitForLastTask();        //等待最近一次對RTC寄存器的寫操作完成
  58.         }
  59.         RTC_NVIC_Config();//RCT中斷分組設置                                                         
  60.         RTC_Get();//更新時間       
  61.         return 0; //ok

  62. }                                                     
  63. //RTC時鐘中斷
  64. //每秒觸發一次  
  65. //extern u16 tcnt;
  66. int jishu;
  67. void RTC_IRQHandler(void)
  68. {                 
  69.         if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒鐘中斷
  70.         {                                                       
  71.                 RTC_Get();//更新時間  
  72.                 printf("RTC Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//輸出鬧鈴時間       
  73.                 LCD_ShowFontHZ(82,270,"日期");
  74.                 LCD_ShowxNum(0,300,calendar.w_year,2,24,0);               
  75.                 LCD_ShowString(24,300,tftlcd_data.width,tftlcd_data.height,24,"-");
  76.                 LCD_ShowxNum(36,300,calendar.w_month,2,24,0);       
  77.                 LCD_ShowString(60,300,tftlcd_data.width,tftlcd_data.height,24,"-");
  78.                 LCD_ShowxNum(72,300,calendar.w_date,2,24,0);       
  79.                 //小時
  80.                 LCD_ShowxNum(146,300,calendar.hour,2,24,0);       
  81.                 LCD_ShowString(170,300,tftlcd_data.width,tftlcd_data.height,24,":");
  82.                 LCD_ShowxNum(182,300,calendar.min,2,24,0);       
  83.                 LCD_ShowString(206,300,tftlcd_data.width,tftlcd_data.height,24,":");
  84.                 LCD_ShowxNum(218,300,calendar.sec,2,24,0);       
  85.                 //星期
  86.                 LCD_ShowFontHZ(70,340,"星期");
  87.                 LCD_ShowNum(135,343,calendar.week,2,24);       
  88.                
  89.                 //原定時器1s計數
  90.                 jishu++;
  91.                 LCD_ShowxNum(110,120,jishu,5,24,0);
  92.                 LCD_ShowString(50,120,tftlcd_data.width,tftlcd_data.height,24,"time:");
  93.                 LCD_ShowString(180,120,tftlcd_data.width,tftlcd_data.height,24,"s");
  94.                
  95.                
  96.         }
  97.         if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//鬧鐘中斷
  98.         {
  99.                 RTC_ClearITPendingBit(RTC_IT_ALR);                //清鬧鐘中斷                 
  100.                 RTC_Get();                                //更新時間   
  101.                 printf("Alarm Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//輸出鬧鈴時間       
  102.                
  103.           }                
  104.                        
  105.         RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);                //清鬧鐘中斷
  106.         RTC_WaitForLastTask();                                                                                           
  107. }
  108. //判斷是否是閏年函數
  109. //月份   1  2  3  4  5  6  7  8  9  10 11 12
  110. //閏年   31 29 31 30 31 30 31 31 30 31 30 31
  111. //非閏年 31 28 31 30 31 30 31 31 30 31 30 31
  112. //輸入:年份
  113. //輸出:該年份是不是閏年.1,是.0,不是
  114. u8 Is_Leap_Year(u16 year)
  115. {                          
  116.         if(year%4==0) //必須能被4整除
  117.         {
  118.                 if(year%100==0)
  119.                 {
  120.                         if(year%400==0)return 1;//如果以00結尾,還要能被400整除           
  121.                         else return 0;   
  122.                 }else return 1;   
  123.         }else return 0;       
  124. }                                   


  125. //月份數據表                                                                                         
  126. u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數據表          
  127. //平年的月份日期表
  128. const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};

  129. /*******************************************************************************
  130. * 函 數 名         : RTC_Set
  131. * 函數功能                   : RTC設置日期時間函數(以1970年1月1日為基準,把輸入的時鐘轉換為秒鐘)
  132.                                                 1970~2099年為合法年份
  133. * 輸    入         : syear:年  smon:月  sday:日
  134.                                         hour:時   min:分         sec:秒                       
  135. * 輸    出         : 0,成功
  136.                                  1,失敗
  137. *******************************************************************************/
  138. u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
  139. {
  140.         u16 t;
  141.         u32 seccount=0;
  142.         if(syear<1970||syear>2099)return 1;          
  143.         for(t=1970;t<syear;t++)        //把所有年份的秒鐘相加
  144.         {
  145.                 if(Is_Leap_Year(t)) seccount+=31622400;//閏年的秒鐘數
  146.                 else seccount+=31536000;                          //平年的秒鐘數
  147.         }
  148.         smon-=1;
  149.         for(t=0;t<smon;t++)           //把前面月份的秒鐘數相加
  150.         {
  151.                 seccount+=(u32)mon_table[t]*86400;//月份秒鐘數相加
  152.                 if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//閏年2月份增加一天的秒鐘數          
  153.         }
  154.         seccount+=(u32)(sday-1)*86400;//把前面日期的秒鐘數相加
  155.         seccount+=(u32)hour*3600;//小時秒鐘數
  156.     seccount+=(u32)min*60;         //分鐘秒鐘數
  157.         seccount+=sec;//最后的秒鐘加上去

  158.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);        //使能PWR和BKP外設時鐘  
  159.         PWR_BackupAccessCmd(ENABLE);        //使能RTC和后備寄存器訪問
  160.         RTC_SetCounter(seccount);        //設置RTC計數器的值

  161.         RTC_WaitForLastTask();        //等待最近一次對RTC寄存器的寫操作完成         
  162.         return 0;            
  163. }

  164. //初始化鬧鐘                  
  165. //以1970年1月1日為基準
  166. //1970~2099年為合法年份
  167. //syear,smon,sday,hour,min,sec:鬧鐘的年月日時分秒   
  168. //返回值:0,成功;其他:錯誤代碼.
  169. u8 RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
  170. {
  171.         u16 t;
  172.         u32 seccount=0;
  173.         if(syear<1970||syear>2099)return 1;          
  174.         for(t=1970;t<syear;t++)        //把所有年份的秒鐘相加
  175.         {
  176.                 if(Is_Leap_Year(t))seccount+=31622400;//閏年的秒鐘數
  177.                 else seccount+=31536000;                          //平年的秒鐘數
  178.         }
  179.         smon-=1;
  180.         for(t=0;t<smon;t++)           //把前面月份的秒鐘數相加
  181.         {
  182.                 seccount+=(u32)mon_table[t]*86400;//月份秒鐘數相加
  183.                 if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//閏年2月份增加一天的秒鐘數          
  184.         }
  185.         seccount+=(u32)(sday-1)*86400;//把前面日期的秒鐘數相加
  186.         seccount+=(u32)hour*3600;//小時秒鐘數
  187.     seccount+=(u32)min*60;         //分鐘秒鐘數
  188.         seccount+=sec;//最后的秒鐘加上去                             
  189.         //設置時鐘
  190.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);        //使能PWR和BKP外設時鐘   
  191.         PWR_BackupAccessCmd(ENABLE);        //使能后備寄存器訪問  
  192.         //上面三步是必須的!
  193.        
  194.         RTC_SetAlarm(seccount);

  195.         RTC_WaitForLastTask();        //等待最近一次對RTC寄存器的寫操作完成         
  196.        
  197.         return 0;            
  198. }


  199. //得到當前的時間
  200. //返回值:0,成功;其他:錯誤代碼.
  201. u8 RTC_Get(void)
  202. {
  203.         static u16 daycnt=0;
  204.         u32 timecount=0;
  205.         u32 temp=0;
  206.         u16 temp1=0;          
  207.     timecount=RTC_GetCounter();         //得到計數器中的秒鐘值
  208.         temp=timecount/86400;   //得到天數(秒鐘數對應的)一天86400s
  209.         if(daycnt!=temp)//超過一天了
  210.         {          
  211.                 daycnt=temp;
  212.                 temp1=1970;        //從1970年開始
  213.                 while(temp>=365)
  214.                 {                                 
  215.                         if(Is_Leap_Year(temp1))//是閏年
  216.                         {
  217.                                 if(temp>=366)temp-=366;//閏年的秒鐘數
  218.                                 else {temp1++;break;}  
  219.                         }
  220.                         else temp-=365;          //平年
  221.                         temp1++;  
  222.                 }   
  223.                 calendar.w_year=temp1;//得到年份
  224.                 temp1=0;
  225.                 while(temp>=28)//超過了一個月
  226.                 {
  227.                         if(Is_Leap_Year(calendar.w_year)&&temp1==1)//當年是不是閏年/2月份
  228.                         {
  229.                                 if(temp>=29)temp-=29;//閏年的秒鐘數
  230.                                 else break;
  231.                         }
  232.                         else
  233.                         {
  234.                                 if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年
  235.                                 else break;
  236.                         }
  237.                         temp1++;  
  238.                 }
  239. ……………………

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

所有資料51hei提供下載:
8.20 DAC+ADC+定時器+溫度+日期+輸入捕捉+數碼管+按鍵+TFT屏+蜂鳴器.rar (2.31 MB, 下載次數: 291)


評分

參與人數 1黑幣 +30 收起 理由
gvin + 30 絕世好帖!

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2018-8-29 17:10 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

板凳
ID:267330 發表于 2018-9-14 09:03 | 只看該作者
學習學習
回復

使用道具 舉報

地板
ID:393539 發表于 2018-9-14 14:21 | 只看該作者
mark  學習
回復

使用道具 舉報

5#
ID:306028 發表于 2018-9-14 17:37 | 只看該作者
nice, 學習一波
回復

使用道具 舉報

6#
ID:183432 發表于 2018-9-20 15:37 | 只看該作者
不錯不錯
回復

使用道具 舉報

7#
ID:33544 發表于 2018-9-20 16:58 | 只看該作者
不錯不錯學習了
回復

使用道具 舉報

8#
ID:425297 發表于 2019-6-2 15:20 | 只看該作者
膜拜大佬
回復

使用道具 舉報

9#
ID:496408 發表于 2019-6-11 23:38 | 只看該作者
看標題覺得很厲害,下載之后發現沒有protues接線也沒原理圖,確實不知道怎么拿來用,期待大佬補上原理圖或者protues接線圖
回復

使用道具 舉報

10#
ID:261930 發表于 2019-6-12 08:03 | 只看該作者
好帖謝謝分享。
回復

使用道具 舉報

11#
ID:560549 發表于 2019-6-12 08:49 | 只看該作者
mark !
回復

使用道具 舉報

12#
ID:445069 發表于 2019-6-21 10:08 | 只看該作者
好全面的參考代碼。在懂得原理的情況下,可以借鑒。
回復

使用道具 舉報

13#
ID:392473 發表于 2019-6-22 12:59 | 只看該作者
感謝樓主,努力學習中!
回復

使用道具 舉報

14#
ID:473159 發表于 2019-6-24 07:02 | 只看該作者
沒實際意義,網上原子的免費例程就是這些東東,這也是樓主提供不了單一電路圖的原因
回復

使用道具 舉報

15#
ID:489682 發表于 2019-6-24 09:22 | 只看該作者
如樓主真想幫助大家就發完整一些的資料。單片機開發是軟硬件緊密結合的,光有軟件不夠
回復

使用道具 舉報

16#
ID:384522 發表于 2019-8-19 18:47 | 只看該作者
內容不全?
回復

使用道具 舉報

17#
ID:58110 發表于 2020-6-18 08:04 | 只看該作者
這個附件凈坑人
點擊下載,彈出下載提示,等待,沒有下載文件

刷新頁面,依然沒有下載
再點下載,再扣黑B,扣了我N次,結果還沒有下載下來
回復

使用道具 舉報

18#
ID:310120 發表于 2020-6-19 14:45 | 只看該作者
感謝分享,學習了
回復

使用道具 舉報

19#
ID:545054 發表于 2020-6-19 18:01 | 只看該作者
太棒了,謝謝樓主
回復

使用道具 舉報

20#
ID:784555 發表于 2020-6-19 22:44 | 只看該作者
謝謝分享
回復

使用道具 舉報

21#
ID:780228 發表于 2020-6-20 18:37 | 只看該作者
有沒有proteus仿真
回復

使用道具 舉報

22#
ID:147215 發表于 2020-6-21 10:38 | 只看該作者
謝謝分享!,,,,
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久这里只有精品首页 | 欧美性生活视频 | 久久久久久久一区 | 色综合一区二区 | 亚洲精品久 | 自拍视频精品 | 亚洲美女av网站 | 亚洲一区成人 | 国产精品视频偷伦精品视频 | 久久与欧美| 国产不卡在线播放 | 国产成人久久精品一区二区三区 | 色橹橹欧美在线观看视频高清 | 99免费在线观看 | 毛片网在线观看 | 黑人精品xxx一区一二区 | 国产精品自拍视频 | 日韩精品一区在线观看 | 欧美又大粗又爽又黄大片视频 | 欧美精品一区二区三区视频 | 亚洲精品68久久久一区 | 草草草草视频 | 毛片免费在线观看 | 精品国产欧美 | 国产h视频 | 亚洲美女av网站 | 一区二区在线 | 日韩视频中文字幕 | 在线国产视频 | 精品久久香蕉国产线看观看亚洲 | 国产91精品久久久久久久网曝门 | 91国产精品 | 性国产丰满麻豆videosex | 久久精品日产第一区二区三区 | 久久伊人精品 | 欧美成人免费在线视频 | 久久高清精品 | 亚洲国产成人久久综合一区,久久久国产99 | 丝袜美腿一区二区三区 | 久久精品亚洲欧美日韩精品中文字幕 | av中文字幕在线观看 |