Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- #include "stm32f10x.h"
- #include "delay.h"
- #include "usart.h"
- #include "LCD1602.h"
- #include "led.h"
- #include "ds18b20.h"
- //Buzzer--------------->PB8
- //LED1----------------->PB15
- //LED2----------------->PA8
- //Relay2--------------->PA9
- //Relay1--------------->PA10
- float Set_H = 35.0; //高温报警温度
- float Set_L = 10.0; //低温报警温度
- float Temp=0; //实时温度
- unsigned char SetFlag = 0;
- //初始化按键 LED 继电器 蜂鸣器端口
- void PortInit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_SetBits(GPIOA,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB,GPIO_Pin_8 | GPIO_Pin_15);
-
- /*-------------------按键初始化-------------------------*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成输入模式
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB,GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13);
- }
- void CoolingStart(void)
- {
- GPIO_ResetBits(GPIOB,GPIO_Pin_8);
- GPIO_ResetBits(GPIOA,GPIO_Pin_9 | GPIO_Pin_8);
- }
- void CoolingStop(void)
- {
- GPIO_SetBits(GPIOB,GPIO_Pin_8);
- GPIO_SetBits(GPIOA,GPIO_Pin_9 | GPIO_Pin_8);
- }
- void HeatStart(void)
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_10);
- GPIO_ResetBits(GPIOB,GPIO_Pin_15);
- }
- void HeatStop(void)
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_10);
- GPIO_SetBits(GPIOB,GPIO_Pin_15);
- }
- unsigned char KeyVal(void)
- {
- unsigned char key='0'; //无效返回255
- uint16_t Read;
- Read=GPIO_ReadInputData(GPIOB); //读取GPIOB的数值
- Read >>= 10;
- Read &= 0x000F;
- if(0x0F!=Read)
- {
- delay_ms(10);
- Read=GPIO_ReadInputData(GPIOB); //读取GPIOB的数值
- Read >>= 10;
- Read &= 0x000F;
- if(0x0F!=Read)
- {
- switch(Read)
- {
- case 0x0E:
- { key = 'A'; }break; //确认按键
- case 0x0D:
- { key = '-'; }break; //减
- case 0x0B:
- { key = '+'; }break; //加
- case 0x07:
- { key = 'S'; }break; //设置
- default: break;
- }
- }
- }
- return key;
- }
- /*-----------------------位选函数---------------------------*/
- void BitSelect(void)
- {
- if('S'==KeyVal())
- {
- while('S'==KeyVal());
- SetFlag++;
- if(SetFlag>5)
- SetFlag=0;
- }
- }
- void SetDisplay(void)
- {
- if('+'==KeyVal() || '-'==KeyVal()) //如果有按键按下
- { ; }
- else
- {
- switch(SetFlag)
- {
- case 0:
- { LCD_DisChar(1,3,' '); }break;
- case 1:
- { LCD_DisChar(1,4,' '); }break;
- case 2:
- { LCD_DisChar(1,6,' '); }break;
- case 3:
- { LCD_DisChar(1,11,' '); }break;
- case 4:
- { LCD_DisChar(1,12,' '); }break;
- case 5:
- { LCD_DisChar(1,14,' '); }break;
- default:break;
- }
- }
- delay_ms(120);
- LCD_DisFloat(1,2,Set_H,5,1);
- LCD_DisFloat(1,10,Set_L,5,1);
- delay_ms(120);
- }
- void SetVal(void) //数值设置函数
- {
- if('+'==KeyVal())
- {
- switch(SetFlag)
- {
- case 0:
- {
- if(Set_H<90)
- Set_H+=10;
- else
- Set_H = 100;
- }break;
- case 1:
- {
- if(Set_H<99)
- Set_H+=1;
- else
- Set_H = 100;
- }break;
- case 2:
- {
- if(Set_H<99.8)
- Set_H+=0.1;
- else
- Set_H = 100;
- }break;
- case 3: //低温限度不能高于高温限度-1
- {
- if(Set_L<Set_H-11)
- Set_L+=10;
- else
- Set_L = Set_H-1;
-
- }break;
- case 4:
- {
- if(Set_L<Set_H-2)
- Set_L+=1;
- else
- Set_L = Set_H-1;
-
- }break;
- case 5:
- {
- if(Set_L<Set_H-1.1)
- Set_L+=0.1;
- else
- Set_L = Set_H-1;
- }break;
- default:break;
- }
- }
- /*-------------------------------------------------------*/
- if('-'==KeyVal())
- {
- switch(SetFlag)
- {
- case 0:
- {
- if(Set_H>Set_L+11)
- Set_H -=10;
- else
- Set_H = Set_L+1;
- }break;
- case 1:
- {
- if(Set_H>Set_L+1)
- Set_H -=1;
- else
- Set_H = Set_L+1;
- }break;
- case 2:
- {
- if(Set_H>Set_L+1.1)
- Set_H -=0.1;
- else
- Set_H = Set_L+1;
- }break;
- case 3:
- {
- if(Set_L>10)
- Set_L-=10;
- else
- Set_L = 0;
- }break;
- case 4:
- {
- if(Set_L>1)
- Set_L-=1;
- else
- Set_L = 0;
- }break;
- case 5:
- {
- if(Set_L>0.1)
- Set_L-=0.1;
- else
- Set_L = 0;
-
- }break;
- default:break;
- }
- }
- }
- void AlarmSet(void)
- {
- if('S'==KeyVal())
- {
- while('S'==KeyVal());
- SetFlag=0;
- while(1)
- {
- BitSelect();
- SetDisplay();
- SetVal();
- /*-----------------------------*/
- if('A'==KeyVal())
- {
- while('A'==KeyVal());
- break;
- }
- }
- }
- }
- void TempControl(void)
- {
- if(Temp>Set_H)
- {
- CoolingStart();
- }
-
- if(Temp<Set_H-0.2)
- {
- CoolingStop();
- }
-
- if(Temp<Set_L)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
STM32温度报警器.7z
(1.35 MB, 下载次数: 188)
|