完整word版STM32温度报警传感器代码.docx
- 文档编号:10534829
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:18
- 大小:19.09KB
完整word版STM32温度报警传感器代码.docx
《完整word版STM32温度报警传感器代码.docx》由会员分享,可在线阅读,更多相关《完整word版STM32温度报警传感器代码.docx(18页珍藏版)》请在冰豆网上搜索。
完整word版STM32温度报警传感器代码
主函数、main.c
#include"led.h"
#include"delay.h"
#include”sys.h"
#include"usart。
h"
#include”lcd.h"
#include"ds18b20.h"
#include”key。
h”
#include
#include〈stdio。
h>
#include
inttemp_low=22;
inttemp_high=32;
intzanshi_low=0;
intzanshi_hign=0;
voidTIM3_Int_Init(u16arr,u16psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//时钟使能
TIM_TimeBaseStructure。
TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值10Khz的计数频率
TIM_TimeBaseStructure。
TIM_ClockDivision=0;//设置时钟分割:
TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(//使能或者失能指定的TIM中断
TIM3,//TIM2
TIM_IT_Update,
ENABLE//使能
);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//TIM3中断
NVIC_InitStructure。
NVIC_IRQChannelPreemptionPriority=0;//先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//从优先级3级
NVIC_InitStructure。
NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3,ENABLE);//使能TIMx外设
}
u8flag=0;
intmain(void)
{
u8t=0;
u8shuzu[20];
u8keyvalue=0;
u8gaibianshui=0;
shorttemperature;
delay_init();//延时函数初始化
uart_init(9600);//串口初始化为9600
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组2
LED_Init();//初始化与LED连接的硬件接口
TIM3_Int_Init(9999,7199);//10Khz的计数频率,计数到5000为500ms
LCD_Init();
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(0,50,200,16,16,”STM32test”);
LCD_ShowString(0,70,200,16,16,"name:
zhangqiqi”);
//LCD_ShowString(0,90,200,16,16,”Max32CMin26C");
memset(shuzu,0,20);
sprintf(shuzu,”Maxis%2dC,Minis%2dC”,temp_high,temp_low);
LCD_ShowString(0,90,200,16,16,shuzu);
while(DS18B20_Init())//DS18B20初始化
{
LCD_ShowString(0,130,200,16,16,"DS18B20Error”);
delay_ms(200);
LCD_Fill(0,130,239,130+16,WHITE);
delay_ms(200);
}
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(0,110,260,16,16,”Thetemperatureis:
.Cnow");
LCD_ShowChar(0+25*8,110,’,’,16,0);
LCD_ShowChar(0+29*8,110,’!
',16,0);
while
(1)
{
POINT_COLOR=BLUE;//设置字体为蓝色
if(t%10==0)//每100ms读取一次
{
t=0;
temperature=DS18B20_Get_Temp();
if(temperature〈0)
{
LCD_ShowChar(0+40,150,’-’,16,0);//显示负号
temperature=-temperature;//转为正数
}
else
LCD_ShowChar(0+40,150,’',16,0);//去掉负号
memset(shuzu,0,20);
sprintf(shuzu,”Thetemperatureis:
%3d.%1dC”,temperature/10,temperature%10);
LCD_ShowString(0,110,200,16,16,shuzu);
}
delay_ms(10);
//判断温度
zanshi_low=temp_low*10;
zanshi_hign=temp_high*10;
if((temperature
{
if(temperature { flag=1; printf("chaoxiaxian”); } if(temperature>zanshi_hign) { flag=2; printf("chaoshangxian"); } } else { flag=0; LED0=1;//正常情况灯不亮 LED1=1; } //获取温度时间控制t t++; //浏览开关 KEY_Init(); delay_ms(10); keyvalue=KEY_Scan(0); if(keyvalue! =0) { if(keyvalue==3) { gaibianshui=(gaibianshui+1)%3; } if(gaibianshui==1)//改变上限 { if(keyvalue==2)//key1按下 { temp_high++; memset(shuzu,0,20); sprintf(shuzu,”Maxis%2dC,Minis%2dC",temp_high,temp_low); LCD_ShowString(0,90,200,16,16,shuzu); } if(keyvalue==1)//key0按下 { temp_high--; memset(shuzu,0,20); sprintf(shuzu,”Maxis%2dC,Minis%2dC",temp_high,temp_low); LCD_ShowString(0,90,200,16,16,shuzu); } } if(gaibianshui==2)//改变上限 { if(keyvalue==2)//key1按下 { temp_low++; memset(shuzu,0,20); sprintf(shuzu,"Maxis%2dC,Minis%2dC”,temp_high,temp_low); LCD_ShowString(0,90,200,16,16,shuzu); } if(keyvalue==1)//key0按下 { temp_low--; memset(shuzu,0,20); sprintf(shuzu,”Maxis%2dC,Minis%2dC”,temp_high,temp_low); LCD_ShowString(0,90,200,16,16,shuzu); } } keyvalue=0; } } } voidTIM3_IRQHandler(void)//TIM3中断 { if(TIM_GetITStatus(TIM3,TIM_IT_Update)! =RESET)//检查指定的TIM中断发生与否: TIM中断源 { TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx的中断待处理位: TIM中断源 //温度不正常处理灯 if(flag==1) { LED0=! LED0; } if(flag==2) { LED1=! LED1; } } } LED函数led.c #include”led。 h” voidLED_Init(void) { GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);//使能PA,PD端口时钟 GPIO_InitStructure。 GPIO_Pin=GPIO_Pin_8;//LED0-->PA。 8端口配置 GPIO_InitStructure。 GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz GPIO_Init(GPIOA,&GPIO_InitStructure);//根据设定参数初始化GPIOA。 8 GPIO_SetBits(GPIOA,GPIO_Pin_8);//PA.8输出高 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//LED1-->PD.2端口配置,推挽输出 GPIO_Init(GPIOD,&GPIO_InitStructure);//推挽输出,IO口速度为50MHz GPIO_SetBits(GPIOD,GPIO_Pin_2);//PD。 2输出高 } 温度代码s18b20.c #include"ds18b20。 h” #include”delay.h" voidDS18B20_Rst(void) { DS18B20_IO_OUT();//SETPA0OUTPUT DS18B20_DQ_OUT=0;//拉低DQ delay_us(750);//拉低750us DS18B20_DQ_OUT=1;//DQ=1 delay_us(15);//15US } //等待DS18B20的回应 //返回1: 未检测到DS18B20的存在 //返回0: 存在 u8DS18B20_Check(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/0 u8DS18B20_Read_Bit(void)//readonebit { u8data; DS18B20_IO_OUT();//SETPA0OUTPUT DS18B20_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(void)//readonebyte { u8i,j,dat; dat=0; for(i=1;i〈=8;i++) { j=DS18B20_Read_Bit(); dat=(j<<7)|(dat>〉1); } returndat; } //写一个字节到DS18B20 //dat: 要写入的字节 voidDS18B20_Write_Byte(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;//Write1 delay_us (2); DS18B20_DQ_OUT=1; delay_us(60); } else { DS18B20_DQ_OUT=0;//Write0 delay_us(60); DS18B20_DQ_OUT=1; delay_us (2); } } } //开始温度转换 voidDS18B20_Start(void)//ds1820startconvert { DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);//skiprom DS18B20_Write_Byte(0x44);//convert } //初始化DS18B20的IO口DQ同时检测DS的存在 //返回1: 不存在 //返回0: 存在 u8DS18B20_Init(void) { GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA口时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//PORTA0推挽输出 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_2);//输出1 DS18B20_Rst(); returnDS18B20_Check(); } //从ds18b20得到温度值 //精度: 0。 1C //返回值: 温度值(—550~1250) shortDS18B20_Get_Temp(void) { u8temp; u8TL,TH; shorttem; DS18B20_Start();//ds1820startconvert DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);//skiprom DS18B20_Write_Byte(0xbe);//convert TL=DS18B20_Read_Byte();//LSB TH=DS18B20_Read_Byte();//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;//返回温度值 elsereturn—tem; } 键盘代码key.c #include”key。 h" #include”delay.h” //按键初始化函数 //PA15和PC5设置成输入 voidKEY_Init(void) { GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//PA15 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//设置成上拉输入 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA15 GPIO_InitStructure。 GPIO_Pin=GPIO_Pin_5;//PC5 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//设置成上拉输入 GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化GPIOC5 GPIO_InitStructure。 GPIO_Pin=GPIO_Pin_0;//PA0 GPIO_InitStructure。 GPIO_Mode=GPIO_Mode_IPD;//PA0设置成输入,默认下拉 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA。 0 } //按键处理函数 //返回按键值 //mode: 0,不支持连续按;1,支持连续按; //返回值: //0,没有任何按键按下 //KEY0_PRES,KEY0按下 //KEY1_PRES,KEY1按下 //WKUP_PRES,WK_UP按下 //注意此函数有响应优先级,KEY0>KEY1>WK_UP! ! u8KEY_Scan(u8mode) { staticu8key_up=1;//按键按松开标志 if(mode)key_up=1;//支持连按 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10);//去抖动 key_up=0; if(KEY0==0)returnKEY0_PRES; elseif(KEY1==0)returnKEY1_PRES; elseif(WK_UP==1)returnWKUP_PRES; }elseif(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; return0;//无按键按下 }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word STM32 温度 报警 传感器 代码