基于STM32單片機(jī)的萬年歷設(shè)計畢業(yè)設(shè)計論文_第1頁
基于STM32單片機(jī)的萬年歷設(shè)計畢業(yè)設(shè)計論文_第2頁
基于STM32單片機(jī)的萬年歷設(shè)計畢業(yè)設(shè)計論文_第3頁
基于STM32單片機(jī)的萬年歷設(shè)計畢業(yè)設(shè)計論文_第4頁
基于STM32單片機(jī)的萬年歷設(shè)計畢業(yè)設(shè)計論文_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

PAGE本科生畢業(yè)論文(或設(shè)計)(申請學(xué)士學(xué)位)論文題目基于STM32單片機(jī)的萬年歷設(shè)計作者姓名專業(yè)名稱自動化指導(dǎo)教師2014年5月

目錄摘要 88948872\h1Abstract 11緒論 21.1研究背景及意義 2HYPERLINK\l"_Toc388948877"1.2國內(nèi)外研究現(xiàn)狀 21.3論文主要內(nèi)容 22系統(tǒng)硬件電路設(shè)計 32.1單片機(jī)開發(fā)板的介紹 32.2硬件電路總體結(jié)構(gòu)設(shè)計 42.3硬件電路各單元電路設(shè)計 42.3.1按鍵電路的設(shè)計 PAGEREF_Toc388948883\h42.3.2顯示電路的設(shè)計 53系統(tǒng)軟件設(shè)計 63.1RealViewMDK3.80簡介 886\h63.2軟件總體設(shè)計 63.3TFT-LCD顯示程序設(shè)計 73.4時鐘程序設(shè)計 8HYPERLINK--"); LCD_ShowString(80,226,"::"); TEST_FONTT(); TEST_FONT(); while(1) { u8x3,y3,x4,y4,x5,y5,x6,y6,x7,y7,x8,y8,x9,y9,s,m1,n1,m2,n2,hour; POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色 s=KEY_Scan(); if(s) { switch(s) { case0:RCC_RTCCLKCmd(DISABLE);break; case1: RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE); BKP_WriteBackupRegister(BKP_DR1,0X5A5A); timer.hour=timer.hour+1;if(timer.hour==24) timer.w_date=timer.w_date+1; x9=20*sin(((timer.hour-1)*60+timer.min)*(float)1/2*pi/180)+120; //時針(綠色) y9=110-20*cos(((timer.hour-1)*60+timer.min)*(float)1/2*pi/180); POINT_COLOR=WHITE; LCD_Draw_wide(117,110,124,110,x9,y9); if(timer.hour>=24) timer.hour=0; RTC_Init(); break; case2: RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE); BKP_WriteBackupRegister(BKP_DR1,0X5A5A); timer.min=timer.min+1;POINT_COLOR=WHITE; LCD_Draw_wide(118,110,123,110,x5,y5); if(timer.min>=60) timer.min=0; RTC_Init(); break; case3: RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE); BKP_WriteBackupRegister(BKP_DR1,0X5A5A); if(timer.hour==0) { hour=24; timer.hour=hour-1; } else timer.hour=timer.hour-1; if(timer.hour==23) timer.w_date=timer.w_date-1; m2=20*sin(((timer.hour+1)*60+timer.min)*(float)1/2*pi/180)+120; //時針(綠色) n2=110-20*cos(((timer.hour+1)*60+timer.min)*(float)1/2*pi/180); POINT_COLOR=WHITE; LCD_Draw_wide(117,110,124,110,m2,n2); RTC_Init(); break; case4: RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE); BKP_WriteBackupRegister(BKP_DR1,0X5A5A); if(timer.min==0) { min=60; timer.min=min-1; } else timer.min=timer.min-1; m1=30*sin((timer.min+1)*6*pi/180)+120; //分針(藍(lán)色) n1=110-30*cos((timer.min+1)*6*pi/180); POINT_COLOR=WHITE; LCD_Draw_wide(118,110,123,110,m1,n1); RTC_Init(); break; } } if(t!=timer.sec) { t=timer.sec; LCD_ShowNum(80,190,timer.w_year,4,16); LCD_ShowNum(120,190,timer.w_month,2,16); LCD_ShowNum(144,190,timer.w_date,2,16); switch(timer.week) { case0: LCD_ShowString(80,208,"Sunday"); break; case1: LCD_ShowString(80,208,"Monday"); break; case2: LCD_ShowString(80,208,"Tuesday"); break; case3: LCD_ShowString(80,208,"Wednesday"); break; case4: LCD_ShowString(80,208,"Thursday"); break; case5: LCD_ShowString(80,208,"Friday"); break; case6: LCD_ShowString(80,208,"Saturday"); break; } LCD_ShowNum(80,226,timer.hour,2,16); LCD_ShowNum(104,226,timer.min,2,16); LCD_ShowNum(128,226,timer.sec,2,16); x3=35*sin((timer.sec-1)*6*pi/180)+120; //秒針(深紅) y3=110-35*cos((timer.sec-1)*6*pi/180); x4=35*sin(timer.sec*6*pi/180)+120; y4=110-35*cos(timer.sec*6*pi/180); POINT_COLOR=WHITE; LCD_Draw_wide(119,110,122,80,x3,y3); POINT_COLOR=BRED; LCD_Draw_wide(119,110,122,80,x4,y4); x5=30*sin((timer.min-1)*6*pi/180)+120; //分針(藍(lán)色) y5=110-30*cos((timer.min-1)*6*pi/180); x6=30*sin(timer.min*6*pi/180)+120; y6=110-30*cos(timer.min*6*pi/180); POINT_COLOR=WHITE; LCD_Draw_wide(118,110,123,110,x5,y5); POINT_COLOR=BLUE; LCD_Draw_wide(118,110,123,110,x6,y6); x7=20*sin((timer.hour*60+timer.min-1)*(float)1/2*pi/180)+120; //時針(綠色) y7=110-20*cos((timer.hour*60+timer.min-1)*(float)1/2*pi/180); x8=20*sin((timer.hour*60+timer.min)*(float)1/2*pi/180)+120; y8=110-20*cos((timer.hour*60+timer.min)*(float)1/2*pi/180); POINT_COLOR=WHITE; LCD_Draw_wide(117,110,124,110,x7,y7); POINT_COLOR=GREEN; LCD_Draw_wide(117,110,124,110,x8,y8); } delay_ms(10); };}TFT-LCD顯示程序由于TFT-LCD顯示程序過多,下面僅列出其初始化的部分函數(shù)://初始化lcdvoidLCD_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6; //GPIO_Pin_10 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_All); delay_ms(50);//delay50ms LCD_WriteReg(0x0000,0x0001); delay_ms(50);//delay50ms DeviceCode=LCD_ReadReg(0x0000); if(DeviceCode==0||DeviceCode==0XFFFF)//讀到ID不正確 { //可能是9341,嘗試9341的ID讀取 LCD_WR_REG(0XD3); LCD_RD_DATA(); //dummyread LCD_RD_DATA(); //讀回0X00 DeviceCode=LCD_RD_DATA()&0XBF;//這里讀回0XD3,實際是0X93才對.強(qiáng)制去掉第6位 DeviceCode<<=8; DeviceCode|=LCD_RD_DATA(); } printf("LCDID:%x\r\n",DeviceCode);//打印LCDID if(DeviceCode==0X9341) //9341初始化 { LCD_WR_REG(0xCF); LCD_WR_DATA(0x00); LCD_WR_DATA(0xC1); LCD_WR_DATA(0X30); LCD_WR_REG(0xED); LCD_WR_DATA(0x64); LCD_WR_DATA(0x03); LCD_WR_DATA(0X12); LCD_WR_DATA(0X81); LCD_WR_REG(0xE8); LCD_WR_DATA(0x85); LCD_WR_DATA(0x10); LCD_WR_DATA(0x7A); LCD_WR_REG(0xCB); LCD_WR_DATA(0x39); LCD_WR_DATA(0x2C); LCD_WR_DATA(0x00); LCD_WR_DATA(0x34); LCD_WR_DATA(0x02); LCD_WR_REG(0xF7); LCD_WR_DATA(0x20); LCD_WR_REG(0xEA); LCD_WR_DATA(0x00); LCD_WR_DATA(0x00); LCD_WR_REG(0xC0);//Powercontrol LCD_WR_DATA(0x1B);//VRH[5:0] LCD_WR_REG(0xC1);//Powercontrol LCD_WR_DATA(0x01);//SAP[2:0];BT[3:0] LCD_WR_REG(0xC5);//VCMcontrol LCD_WR_DATA(0x30); //3F LCD_WR_DATA(0x30); //3C LCD_WR_REG(0xC7);//VCMcontrol2 LCD_WR_DATA(0XB7); LCD_WR_REG(0x36);//MemoryAccessControl LCD_WR_DATA(0x48); LCD_WR_REG(0x3A); LCD_WR_DATA(0x55); LCD_WR_REG(0xB1); LCD_WR_DATA(0x00); LCD_WR_DATA(0x1A); LCD_WR_REG(0xB6);//DisplayFunctionControl LCD_WR_DATA(0x0A); LCD_WR_DATA(0xA2); LCD_WR_REG(0xF2);//3GammaFunctionDisable LCD_WR_DATA(0x00); LCD_WR_REG(0x26);//Gammacurveselected LCD_WR_DATA(0x01); LCD_WR_REG(0xE0);//SetGamma LCD_WR_DATA(0x0F); LCD_WR_DATA(0x2A); LCD_WR_DATA(0x28); LCD_WR_DATA(0x08); LCD_WR_DATA(0x0E); LCD_WR_DATA(0x08); LCD_WR_DATA(0x54); LCD_WR_DATA(0XA9); LCD_WR_DATA(0x43); LCD_WR_DATA(0x0A); LCD_WR_DATA(0x0F); LCD_WR_DATA(0x00); LCD_WR_DATA(0x00); LCD_WR_DATA(0x00); LCD_WR_DATA(0x00); LCD_WR_REG(0XE1);//SetGamma LCD_WR_DATA(0x00); LCD_WR_DATA(0x15); LCD_WR_DATA(0x17); LCD_WR_DATA(0x07); LCD_WR_DATA(0x11); LCD_WR_DATA(0x06); LCD_WR_DATA(0x2B); LCD_WR_DATA(0x56); LCD_WR_DATA(0x3C); LCD_WR_DATA(0x05); LCD_WR_DATA(0x10); LCD_WR_DATA(0x0F); LCD_WR_DATA(0x3F); LCD_WR_DATA(0x3F); LCD_WR_DATA(0x0F); LCD_WR_REG(0x2B); LCD_WR_DATA(0x00); LCD_WR_DATA(0x00); LCD_WR_DATA(0x01); LCD_WR_DATA(0x3f); LCD_WR_REG(0x2A); LCD_WR_DATA(0x00); LCD_WR_DATA(0x00); LCD_WR_DATA(0x00); LCD_WR_DATA(0xef); LCD_WR_REG(0x11);//ExitSleep delay_ms(120); LCD_WR_REG(0x29);//displayon } LCD_Scan_Dir(DFT_SCAN_DIR); LCD_LED=1;//點亮背光 LCD_Clear(WHITE);}時鐘程序配置時鐘的部分程序如下:#include"sys.h"#include"rtc.h"#include"delay.h"#include"usart.h"#include"key.h"tmtimer;//時鐘結(jié)構(gòu)體 //實時時鐘配置//初始化RTC時鐘,同時檢測時鐘是否工作正常//BKP->DR1用于保存是否第一次配置的設(shè)置//返回0:正常//其他:錯誤代碼voidRTC_NVIC_Config(void){ NVIC_InitTypeDefNVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel=RTC_IRQn; //RTC全局中斷 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; //先占優(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寄存器}u8RTC_Init(void) { //檢查是不是第一次配置時鐘 u8temp=0; RTC_NVIC_Config(); //if(BKP->DR1!=0X5050)//第一次配置 if((BKP_ReadBackupRegister(BKP_DR1)!=0x5050)) //從指定的后備寄存器中讀出數(shù)據(jù):讀出了與寫入的指定數(shù)據(jù)不相乎 { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE); //使能PWR和BKP外設(shè)時鐘 PWR_BackupAccessCmd(ENABLE); //使能RTC和后備寄存器訪問 BKP_DeInit(); //將外設(shè)BKP的全部寄存器重設(shè)為缺省值 RCC_LSEConfig(RCC_LSE_ON); //設(shè)置外部低速晶振(LSE),使用外設(shè)低速晶振 while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET) //檢查指定的RCC標(biāo)志位設(shè)置與否,等待低速晶振就緒 { temp++; delay_ms(10); } if(temp>=250)return1;//初始化時鐘失敗,晶振有問題 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //設(shè)置RTC時鐘(RTCCLK),選擇LSE作為RTC時鐘 RCC_RTCCLKCmd(ENABLE); //使能RTC時鐘 RTC_WaitForSynchro(); //等待最近一次對RTC寄存器的寫操作完成 RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成 RTC_ITConfig(RTC_IT_SEC,ENABLE); //使能RTC秒中斷 RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成 RTC_SetPrescaler(32767);//設(shè)置RTC預(yù)分頻的值 RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成 RTC_Set(timer.w_year,timer.w_month,timer.w_date,timer.hour,timer.min,timer.sec);//設(shè)置時間 BKP_WriteBackupRegister(BKP_DR1,0X5050); //向指定的后備寄存器中寫入用戶程序數(shù)據(jù) } else//系統(tǒng)繼續(xù)計時 { RTC_WaitForSynchro(); //等待最近一次對RTC寄存器的寫操作完成 RTC_ITConfig(RTC_IT_SEC,ENABLE); //使能RTC秒中斷 RTC_WaitForLastTask(); //等待最近一次對RTC寄存器的寫操作完成 } RTC_Get();//更新時間 RCC_ClearFlag(); //清除RCC的復(fù)位標(biāo)志位 return0;//ok }//RTC中斷服務(wù)函數(shù)voidRTC_IRQHandler(void){ if(RTC->CRL&0x0001)//秒鐘中斷 { RTC_Get();//更新時間 } if(RTC->CRL&0x0002)//鬧鐘中斷 { RTC->CRL&=~(0x0002);//清鬧鐘中斷 //鬧鐘處理 } RTC->CRL&=0X0FFA;//清除溢出,秒鐘中斷標(biāo)志 while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成 }//判斷是否是閏年函數(shù)//月份123456789101112//閏年312931303130313130313031//非閏年312831303130313130313031/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論