久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
STM32單片機(jī)程序:溫度、萬年歷、PWM、輸入捕捉高電平、ADC、DAC、EEPROM、IIC
[打印本頁]
作者:
handily
時間:
2018-8-29 09:47
標(biāo)題:
STM32單片機(jī)程序:溫度、萬年歷、PWM、輸入捕捉高電平、ADC、DAC、EEPROM、IIC
STM32單片機(jī)程序:溫度、萬年歷、PWM、輸入捕捉高電平、ADC、DAC、EEPROM、IIC
0.png
(40.23 KB, 下載次數(shù): 59)
下載附件
2018-8-29 17:09 上傳
單片機(jī)源程序如下:
#include "SysTick.h"
#include "public.h"
_calendar calendar;//時鐘結(jié)構(gòu)體
static void RTC_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優(yōu)先級1位,從優(yōu)先級3位
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //先占優(yōu)先級0位,從優(yōu)先級4位
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能該通道中斷
NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器
}
/*******************************************************************************
* 函 數(shù) 名 : RTC_Init
* 函數(shù)功能 : RTC初始化
* 輸 入 : 無
* 輸 出 : 0,初始化成功
1,LSE開啟失敗
*******************************************************************************/
u8 RTC_Init(void)
{
//檢查是不是第一次配置時鐘
u8 temp=0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外設(shè)時鐘
PWR_BackupAccessCmd(ENABLE); //使能后備寄存器訪問
if (BKP_ReadBackupRegister(BKP_DR1) != 0xA0A0) //從指定的后備寄存器中讀出數(shù)據(jù):讀出了與寫入的指定數(shù)據(jù)不相乎
{
//????RTC
//RTC_Configuration();
BKP_DeInit(); //復(fù)位備份區(qū)域
RCC_LSEConfig(RCC_LSE_ON); //設(shè)置外部低速晶振(LSE),使用外設(shè)低速晶振
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250) //檢查指定的RCC標(biāo)志位設(shè)置與否,等待低速晶振就緒
{
temp++;
delay_ms(10);
}
if(temp>=250)return 1;//初始化時鐘失敗,晶振有問題
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //設(shè)置RTC時鐘(RTCCLK),選擇LSE作為RTC時鐘
RCC_RTCCLKCmd(ENABLE); //使能RTC時鐘
RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中斷
RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成
RTC_EnterConfigMode();// 允許配置
RTC_SetPrescaler(32767); //設(shè)置RTC預(yù)分頻的值
RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成
RTC_Set(2018,8,20,14,39,55); //設(shè)置時間
RTC_ExitConfigMode(); //退出配置模式
BKP_WriteBackupRegister(BKP_DR1, 0XA0A0); //向指定的后備寄存器中寫入用戶程序數(shù)據(jù)
}
else//系統(tǒng)繼續(xù)計(jì)時
{
RTC_WaitForSynchro(); //等待最近一次對RTC寄存器的寫操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中斷
RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成
}
RTC_NVIC_Config();//RCT中斷分組設(shè)置
RTC_Get();//更新時間
return 0; //ok
}
//RTC時鐘中斷
//每秒觸發(fā)一次
//extern u16 tcnt;
int jishu;
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒鐘中斷
{
RTC_Get();//更新時間
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);//輸出鬧鈴時間
LCD_ShowFontHZ(82,270,"日期");
LCD_ShowxNum(0,300,calendar.w_year,2,24,0);
LCD_ShowString(24,300,tftlcd_data.width,tftlcd_data.height,24,"-");
LCD_ShowxNum(36,300,calendar.w_month,2,24,0);
LCD_ShowString(60,300,tftlcd_data.width,tftlcd_data.height,24,"-");
LCD_ShowxNum(72,300,calendar.w_date,2,24,0);
//小時
LCD_ShowxNum(146,300,calendar.hour,2,24,0);
LCD_ShowString(170,300,tftlcd_data.width,tftlcd_data.height,24,":");
LCD_ShowxNum(182,300,calendar.min,2,24,0);
LCD_ShowString(206,300,tftlcd_data.width,tftlcd_data.height,24,":");
LCD_ShowxNum(218,300,calendar.sec,2,24,0);
//星期
LCD_ShowFontHZ(70,340,"星期");
LCD_ShowNum(135,343,calendar.week,2,24);
//原定時器1s計(jì)數(shù)
jishu++;
LCD_ShowxNum(110,120,jishu,5,24,0);
LCD_ShowString(50,120,tftlcd_data.width,tftlcd_data.height,24,"time:");
LCD_ShowString(180,120,tftlcd_data.width,tftlcd_data.height,24,"s");
}
if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//鬧鐘中斷
{
RTC_ClearITPendingBit(RTC_IT_ALR); //清鬧鐘中斷
RTC_Get(); //更新時間
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);//輸出鬧鈴時間
}
RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); //清鬧鐘中斷
RTC_WaitForLastTask();
}
//判斷是否是閏年函數(shù)
//月份 1 2 3 4 5 6 7 8 9 10 11 12
//閏年 31 29 31 30 31 30 31 31 30 31 30 31
//非閏年 31 28 31 30 31 30 31 31 30 31 30 31
//輸入:年份
//輸出:該年份是不是閏年.1,是.0,不是
u8 Is_Leap_Year(u16 year)
{
if(year%4==0) //必須能被4整除
{
if(year%100==0)
{
if(year%400==0)return 1;//如果以00結(jié)尾,還要能被400整除
else return 0;
}else return 1;
}else return 0;
}
//月份數(shù)據(jù)表
u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數(shù)據(jù)表
//平年的月份日期表
const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
/*******************************************************************************
* 函 數(shù) 名 : RTC_Set
* 函數(shù)功能 : RTC設(shè)置日期時間函數(shù)(以1970年1月1日為基準(zhǔn),把輸入的時鐘轉(zhuǎn)換為秒鐘)
1970~2099年為合法年份
* 輸 入 : syear:年 smon:月 sday:日
hour:時 min:分 sec:秒
* 輸 出 : 0,成功
1,失敗
*******************************************************************************/
u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
u16 t;
u32 seccount=0;
if(syear<1970||syear>2099)return 1;
for(t=1970;t<syear;t++) //把所有年份的秒鐘相加
{
if(Is_Leap_Year(t)) seccount+=31622400;//閏年的秒鐘數(shù)
else seccount+=31536000; //平年的秒鐘數(shù)
}
smon-=1;
for(t=0;t<smon;t++) //把前面月份的秒鐘數(shù)相加
{
seccount+=(u32)mon_table[t]*86400;//月份秒鐘數(shù)相加
if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//閏年2月份增加一天的秒鐘數(shù)
}
seccount+=(u32)(sday-1)*86400;//把前面日期的秒鐘數(shù)相加
seccount+=(u32)hour*3600;//小時秒鐘數(shù)
seccount+=(u32)min*60; //分鐘秒鐘數(shù)
seccount+=sec;//最后的秒鐘加上去
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外設(shè)時鐘
PWR_BackupAccessCmd(ENABLE); //使能RTC和后備寄存器訪問
RTC_SetCounter(seccount); //設(shè)置RTC計(jì)數(shù)器的值
RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成
return 0;
}
//初始化鬧鐘
//以1970年1月1日為基準(zhǔn)
//1970~2099年為合法年份
//syear,smon,sday,hour,min,sec:鬧鐘的年月日時分秒
//返回值:0,成功;其他:錯誤代碼.
u8 RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
u16 t;
u32 seccount=0;
if(syear<1970||syear>2099)return 1;
for(t=1970;t<syear;t++) //把所有年份的秒鐘相加
{
if(Is_Leap_Year(t))seccount+=31622400;//閏年的秒鐘數(shù)
else seccount+=31536000; //平年的秒鐘數(shù)
}
smon-=1;
for(t=0;t<smon;t++) //把前面月份的秒鐘數(shù)相加
{
seccount+=(u32)mon_table[t]*86400;//月份秒鐘數(shù)相加
if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//閏年2月份增加一天的秒鐘數(shù)
}
seccount+=(u32)(sday-1)*86400;//把前面日期的秒鐘數(shù)相加
seccount+=(u32)hour*3600;//小時秒鐘數(shù)
seccount+=(u32)min*60; //分鐘秒鐘數(shù)
seccount+=sec;//最后的秒鐘加上去
//設(shè)置時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外設(shè)時鐘
PWR_BackupAccessCmd(ENABLE); //使能后備寄存器訪問
//上面三步是必須的!
RTC_SetAlarm(seccount);
RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成
return 0;
}
//得到當(dāng)前的時間
//返回值:0,成功;其他:錯誤代碼.
u8 RTC_Get(void)
{
static u16 daycnt=0;
u32 timecount=0;
u32 temp=0;
u16 temp1=0;
timecount=RTC_GetCounter(); //得到計(jì)數(shù)器中的秒鐘值
temp=timecount/86400; //得到天數(shù)(秒鐘數(shù)對應(yīng)的)一天86400s
if(daycnt!=temp)//超過一天了
{
daycnt=temp;
temp1=1970; //從1970年開始
while(temp>=365)
{
if(Is_Leap_Year(temp1))//是閏年
{
if(temp>=366)temp-=366;//閏年的秒鐘數(shù)
else {temp1++;break;}
}
else temp-=365; //平年
temp1++;
}
calendar.w_year=temp1;//得到年份
temp1=0;
while(temp>=28)//超過了一個月
{
if(Is_Leap_Year(calendar.w_year)&&temp1==1)//當(dāng)年是不是閏年/2月份
{
if(temp>=29)temp-=29;//閏年的秒鐘數(shù)
else break;
}
else
{
if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年
else break;
}
temp1++;
}
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
8.20 DAC+ADC+定時器+溫度+日期+輸入捕捉+數(shù)碼管+按鍵+TFT屏+蜂鳴器.rar
(2.31 MB, 下載次數(shù): 291)
2018-8-29 17:09 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2018-8-29 17:10
補(bǔ)全原理圖或者詳細(xì)說明一下電路連接即可獲得100+黑幣
作者:
jiangkeqin_sy
時間:
2018-9-14 09:03
學(xué)習(xí)學(xué)習(xí)
作者:
niqingqing
時間:
2018-9-14 14:21
mark 學(xué)習(xí)
作者:
13622983180
時間:
2018-9-14 17:37
nice, 學(xué)習(xí)一波
作者:
騎豬購物
時間:
2018-9-20 15:37
不錯不錯
作者:
wis98
時間:
2018-9-20 16:58
不錯不錯學(xué)習(xí)了
作者:
gvin
時間:
2019-6-2 15:20
膜拜大佬
作者:
justablackcat
時間:
2019-6-11 23:38
看標(biāo)題覺得很厲害,下載之后發(fā)現(xiàn)沒有protues接線也沒原理圖,確實(shí)不知道怎么拿來用,期待大佬補(bǔ)上原理圖或者protues接線圖
作者:
ccf_1989
時間:
2019-6-12 08:03
好帖謝謝分享。
作者:
lczs
時間:
2019-6-12 08:49
mark !
作者:
ontheroad
時間:
2019-6-21 10:08
好全面的參考代碼。在懂得原理的情況下,可以借鑒。
作者:
zgqmzx
時間:
2019-6-22 12:59
感謝樓主,努力學(xué)習(xí)中!
作者:
yoxi
時間:
2019-6-24 07:02
沒實(shí)際意義,網(wǎng)上原子的免費(fèi)例程就是這些東東,這也是樓主提供不了單一電路圖的原因
作者:
hello_51hei
時間:
2019-6-24 09:22
如樓主真想幫助大家就發(fā)完整一些的資料。單片機(jī)開發(fā)是軟硬件緊密結(jié)合的,光有軟件不夠
作者:
H823603932
時間:
2019-8-19 18:47
內(nèi)容不全?
作者:
lyMarvin
時間:
2020-6-18 08:04
這個附件凈坑人
點(diǎn)擊下載,彈出下載提示,等待,沒有下載文件
刷新頁面,依然沒有下載
再點(diǎn)下載,再扣黑B,扣了我N次,結(jié)果還沒有下載下來
作者:
nimisi
時間:
2020-6-19 14:45
感謝分享,學(xué)習(xí)了
作者:
妖精的尾號
時間:
2020-6-19 18:01
太棒了,謝謝樓主
作者:
suying.
時間:
2020-6-19 22:44
謝謝分享
作者:
zhuzhuzhuqi
時間:
2020-6-20 18:37
有沒有proteus仿真
作者:
onepcb
時間:
2020-6-21 10:38
謝謝分享!,,,,
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品区一区二区三区
|
超碰在线久
|
中文字幕av一区二区三区
|
激情亚洲
|
久久亚洲国产精品
|
欧美精品一区二区三区蜜桃视频
|
91在线最新
|
国内精品久久久久久久
|
久久不射电影网
|
日韩三级视频
|
一区二区三区视频在线观看
|
欧美一二精品
|
亚洲欧美另类在线
|
久久久精品综合
|
国产日韩一区二区三免费高清
|
天天天操操操
|
中文字幕动漫成人
|
91看片免费版
|
国产1页
|
国产精品久久久久久久久久久久久
|
国户精品久久久久久久久久久不卡
|
欧美视频第二页
|
欧美国产精品一区二区三区
|
日韩一区欧美一区
|
一区视频在线
|
亚洲一区
|
国产精品一区二区在线观看
|
国产欧美精品一区二区三区
|
亚洲国产一区二区三区
|
久久婷婷色
|
欧美在线a
|
av影音资源
|
日韩福利电影
|
欧美日韩大片
|
欧美精品一区二区免费
|
黄色网址免费在线观看
|
91免费入口
|
久久99久久99精品免视看婷婷
|
国产成人精品一区二区三区四区
|
一区二区三区免费在线观看
|
一区二区在线
|