版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
附錄2程序主函數(shù):#include"struct_all.h"#include"delay.h"#include"sys.h"#include"usart.h"#include"My_Demo.h"u8mode=0;u8status=1;shorttemp;shorttemp_l=30,temp_h=40;unsignedcharTime_arry[7];unsignedcharTime_arry_o[3]={0,30,10};unsignedcharTime_arry_c[3]={0,40,10};unsignedcharMenu_Count=0;voidKey_Process_Demo(unsignedcharKey_value){ if(Key_value==1||ir_num==1) //設置鍵 { ir_num=0; Menu_Count++; if(Menu_Count>=15) { LCD_Wstr(1,0,"年月日"); LCD_Wstr(2,0,"時分秒"); LCD_Wstr(3,0,"溫度:"); LCD_Wstr(4,0,"檔位:"); //處理返回界面 Menu_Count=0; } switch(Menu_Count) { case1: LCD_Wstr(1,0,"溫度上限:<"); LCD_Wstr(2,0,"溫度下限"); LCD_Wstr(3,0,""); LCD_Wstr(4,0,""); LCD_Setpos_Dispnum(1,5,temp_h); LCD_Setpos_Dispnum(2,5,temp_l); break; case2: LCD_Wstr(1,7,""); LCD_Wstr(2,7,"<"); break; case3: LCD_Wstr(1,0,"年:月:"); LCD_Wstr(2,0,"日:時:"); LCD_Wstr(3,0,"分:秒:"); LCD_Wstr(4,0,""); LCD_Setpos_two_Dispnum(1,2,Time_arry[5]); LCD_Setpos_two_Dispnum(1,6,Time_arry[4]); LCD_Setpos_two_Dispnum(2,2,Time_arry[3]); LCD_Setpos_two_Dispnum(2,6,Time_arry[2]); LCD_Setpos_two_Dispnum(3,2,Time_arry[1]); LCD_Setpos_two_Dispnum(3,6,Time_arry[0]);LCD_Wstr(1,3,"<"); break; case4: LCD_Wstr(1,3,"");LCD_Wstr(1,7,"<"); break; case5: LCD_Wstr(1,7,"");LCD_Wstr(2,3,"<"); break; case6: LCD_Wstr(2,3,"");LCD_Wstr(2,7,"<"); break; case7: LCD_Wstr(2,7,"");LCD_Wstr(3,3,"<"); break; case8: LCD_Wstr(3,3,"");LCD_Wstr(3,7,"<"); break; case9: LCD_Wstr(1,0,"定時開"); LCD_Wstr(2,0,"時:"); LCD_Wstr(3,0,"分:"); LCD_Wstr(4,0,"秒:"); LCD_Setpos_two_Dispnum(2,2,Time_arry_o[2]); LCD_Setpos_two_Dispnum(3,2,Time_arry_o[1]); LCD_Setpos_two_Dispnum(4,2,Time_arry_o[0]); LCD_Wstr(2,7,"<"); break; case10: LCD_Wstr(2,7,""); LCD_Wstr(3,7,"<"); break; case11: LCD_Wstr(3,7,""); LCD_Wstr(4,7,"<"); break; case12: LCD_Wstr(1,0,"定時關"); LCD_Wstr(2,0,"時:"); LCD_Wstr(3,0,"分:"); LCD_Wstr(4,0,"秒:"); LCD_Setpos_two_Dispnum(2,2,Time_arry_c[2]); LCD_Setpos_two_Dispnum(3,2,Time_arry_c[1]); LCD_Setpos_two_Dispnum(4,2,Time_arry_c[0]); LCD_Wstr(2,7,"<"); break; case13: LCD_Wstr(2,7,""); LCD_Wstr(3,7,"<"); break; case14: LCD_Wstr(3,7,""); LCD_Wstr(4,7,"<"); break; } } if(Key_value==2||ir_num==2) { ir_num=0; switch(Menu_Count) { case0: status=(status==1)?0:1; break; case1: if(temp_h<99) temp_h++; LCD_Setpos_Dispnum(1,5,temp_h); break; case2: if(temp_l<temp_h) temp_l++; LCD_Setpos_Dispnum(2,5,temp_l); break; case3: if(Time_arry[5]<99) Time_arry[5]++; Ds1302_Save_Demo(ds1302_year_add,Time_arry[5]); LCD_Setpos_Dispnum(1,2,Time_arry[5]); break; case4: if(Time_arry[4]<12) Time_arry[4]++; Ds1302_Save_Demo(ds1302_month_add,Time_arry[4]); LCD_Setpos_Dispnum(1,6,Time_arry[4]); break; case5: if(Time_arry[3]<31) Time_arry[3]++; Ds1302_Save_Demo(ds1302_date_add,Time_arry[3]); LCD_Setpos_Dispnum(2,2,Time_arry[3]); break; case6: if(Time_arry[2]<24) Time_arry[2]++; Ds1302_Save_Demo(ds1302_hr_add,Time_arry[2]); LCD_Setpos_Dispnum(2,6,Time_arry[2]); break; case7: if(Time_arry[1]<60) Time_arry[1]++; Ds1302_Save_Demo(ds1302_min_add,Time_arry[1]); LCD_Setpos_Dispnum(3,2,Time_arry[1]); break; case8: if(Time_arry[0]<60) Time_arry[0]++; Ds1302_Save_Demo(ds1302_sec_add,Time_arry[0]); LCD_Setpos_Dispnum(3,6,Time_arry[0]); break; case9: if(Time_arry_o[2]<24) Time_arry_o[2]++; LCD_Setpos_Dispnum(2,2,Time_arry_o[2]); break; case10: if(Time_arry_o[1]<60) Time_arry_o[1]++; LCD_Setpos_Dispnum(3,2,Time_arry_o[1]); break; case11: if(Time_arry_o[0]<60) Time_arry_o[0]++; LCD_Setpos_Dispnum(4,2,Time_arry_o[0]); break; case12: if(Time_arry_c[2]<24) Time_arry_c[2]++; LCD_Setpos_Dispnum(2,2,Time_arry_c[2]); break; case13: if(Time_arry_c[1]<60) Time_arry_c[1]++; LCD_Setpos_Dispnum(3,2,Time_arry_c[1]); break; case14: if(Time_arry_c[0]<60) Time_arry_c[0]++; LCD_Setpos_Dispnum(4,2,Time_arry_c[0]); break; } } if(Key_value==3||ir_num==3) { ir_num=0; switch(Menu_Count) { case0: if(++mode>2) mode=0; break; case1: if(temp_h>temp_l) temp_h--; LCD_Setpos_Dispnum(1,5,temp_h); break; case2: if(temp_l>0) temp_l--; LCD_Setpos_Dispnum(2,5,temp_l); break; case3: if(Time_arry[5]>0) Time_arry[5]--; Ds1302_Save_Demo(ds1302_year_add,Time_arry[5]); LCD_Setpos_Dispnum(1,2,Time_arry[5]); break; case4: if(Time_arry[4]>0) Time_arry[4]--; Ds1302_Save_Demo(ds1302_month_add,Time_arry[4]); LCD_Setpos_Dispnum(1,6,Time_arry[4]); break; case5: if(Time_arry[3]>0) Time_arry[3]--; Ds1302_Save_Demo(ds1302_date_add,Time_arry[3]); LCD_Setpos_Dispnum(2,2,Time_arry[3]); break; case6: if(Time_arry[2]>0) Time_arry[2]--; Ds1302_Save_Demo(ds1302_hr_add,Time_arry[2]); LCD_Setpos_Dispnum(2,6,Time_arry[2]); break; case7: if(Time_arry[1]>0) Time_arry[1]--; Ds1302_Save_Demo(ds1302_min_add,Time_arry[1]); LCD_Setpos_Dispnum(3,2,Time_arry[1]); break; case8: if(Time_arry[0]>0) Time_arry[0]--; Ds1302_Save_Demo(ds1302_sec_add,Time_arry[0]); LCD_Setpos_Dispnum(3,6,Time_arry[0]); break; case9: if(Time_arry_o[2]>0) Time_arry_o[2]--; LCD_Setpos_Dispnum(2,2,Time_arry_o[2]); break; case10: if(Time_arry_o[1]>0) Time_arry_o[1]--; LCD_Setpos_Dispnum(3,2,Time_arry_o[1]); break; case11: if(Time_arry_o[0]>0) Time_arry_o[0]--; LCD_Setpos_Dispnum(4,2,Time_arry_o[0]); break; case12: if(Time_arry_c[2]>0) Time_arry_c[2]--; LCD_Setpos_Dispnum(2,2,Time_arry_c[2]); break; case13: if(Time_arry_c[1]>0) Time_arry_c[1]--; LCD_Setpos_Dispnum(3,2,Time_arry_c[1]); break; case14: if(Time_arry_c[0]>0) Time_arry_c[0]--; LCD_Setpos_Dispnum(4,2,Time_arry_c[0]); break; } } }intmain(void){delay_init(); //延時函數(shù)初始化NVIC_Configuration(); //不可缺?PA13/14/15&PB3/4默認配置為JTAG功能,需要把JTAG關掉 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); delay_ms(500); Hwjs_Init();// TIM3_PWM_Init_Demo(1000,7199);//72000000/7200=10000HZ LCD_Init(); DS18B20_Init_Demo();DS1302_Init_Demo(); KEY_Init_Demo();LCD_Wstr(1,0,"年月日");LCD_Wstr(2,0,"時分秒"); LCD_Wstr(3,0,"溫度:"); LCD_Wstr(4,0,"檔位:");while(1){ Key_value_Demo(Key_Process_Demo); if(Menu_Count==0) { Ds1302_Read_Time_Demo(Time_arry); LCD_Setpos_two_Dispnum(1,0,Time_arry[5]); LCD_Setpos_two_Dispnum(1,2,Time_arry[4]); LCD_Setpos_two_Dispnum(1,4,Time_arry[3]); LCD_Setpos_two_Dispnum(2,0,Time_arry[2]); LCD_Setpos_two_Dispnum(2,2,Time_arry[1]); LCD_Setpos_two_Dispnum(2,4,Time_arry[0]); temp=DS18B20_Get_Temp_Demo(); LCD_Setpos_Dispnum(3,3,temp); LCD_Setpos_Dispnum(4,3,mode); switch(mode) { case0: TIM_SetCompare2(TIM3,0); break; case1: TIM_SetCompare2(TIM3,500); break; case2: TIM_SetCompare2(TIM3,1000); break; } if(status==1) { LCD_Wstr(4,6,"自動"); if(temp<temp_l) {mode=0;}elseif(temp>=temp_l&&temp<temp_h) {mode=1;}elseif(temp>temp_h) {mode=2;}else {mode=0;} }else {LCD_Wstr(4,6,"手動");} if(Time_arry[2]==Time_arry_o[2]&&Time_arry[1]==Time_arry_o[1]&&Time_arry[0]==Time_arry_o[0]) {status=1;} if(Time_arry[2]==Time_arry_c[2]&&Time_arry[1]==Time_arry_c[1]&&Time_arry[0]==Time_arry_c[0]) {status=0; mode=0;} }delay_ms(100);}}/******stm32c8t6*********文件:delay.c**********/#include"delay.h"#include"sys.h"#ifSYSTEM_SUPPORT_UCOS#include"includes.h" //ucos使用 #endifstaticu8fac_us=0;//us延時倍乘數(shù)staticu16fac_ms=0;//ms延時倍乘數(shù)#ifdefOS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定義了,說明使用ucosII了.//systick中斷服務函數(shù),使用ucos時用到voidSysTick_Handler(void){ OSIntEnter(); //進入中斷OSTimeTick();//調用ucos的時鐘服務程序OSIntExit();//觸發(fā)任務切換軟中斷}#endif//初始化延遲函數(shù)voiddelay_init() {#ifdefOS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定義了,說明使用ucosII了. u32reload;#endif SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇外部時鐘HCLK/8 fac_us=SystemCoreClock/8000000; //為系統(tǒng)時鐘的1/8#ifdefOS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定義了,說明使用ucosII了. reload=SystemCoreClock/8000000; //每秒鐘的計數(shù)次數(shù)單位為K reload*=1000000/OS_TICKS_PER_SEC;//根據(jù)OS_TICKS_PER_SEC設定溢出時間 //reload為24位寄存器,最大值:16777216,在72M下,約合1.86s左右 fac_ms=1000/OS_TICKS_PER_SEC;//代表ucos可以延時的最少單位 SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //開啟SYSTICK中斷 SysTick->LOAD=reload; //每1/OS_TICKS_PER_SEC秒中斷一次 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //開啟SYSTICK#else fac_ms=(u16)fac_us*1000;//非ucos下,代表每個ms需要的systick時鐘數(shù)#endif} #ifdefOS_CRITICAL_METHOD //使用了ucos//延時nus//nus為要延時的us數(shù). voiddelay_us(u32nus){ u32ticks; u32told,tnow,tcnt=0; u32reload=SysTick->LOAD; //LOAD的值 ticks=nus*fac_us; //需要的節(jié)拍數(shù) tcnt=0; told=SysTick->VAL;//剛進入時的計數(shù)器值 while(1) { tnow=SysTick->VAL; if(tnow!=told) { if(tnow<told)tcnt+=told-tnow;//SYSTICK是一個遞減的計數(shù)器就可以了. elsetcnt+=reload-tnow+told; told=tnow; if(tcnt>=ticks)break;//時間超過/等于要延遲的時間,則退出. } }; }//延時nms//nms:要延時的ms數(shù)voiddelay_ms(u16nms){ if(OSRunning==TRUE)//如果os已經在跑了 { if(nms>=fac_ms)//延時的時間大于ucos的最少時間周期 { OSTimeDly(nms/fac_ms);//ucos延時 } nms%=fac_ms; //ucos已經無法提供這么小的延時了,采用普通方式延時 } delay_us((u32)(nms*1000)); //普通方式延時,此時ucos無法啟動調度.}#else//不用ucos時//延時nus//nus為要延時的us數(shù). voiddelay_us(u32nus){ u32temp; SysTick->LOAD=nus*fac_us;//時間加載 SysTick->VAL=0x00;//清空計數(shù)器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//開始倒數(shù) do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待時間到達 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//關閉計數(shù)器 SysTick->VAL=0X00;//清空計數(shù)器 }//延時nmsvoiddelay_ms(u16nms){ u32temp; SysTick->LOAD=(u32)nms*fac_ms;//時間加載(SysTick->LOAD為24bit) SysTick->VAL=0x00;//清空計數(shù)器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//開始倒數(shù) do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待時間到達 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//關閉計數(shù)器 SysTick->VAL=0X00;//清空計數(shù)器 }#endif/******stm32c8t6*********文件:sys.c**********************/#include"sys.h"voidNVIC_Configuration(void){NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級}/******stm32c8t6*********文件:My_Demo.c**********************/#include"My_Demo.h"#include"My_Config.h"#ifCONFIG_KEY==ENABLEDvoidKey_value_Demo(pKey_Processkey_Process) //獨立按鍵程序{ unsignedcharKey_value;#ifKEY_COUNT==1 if(Demo_KEY1==0) { delay_ms(5);//去抖動 if(Demo_KEY1==0) { Key_value=1; while(!Demo_KEY1); } } #endif #ifKEY_COUNT==2 if((Demo_KEY1==0)||(Demo_KEY2==0)) { delay_ms(5);//去抖動 if(Demo_KEY1==0) {Key_value=1; while(!Demo_KEY1);} if(Demo_KEY2==0) {Key_value=2;while(!Demo_KEY2);} } #endif #ifKEY_COUNT==3 if((Demo_KEY1==0)||(Demo_KEY2==0)||(Demo_KEY3==0)) { delay_ms(5);//去抖動 if(Demo_KEY1==0) {Key_value=1;while(!Demo_KEY1);} if(Demo_KEY2==0) {Key_value=2; while(!Demo_KEY2);} if(Demo_KEY3==0) {Key_value=3; while(!Demo_KEY3);} } #endif else Key_value=21; key_Process(Key_value);}voidKEY_Init_Demo(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA,PORTC時鐘 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//關閉jtag,使能SWD,可以用SWD模式調試#ifKEY_COUNT==1 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;//PA15 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//設置成上拉輸入 GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOA15 #endif#ifKEY_COUNT==2 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13;//PA15 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//設置成上拉輸入 GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOA15 #endif#ifKEY_COUNT==3 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;//PA15 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//設置成上拉輸入 GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOA15 #endif }#ifCONFIG_TIMER3_PWN==ENABLEDvoidTIM3_PWM_Init_Demo(u16arr,u16psc){ GPIO_InitTypeDefGPIO_InitStructure; TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_OCInitTypeDefTIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定時器3時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIO//初始化TIM3 TIM_TimeBaseStructure.TIM_Period=arr; TIM_TimeBaseStructure.TIM_Prescaler=psc; TIM_TimeBaseStructure.TIM_ClockDivision=0; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化TIM3Channel2PWM模式 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//超過對比的部分為低電平0,持續(xù)為低電平 TIM_OC2Init(TIM3,&TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); TIM_Cmd(TIM3,ENABLE);}/**DEMO//0為最亮,899為最暗TIM3_PWM_Init_Demo(899,0);//0~900,bufenpingTIM_SetCompare2(TIM3,100);#endif#ifCONFIG_DS18b02==ENABLED//復位DS18B20voidDS18B20_Rst_Demo(void) { DS18B20_IO_OUT();//SETPA0OUTPUTDS18B20_DQ_OUT=0;//拉低DQdelay_us(750);//拉低750usDS18B20_DQ_OUT=1;//DQ=1 delay_us(15);//15US}//等待DS18B20的回應//返回1:未檢測到DS18B20的存在//返回0:存在u8DS18B20_Check_Demo(void) { u8retry=0; DS18B20_IO_IN();//SETPA0INPUT while(DS18B20_DQ_IN&&retry<200) {retry++; delay_us(1);}; if(retry>=200)return1; elseretry=0;while(!DS18B20_DQ_IN&&retry<240) {retry++; delay_us(1);}; if(retry>=240)return1; return0;}//從DS18B20讀取一個位//返回值:1/0u8DS18B20_Read_Bit_Demo(void) //readonebit{u8data; DS18B20_IO_OUT();//SETPA0OUTPUTDS18B20_DQ_OUT=0; delay_us(2);DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SETPA0INPUT delay_us(12); if(DS18B20_DQ_IN)data=1;elsedata=0; delay_us(50);returndata;}//從DS18B20讀取一個字節(jié)//返回值:讀到的數(shù)據(jù)u8DS18B20_Read_Byte_Demo(void)//readonebyte{u8i,j,dat;dat=0; for(i=1;i<=8;i++) {j=DS18B20_Read_Bit_Demo();dat=(j<<7)|(dat>>1);} returndat;}//寫一個字節(jié)到DS18B20//dat:要寫入的字節(jié)voidDS18B20_Write_Byte_Demo(u8dat){u8j;u8testb; DS18B20_IO_OUT();//SETPA0OUTPUT;for(j=1;j<=8;j++) {testb=dat&0x01;dat=dat>>1;if(testb){DS18B20_DQ_OUT=0;//Write1delay_us(2);DS18B20_DQ_OUT=1;delay_us(60);}else{DS18B20_DQ_OUT=0;//Write0delay_us(60);DS18B20_DQ_OUT=1;delay_us(2);}}}//開始溫度轉換voidDS18B20_Start_Demo(void)//ds1820startconvert{ DS18B20_Rst_Demo(); DS18B20_Check_Demo(); DS18B20_Write_Byte_Demo(0xcc);//skipromDS18B20_Write_Byte_Demo(0x44);//convert}//初始化DS18B20的IO口DQ同時檢測DS的存在//返回1:不存在;返回0:存在 u8DS18B20_Init_Demo(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能PORTA口時鐘 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //PORTA0推挽輸出 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_0);//輸出1 DS18B20_Rst_Demo(); returnDS18B20_Check_Demo();}//從ds18b20得到溫度值//精度:0.1C;返回值:溫度值(-550~1250)shortDS18B20_Get_Temp_Demo(void){u8temp;u8TL,TH; shorttem;DS18B20_Start_Demo();DS18B20_Rst_Demo();DS18B20_Check_Demo(); DS18B20_Write_Byte_Demo(0xcc);//skipromDS18B20_Write_Byte_Demo(0xbe);//convert TL=DS18B20_Read_Byte_Demo();//LSBTH=DS18B20_Read_Byte_Demo();//MSB if(TH>7){TH=~TH;TL=~TL;temp=0;//溫度為負}elsetemp=1;//溫度為正 tem=TH;//獲得高八位tem<<=8;tem+=TL;//獲得底八位tem=(float)tem*0.625;//轉換 if(temp)returntem/10;//返回溫度值 elsereturn-tem;}#endif#ifCONFIG_DS1302==ENABLEDconstunsignedcharDs1302_write_add_Demo[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};//寫地址constunsignedcharDs1302_read_add_Demo[]={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};//讀地址//DS1302初始化voidDS1302_Init_Demo(void){GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_1|GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_1);//PB1拉高 GPIO_ResetBits(GPIOB,GPIO_Pin_11|GPIO_Pin_10);//PB0,PB10置低}//向DS1302寫入一個字節(jié)數(shù)據(jù)voidDS1302_Write_Byte_Demo(u8addr,u8data){u8i; DS1302_RST=0;//停止DS1302總線 delay_us(10); DS1302_RST=1;//啟動DS1302總線 addr=addr&0xFE;//最低位置零,寫數(shù)據(jù) DS1302_IO_OUT(); for(i=0;i<8;i++)//寫地址 { if(addr&0x01) DS1302_DATA_OUT=1; else DS1302_DATA_OUT=0; DS1302_SCK=1;//產生時鐘 delay_us(10); DS1302_SCK=0; addr=addr>>1; } for(i=0;i<8;i++)//寫數(shù)據(jù) { if(data&0x01) DS1302_DATA_OUT=1; else DS1302_DATA_OUT=0; DS1302_SCK=1;//產生時鐘 delay_us(10); DS1302_SCK=0; data=data>>1; }DS1302_RST=0;//停止DS1302總線}//從DS1302讀出一個字節(jié)數(shù)據(jù)u8DS1302_Read_Byte_Demo(u8addr){u8i,temp; DS1302_RST=0;//停止DS1302總線 delay_us(10); DS1302_RST=1;//啟動DS1302總線 addr=addr|0x01;//最低位置高,讀數(shù)據(jù) DS1302_IO_OUT(); for(i=0;i<8;i++)//寫地址 {if(addr&0x01) DS1302_DATA_OUT=1; else DS1302_DATA_OUT=0; DS1302_SCK=1;//產生時鐘 delay_us(10); DS1302_SCK=0; addr=addr>>1; } DS1302_IO_IN(); for(i=0;i<8;i++)//讀數(shù)據(jù) {temp=temp>>1; if(DS1302_DATA_IN) temp|=0x80; else temp&=0x7F; DS1302_SCK=1;//產生時鐘 delay_us(10); DS1302_SCK=0; } DS1302_RST=0;//停止DS1302總線 returntemp;}unsignedcharBCD_Decimal_Demo(unsignedcharbcd)//BCD碼轉十進制函數(shù){unsignedcharDecimal; Decimal=bcd>>4; return(Decimal=Decimal*10+(bcd&=0x0F));}/*************讀時間、年月日***************/voidDs1302_Read_Time_Demo(unsignedchar*arry){ *arry=BCD_Decimal_Demo(DS1302_Read_Byte_Demo(Ds1302_read_add_Demo[0])); *(arry+1)=BCD_Decimal_Demo(DS1302_Read_Byte_Demo(Ds1302_read_add_Demo[1])); //讀分 *(arry+2)=BCD_Decimal_Demo(DS1302_Read_Byte_Demo(Ds1302_read_add_Demo[2])); //讀時 *(arry+3)=BCD_Decimal_Demo(DS1302_Read_Byte_Demo(Ds1302_read_add_Demo[3])); //讀日 *(arry+4)=BCD_Decimal_Demo(DS1302_Read_Byte_Demo(Ds1302_read_add_Demo[4])); //讀月 *(arry+5)=BCD_Decimal_Demo(DS1302_Read_Byte_Demo(Ds1302_read_add_Demo[5])); //讀年 *(arry+6)=BCD_Decimal_Demo(DS1302_Read_Byte_Demo(Ds1302_read_add_Demo[6])); //讀星期}voidDs1302_Save_Demo(unsignedcharpo,unsignedchardat){ unsignedchartemp; temp=(dat)/10*16+(dat)%10;//十進制轉換成DS1302要求的DCB碼 DS1302_Write_Byte_Demo(0x8e,0x00);//允許寫,禁止寫保護 DS1302_Write_Byte_Demo(po,temp);//向DS1302內寫分寄存器82H寫入調整后的分數(shù)據(jù)BCD碼 DS1302_Write_Byte_Demo(0x8e,0x80);//打開寫保護 }#endif#ifCONFIG_IR_REC==ENABLED//條件編譯:檢查CONFIG_IR_REC是否等于ENABLED如果是,則編譯接下來的代碼塊。#include<stm32f10x_exti.h>unsignedcharir_num; //用于存儲接收到的紅外數(shù)據(jù)的數(shù)量或狀態(tài)u32hw_jsm;//用于存儲接收到的紅外數(shù)據(jù)u8hw_jsbz;unsignedcharIm[4]={0x00,0x00,0x00,0x00}; //IRCOM[0]~IRCOM[3]:地址碼、地址反碼、按鍵碼、按鍵反碼(都是十六進制)voidHwjs_Init()//初始化{ GPIO_InitTypeDefGPIO_InitStructure; EXTI_InitTypeDefEXTI_InitStructure; NVIC_InitTypeDefNVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中斷,需要使能AFIO時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA,PORTC時鐘 //配置GPIOA的引腳8為上拉輸入模式 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource8); GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; GPIO_Init(GPIOA,&GPIO_InitStructure); EXTI_ClearITPendingBit(EXTI_Line8);//清除EXTI線8的掛起位 //配置EXTI線8 EXTI_InitStructure.EXTI_Line=EXTI_Line8; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); //配置NVIC通道EXTI9_5_IRQn NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); }voidnvic_on_off(u8status)//配置STM32微控制器中NVIC的函數(shù){ NVIC_InitTypeDefNVIC_InitStructure; if(status) { NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;//EXTI9_5 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); }else { NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;//EXTI9_5 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; NVIC_InitStructure.NVIC_IRQChannelCmd=DISABLE; NVIC_Init(&NVIC_InitStructure); }}u8HW_jssj(void)//測量紅外信號高電平持續(xù)的時間{ u8t=0; while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1)//當GPIOA的引腳8處于高電平時,進入循環(huán) { t++; delay_us(20); if(t>250)// {returnt; } }returnt;}voidEXTI9_5_IRQHandler(void)//處理紅外信號的接收和解碼{ u8Tim=0;//記錄高電平持續(xù)的時間 u8ok=0;//標記是否檢測到開始位 u8DATA=0;//當前讀取的數(shù)據(jù)位 u8Num=0;//計數(shù)器,記錄接收到的數(shù)據(jù)位數(shù)量 nvic_on_off(0); while(1) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1)// { Tim=HW_jssj(); if(Tim>=250)break;//停止位 if(Tim>=200&&Tim<250) {ok=1;//開始位 } elseif(Tim>=60&&Tim<90) {DATA=1;//數(shù)據(jù)位1 }elseif(Tim>=10&&Tim<50) {DATA=0;//數(shù)據(jù)位0 } if(ok==1) {hw_jsm<<=1; hw_jsm+=DATA; if(Num>=32) { hw_jsbz=1; //temp=(u8*)&hw_jsm; Im[2]=hw_jsm>>8;//提取按鍵碼 switch(Im[2]) { case(0XA2):ir_num=1;break; case(0X62):ir_num=2;break; case(0XE2):ir_num=3;break; case(0xE1):ir_num=4;break; case(0x81):ir_num=5;break; case(0x43):ir_num=6;break; case(0x07):ir_num=7;break; } Im[2]=0; break; } } Num++;// } } EXTI_ClearITPendingBit(EXTI_Line8);//清除EXTI線8的掛起位,確保下次中斷能夠正確觸發(fā)}#endif#ifCONFIG_LCD12864_LIB==ENABLEDvoidDelay_10ms(void){delay_ms(10);}staticvoidLCD_GPIO_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4 |GPIO_Pin_5 ; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5); }voidLCD_Init
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年白城職業(yè)技術學院單招綜合素質筆試模擬試題含詳細答案解析
- 2026年青海農牧科技職業(yè)學院高職單招職業(yè)適應性測試備考題庫及答案詳細解析
- 2026年江蘇航運職業(yè)技術學院單招綜合素質考試模擬試題含詳細答案解析
- 2026年黑龍江交通職業(yè)技術學院單招綜合素質筆試參考題庫含詳細答案解析
- 代詞詞課件教學課件
- 2026年貴州交通職業(yè)技術學院高職單招職業(yè)適應性測試備考題庫及答案詳細解析
- 2026云南昭通青年企業(yè)家商會(籌)招聘3人筆試參考題庫及答案解析
- 2026年白銀礦冶職業(yè)技術學院單招綜合素質考試備考題庫含詳細答案解析
- 2026年鐵門關職業(yè)技術學院單招綜合素質考試備考題庫含詳細答案解析
- 2026年梧州職業(yè)學院高職單招職業(yè)適應性測試備考試題及答案詳細解析
- 叉車安全管理人員崗位職責
- 驗光師年度工作總結
- 2024年浙江溫州市蒼南縣公投集團所屬企業(yè)招聘筆試人員及管理單位遴選500模擬題附帶答案詳解
- 新生兒先天性心臟病篩查課件
- 景區(qū)與熱氣球合作合同范本
- 水庫除險加固工程施工組織設計
- DL∕T 5210.5-2018 電力建設施工質量驗收規(guī)程 第5部分:焊接
- CJJT67-2015 風景園林制圖標準
- 2023屆高考語文二輪復習:小說標題的含義與作用 練習題(含答案)
- 探傷檢測報告
- HSE管理體系培訓課件
評論
0/150
提交評論