基于STM32单片机的家用智能风扇设计_第1页
基于STM32单片机的家用智能风扇设计_第2页
基于STM32单片机的家用智能风扇设计_第3页
基于STM32单片机的家用智能风扇设计_第4页
基于STM32单片机的家用智能风扇设计_第5页
已阅读5页,还剩64页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

附录2程序主函数:#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(); //延时函数初始化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延时倍乘数staticu16fac_ms=0;//ms延时倍乘数#ifdefOS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.//systick中断服务函数,使用ucos时用到voidSysTick_Handler(void){ OSIntEnter(); //进入中断OSTimeTick();//调用ucos的时钟服务程序OSIntExit();//触发任务切换软中断}#endif//初始化延迟函数voiddelay_init() {#ifdefOS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了. u32reload;#endif SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟HCLK/8 fac_us=SystemCoreClock/8000000; //为系统时钟的1/8#ifdefOS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了. reload=SystemCoreClock/8000000; //每秒钟的计数次数单位为K reload*=1000000/OS_TICKS_PER_SEC;//根据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时钟数#endif} #ifdefOS_CRITICAL_METHOD //使用了ucos//延时nus//nus为要延时的us数. voiddelay_us(u32nus){ u32ticks; u32told,tnow,tcnt=0; u32reload=SysTick->LOAD; //LOAD的值 ticks=nus*fac_us; //需要的节拍数 tcnt=0; told=SysTick->VAL;//刚进入时的计数器值 while(1) { tnow=SysTick->VAL; if(tnow!=told) { if(tnow<told)tcnt+=told-tnow;//SYSTICK是一个递减的计数器就可以了. elsetcnt+=reload-tnow+told; told=tnow; if(tcnt>=ticks)break;//时间超过/等于要延迟的时间,则退出. } }; }//延时nms//nms:要延时的ms数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数. voiddelay_us(u32nus){ u32temp; SysTick->LOAD=nus*fac_us;//时间加载 SysTick->VAL=0x00;//清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭计数器 SysTick->VAL=0X00;//清空计数器 }//延时nmsvoiddelay_ms(u16nms){ u32temp; SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit) SysTick->VAL=0x00;//清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭计数器 SysTick->VAL=0X00;//清空计数器 }#endif/******stm32c8t6*********文件:sys.c**********************/#include"sys.h"voidNVIC_Configuration(void){NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级}/******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,持续为低电平 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读取一个字节//返回值:读到的数据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;}//写一个字节到DS18B20//dat:要写入的字节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写入一个字节数据voidDS1302_Write_Byte_Demo(u8addr,u8data){u8i; DS1302_RST=0;//停止DS1302总线 delay_us(10); DS1302_RST=1;//启动DS1302总线 addr=addr&0xFE;//最低位置零,写数据 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++)//写数据 { 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读出一个字节数据u8DS1302_Read_Byte_Demo(u8addr){u8i,temp; DS1302_RST=0;//停止DS1302总线 delay_us(10); DS1302_RST=1;//启动DS1302总线 addr=addr|0x01;//最低位置高,读数据 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++)//读数据 {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码转十进制函数{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写入调整后的分数据BCD码 DS1302_Write_Byte_Demo(0x8e,0x80);//打开写保护 }#endif#ifCONFIG_IR_REC==ENABLED//条件编译:检查CONFIG_IR_REC是否等于ENABLED如果是,则编译接下来的代码块。#include<stm32f10x_exti.h>unsignedcharir_num; //用于存储接收到的红外数据的数量或状态u32hw_jsm;//用于存储接收到的红外数据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的函数{ 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)//测量红外信号高电平持续的时间{ u8t=0; while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1)//当GPIOA的引脚8处于高电平时,进入循环 { t++; delay_us(20); if(t>250)// {returnt; } }returnt;}voidEXTI9_5_IRQHandler(void)//处理红外信号的接收和解码{ u8Tim=0;//记录高电平持续的时间 u8ok=0;//标记是否检测到开始位 u8DATA=0;//当前读取的数据位 u8Num=0;//计数器,记录接收到的数据位数量 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;//数据位1 }elseif(Tim>=10&&Tim<50) {DATA=0;//数据位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的挂起位,确保下次中断能够正确触发}#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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论