蓝牙,温控风扇制作过程问题记录

本文记录了作者在开发一款带有蓝牙功能的温控风扇过程中遇到的问题及解决方案,特别是关于单片机PWM调速和按键中断冲突的问题。通过调整程序结构和中断处理,最终解决了按键失效的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝牙,温控风扇,从星期1开始利用课余时间到现在已有3天了。刚开始由于用的都是一些以前写过的模板没遇到什么实质性的大问题,都是一些操作上的逻辑问题对程序改一下优化一下就行了,今天下午算是遇到了一个真正学知识的问题。

对于直流电机采用的是比较广泛和成熟的PWM脉冲调制。程序单独写了并下载到单片机里单独运行了一下,没什么问题于是就把他加到了整个工程里面,这时问题出现了(我设计的风扇暂时有4个按键分别是一档,二挡,自动和定时调时 并且定时使用的定时器0中断)电机能旋转但是任何按键都无效。当时就有点没有头绪了,期初以为单片机两个定时器中断不能同时用不过想了想应该不是百度一下的确可以同时用。但是发现有个优先级问题,但是我用的定时器0的优先级是高于定时器1的。那么问题究竟出在哪?

出去转了一圈想想突然发现我的按键不是中断产生的,并且PWM所需要的中断频率过高以至于单片机几乎都处于定时器1的中断中导致所有按键都失效。找到问题所在那么怎么解决?首先我是在每一个按键按下后关闭中断等到按键处理程序结束后再打开中断,这样就能使按键起到作用。修改程序后发现效果不是很理想整理了一下思路发现我的程序时自上而下运行,运行到按键程序处如果这时正好有按键按下则进行按键处理,如果没有按键按下则继续往下执行。每个按键后面都要关中断然后在打开这样很容易乱于是我想整个程序大部分时间无按键操作,如果把按键操作集中于一个函数然后在函数开始前关中断在函数结束后开中断这样应该好一点。在此期间我又把温度显示函数加到了期间防止无法读写温度。经过测试的确效果要好温度也能更新但是有个缺点就是按键时间不能太短要稍有延时否者还是会被程序屏蔽掉。

这次问题是第一次碰到,让我认识到了中断的威力和中断优先级的问题。


这两天把实物做了一下,把程序综合了一下运行后发现有许多BUG,程序运行并不理想老是出现一些意想不到的情况。接下来并没有忙着加入蓝牙程序而是对原有的程序进行调试。的确写一个小程序简单,但是把许多的小程序综合成一个大的程序需很难,他需要考虑到各个程序的影响并且让程序的逻辑更为合理。

经过不断地修改调试,最终的结果还算满意,但是感觉我写的程序在层次上有些混乱不明确。我想这应该是事先没有做好程序规划导致的,但是我又感觉一些逻辑控制上的关系事先并不能想到,很多是在实际运行中发现的,然后再去修改添加程序导致程序有点混乱。

调试到最后程序报了几个警告MULTIPLE CALL TO SEGMENT,以前并没有遇到过,网上搜了一下原因发现问题的原因是在主循环里调用了一个函数,而在中断服务中,你又一次调用了同样的函数。这样当主循环运行到该函数中时,一旦产生中断,则在中断里又再次调用该函数!而使得该子函数发生了重入。解决办法是把程序内容复制一下修改了程序名字。




