历史上的今天
今天是:2025年01月10日(星期五)
2021年01月10日 | 用单片机开发板做温控风扇PWM调速
2021-01-10 来源:51hei
能够利用PWM调速原理实现对系统的控制对象(直流电机)进行转速控制,当温度低于系统设置温度下限时直流电机停止工作,到达设置温度的下限和上限之间时以1档的速度工作,当温度高于系统设置温度上限时直流电机全速工作其中上下限温度可以在数码管上人工设置,数码管上能够显示当前的实时温度。
单片机源程序如下:
#include #include typedef unsigned int u16; //对数据类型进行声明定义 ,用u16表示 unsigned int typedef unsigned char u8; // 用 u8表示 unsigned char /**定义各引脚**/ sbit led=P2^0;//led sbit dj=P1^0;//电机 sbit DQ=P3^7;//温度传感器 //////////按键接口///////////////////////////////// sbit key1=P3^1;//设置温度 sbit key2=P3^0;//温度加 sbit key3=P3^2;//温度减 ///////////数码管的四个位///////////////////////////// sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; /*****共阴数码管段选*****/ u8 table[22]= {0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F, 0x77,0x7C,0x39,0x5E,0x79,0x71, 0x40,0x38,0x76,0x00,0xff,0x37};//'-',L,H,灭,全亮,n 16-21 /***定义各变量***/ u16 wen_du;//温度变量 u16 shang,xia; //对比温度暂存变量 u8 dang;//档位显示 u8 flag; //标志位 u8 d1,d2,d3;//显示数据暂存变量 u8 j ; /***延时函数***/ void delay(u16 ms) //延时函数,大约延时25us { u8 x; for(ms;ms>0;ms--) for(x=10;x>0;x--); } /***********ds18b20延迟子函数(晶振12MHz )*******/ void delay_18B20(u16 i) { while(i--); } /**********ds18b20初始化函数**********************/ void Init_DS18B20() { u8 x=0; DQ=1; //DQ复位 delay_18B20(8); //稍做延时 DQ=0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ=1; //拉高总线 delay_18B20(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); } /***********ds18b20读一个字节**************/ u8 ReadOneChar() { u8 i=0; u8 dat=0; for (i=8;i>0;i--) { DQ=0; // 给脉冲信号 dat>>=1; DQ=1; // 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); } return(dat); } /*************ds18b20写一个字节****************/ void WriteOneChar(u8 dat) { u8 i=0; for (i=8;i>0;i--) { DQ=0; DQ=dat&0x01; delay_18B20(5); DQ=1; dat>>=1; } } /**************读取ds18b20当前温度************/ void ReadTemperature() { u8 a=0; u8 b=0; u8 t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(100); a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 wen_du=((b*256+a)>>4); //当前采集温度值除16得实际温度值 } /***数码管显示函数***/ void display()//显示温度 { LSA=1;LSB=1;LSC=0;P0=table[d1];delay(10); //第1位 P0=0x00;LSA=1;LSB=1;LSC=1;delay(1); LSA=0;LSB=1;LSC=0;P0=table[16];delay(10);//第2位 P0=0x00;LSA=1;LSB=1;LSC=1;delay(1); LSA=1;LSB=0;LSC=0;P0=table[d2]; delay(10);//第3位 P0=0x00;LSA=1;LSB=1;LSC=1;delay(1); LSA=0;LSB=0;LSC=0;P0=table[d3];delay(10);//第4位 P0=0x00;LSA=1;LSB=1;LSC=1;delay(1); } /***键盘自动扫描及消抖***/ /***以及功能***/ void zi_keyscan()//自动模式按键扫描函数 { if(key1==0) //设置键按下 { delay(30); //延时去抖 if(key1==0)flag=1; //再次判断按键,按下的话进入设置状态 while(key1==0);//松手检测 //按键释放 } while(flag==1) //进入设置上限状态 { d1=18;d2=shang/10;d3=shang%10; //显示字母H 和上限温度值 display(); //调用显示函数 if(key1==0) //判断设置键是否按下 { delay(30); //延时去抖 if(key1==0)flag=2; //按键按下,进入设置下限模式 while(key1==0);//松手检测 } if(key2==0) //加键按下 { delay(30); //延时去抖 if(key2==0) //加键按下 { shang+=5; //上限加5 if(shang>=100)shang=100; //上限最大加到100 }while(key2==0);//松手检测 } if(key3==0) //减键按下 { delay(30); //延时去抖 if(key3==0) //减键按下
史海拾趣
|
http://topic.eeworld.net/u/20090807/18/56aa3841-49c4-486a-813e-c639c0e05214.html?41788,从您的回复中看出我们问题很相识,希望得到回复,给您发消息未见回复。… 查看全部问答> |
|
欢迎进入嵌入式软件开发网站讨论单片开发的相关问题 嵌入式软件开发网站首页 http://www.embeddedsoft.cn/ 嵌入式软件开发网站论坛 http://www.embeddedsoft.cn/bbs… 查看全部问答> |
|
怪,怪,怪: 一个winform 中的textBox空件,输入的有值,程序中也能得到,但就是在页面上的显示不见了,变成了什么也没有输入的样子!!!! 有人遇 一个winform 中的textBox空件,输入的有值,程序中也能得到,但就是在页面上的显示不见了,变成了什么也没有输入的样子!!!! 有源程序,请大家帮忙啊!!! 谢谢… 查看全部问答> |
|
想在虚拟机里建个WIN98的驱动开发环境,不知需要准备那些工具? 本来买本教材,不幸的是它里面是用ms v7.0、masm及98DDK来讲解例子的。我从网上找到的98DDK和书里用的DDK还有点不一样。另外我想在虚拟机上做驱动开发调试不知该怎么做?… 查看全部问答> |
|
Bit-banding技术, 即给每个bit位建立一个对应的别名,通过别名来直接访问此bit 1MB的RAM给了32MB的别名空间,一个Byte也就需要8个别名,却给了32个空间,所以将别名空间的低2位不用,常为0.这样就使1MB的RAM空间和32MB的别名空间一一对应了. &n ...… 查看全部问答> |
|
瓦斯监测对于煤矿安全具有重要作用, 煤矿井下终端和监控分站之间的通信对完成瓦斯监测任务起到重要作用 。本系统采用低功耗单片机 MS P 4 3 0 F 1 4 7和 R S 4 8 5总线完成煤矿井下监控分站与远程终端的通信。传感器检测到的瓦斯浓度 ...… 查看全部问答> |
|
以前使用 C2000系列 MCU时,采用TI公司的 IQmath数学库做一些乘除运算,三角函数运算等。最近在学Stellaris系列MCU,发现 IQmath库同样可以应用于 Stellaris系列中,而且应用也很简单,同时大幅提升了计算速度。 … 查看全部问答> |




