文章目录
前言
本次介绍温度控制板的程序流程和关键代码详解
一、基于18B20的温度控制板功能介绍
1、数码显示的温度为18B20采集的环境温度,仅显示个位和十位,小数点后的忽略;
2、按动按钮,显示风扇温度阈值,松手即显示环境温度,为了便于两者区分,风扇温度阈值加上小数点;
3、当环境温度达到阈值温度时,风扇启动,当温度下降到阈值温度以下5℃时,风扇停转,这样设计可避免风扇频繁启停;
为了实现以上功能,将采用以下技术方案:
1、每1秒钟采集一次温度,即调用ds18b20.c库函数,执行完毕,将会返回3位十进制数值,与10取模,得到高两位数据,;
2、每10毫秒移位一个数码管位,并更新该位的数值,本项目采用两位数码管,两个共阴极,共用8个笔端,移位函数、更新数码管笔端函数集合在led.c函数里;
3、每10毫秒采集一次按钮,因为是按下有效,抬起失效,因此可以不做消抖处理,按钮处理在主程序完成;
4、启用通用定时器2,中断周期10ms,中断子程序里完成置标志位:数码管显示标志位、温度采集标志位
以下是程序流程图;
5、延时库函数delay.c,使用正点原子提供,使用delay_ms()和delay_us()两个函数;
二、18B20温度控制板程序介绍
1.主函数
int main(void)
{
systick_config();
delay_init(72);
/* enable the LED GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
/* led 和风扇输出 GPIO 初始化 */
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12);
gpio_bit_reset(GPIOA, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
gpio_bit_reset(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12);
/* 按钮输入 GPIO 初始化 */
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_15);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
ds18b20_get_temperature();//在此做一次温度转换,第一次转换会得到85℃的默认值,为了不显示这个数值,在显示程序执行前先过一次
timer2_init(1200 - 1, 500 - 1);
while(1) {
delay_us(2);
if(FlagLed == 1) //① 10ms刷新一次LED