基于单片机的温控风扇的设计 摘 要 温控风扇在现代社会中的生产以及人们的日常生活中都有广泛的应用,如工业生产中大型机械散热系统中的风扇、现在笔记本电脑上的广泛应用的智能CPU风扇等。本文设计了基于单片机的温控风扇系统,采用单片机作为控制器,利用温度传感器DS18B20作为温度采集元件,并根据采集到的温度,通过一个达林顿反向驱动器ULN2803驱动风扇电机。根据检测到的温度与系统设定的温度的比较实现风扇电机的自动启动和停止,并能根温度的变化自动改变风扇电机的转速,同时用LED八段数码管显示检测到的温度与设定的温度。 关键词:单片机、DS18B20、温控风扇 第一章 整体方案设计 1.1 前 言 在现代社会中,风扇被广泛的应用,发挥着举足轻重的作用,如夏天人们用的散热风扇、工业生产中大型机械中的散热风扇以及现在笔记本电脑上广泛使用的智能CPU风扇等。而随着温度控制技术的发展,为了降低风扇运转时的噪音以及节省能源等,温控风扇越来越受到重视并被广泛的应用。在现阶段,温控风扇的设计已经有了一定的成效,可以使风扇根据环境温度的变化进行自动无级调速,当温度升高到一定时能自动启动风扇,当温度降到一定时能自动停止风扇的转动,实现智能控制。 随着单片机在各个领域的广泛应用,许多用单片机作控制的温度控制系统也应运而生,如基于单片机的温控风扇系统。它使风扇根据环境温度的变化实现自动启停,使风扇转速随着环境温度的变化而变化,实现了风扇的智能控制。它的设计为现代社会人们的生活以及生产带来了诸多便利,在提高人们的生活质量、生产效率的同时还能节省风扇运转所需的能量。 本文设计了由ATMEL公司的8052系列单片机AT89C52作为控制器,采用DALLAS公司的温度传感器DS18B20作为温度采集元件,并通过一个达林顿反向驱动器ULN2803驱动风扇电机的转动。同时使系统检测到得环境温度以及系统预设的温度动态的显示在LED数码管上。根据系统检测到得环境温度与系统预设温度的比较,实现风扇电机的自动启停以及转速的自动调节。 1.2 系统整体设计 本设计的整体思路是:利用温度传感器DS18B20检测环境温度并直接输出数字温度信号给单片机AT89C52进行处理,在LED数码管上显示当前环境温度值以及预设温度值。其中预设温度值只能为整数形式,检测到的当前环境温度可精确到小数点后一位。同时采用PWM脉宽调制方式来改变直流风扇电机的转速。并通过两个按键改变预设温度值,一个提高预设温度,另一个降低预设温度值。系统结构框图如下: 结 论 本次设计的系统以单片机为控制核心,以温度传感器DS18B20检测环境温度,实现了根据环境温度变化调节不同的风扇电机转速,在一定范围能能实现转速的连续调节,LED数码管能连续稳定的显示环境温度和设置温度,并能通过两个独立按键调节不同的设置温度,从而改变环境温度与设置温度的差值,进而改变电机转速。实现了基于单片机的温控风扇的设计。 本系统设计可推广到各种电动机的控制系统中,实现电动机的转速调节。在生产生活中,本系统可用于简单的日常风扇的智能控制,为生活带来便利;在工业生产中,可以改变不同的输入信号,实现对不同信号输入控制电机的转速,进而实现生产自动化,如在电力系统中可以根据不同的负荷达到不同的电压信号,再由电压信号调节不同的发电机转速,进而调节发电量,实现电力系统的自动化调节。综上所述,该系统的设计和研究在社会生产和生活中具有重要地位。 附录2:程序代码 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit DQ=P1^7; sbit key1=P1^3; sbit key2=P1^4; sbit dianji=P3^1; float ff; uint y3; uchar shi,ge,xiaoshu,sheding=20,gaonum,dinum; uchar code dispcode[]={ //段码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code tablel[]={ //带小数点的段码 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfd, 0x87,0xff,0xef}; uchar dispbitcode[]={ //位选 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; uchar dispbuf[8]={0,0,0,0,0,0,0,0}; void Delay(uint num)// 延时函数 { while( --num ); } void digitalshow(uchar a4,uchar a3,uchar a2,uchar a1,uchar a0) { dispbuf[0]=a0; dispbuf[1]=a1; dispbuf[2]=a2; dispbuf[3]=a3; dispbuf[4]=a4; P2=0xff; P0=dispcode[dispbuf[0]]; P2=dispbitcode[5]; Delay(1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值