关注分享主机优惠活动
国内外VPS云服务器

电子器件由 MSP430 微控制器、OLED、独立按钮、DS18B20 温度传感器、继电器、排气扇和 LED 灯组成

概要:当温度传感器检测到设备本体内部温度高于设定值时,温度设定器控制风扇开始散发内部热量,低于设定值时停止。 设定时间间隔的温度阈值,显示当前温度,指示工作状态。 为继电器供电。 必须手动清除。 否则,中断将继续发生。

目录

1.设计要求

2.总体设计及系统框图

3.设计方案

4.电路原理图

五、软件设计主程序及子程序

1.设计要求

开度时当定时控制器设定的时间到达时,离子风机和排气扇开始对设备内部进行散热和除尘,离子风机送出的离子风可以使内部变得舒适。 经抗静电处理,内部灰尘由排气扇吸出。 当达到配置的关闭值时,离子风机和排气扇将停止。 当温度传感器检测到设备内部温度高于设定值时,温度设定设备控制风扇开始散发内部热量,当温度低于设定值时,风扇停止。 (OLED显示设定时间间隔、温度阈值、当前温度,LED显示运行状态。)

2、总体设计及系统框图

3. 设计方案

1 DS18B20:温度传感用途DS18B20温度传感器数据。 经过微控制器处理后,与用户设置的温度上限(Tmax)(可以使用键盘更改)进行比较

当前温度 > Tmax:控制风扇激活

2.定时器:时间到达开启值(开启期间),离子风机(继电器1闭合)和排气扇启动(继电器2闭合)。ft:10pt;text[ k4]align:left;">2.) 时间达到终值(关闭期间)启动离子鼓风机(继电器 1 打开)和排气扇(继电器 2 打开)

3.独立按钮

S1:选择按钮

S2:是“额外”功能键。

S3:是“减号”功能键。

4.OLED

(1) 设置完成,选择显示当前温度并开启持续时间、关机时间和温度限制

(2)温度上限设置显示

(3)时间间隔设置(开启时段设置、关闭时段设置)

(4)显示操作模式(手动、自动)

5.LED

(1)LED4指示是否过热

(2) LED3 指示离子风机

(3) LED2 指示排风扇

6. 电源

(1) 3V3 为微控制器供电。

(2) 5V 为继电器、OLED、LED 和 DS18B20 供电。

4、电路原理总图

5、软件设计主程序及子程序 #include # include "oled.h"#include "jidianqi.h"#include"led.h"#include "ds18b20.h"void P2_IODect();void P20_Onclick();void P21_Onclick();void P22_Onclick();void GPIO_init();void WDT_init();void xianshi();unsigned int wendu ;unsigned char m=0,s=0,n=0,h=0,t=0,i=0,j=0,jiange=2;unsigned char chixushijian=2,moshi=4,flaglizi=0,flagchoufenji =0;//moshi=0 当前温度 moshi=1 设置上限 moshi=2 设置开启时间(分钟) moshi=3 设置关闭时间(小时) moshi=4 定时,手动模式 unsigned char wedumax=30; ( void ){ WDTCTL = WDTPW + WDTHOLD; //IO 初始化 __enable_interrupt(); // 启用总中断 OLED_Init(); // 初始化 OLED (); while(1) { if(moshi!= 4) { if(wendu>wendumax){chaowenledon();lizion();choufenon ();} else {chaowenledoff();lizioff();choufenoff(); }} if (j==0){j++;xianshi();} Wendu=get_one_temperture(); }}void WDT_init(){// ----- 设置WDT为1000ms中断 -----WDTCTL=WDT_ADLY_1000;//-----WDT中断使能 可以----- IE1|=WDTIE;}#pragma Vector=WDT_VECTOR__interrupt void WDT_ISR(void){ if(moshi==0){ OLED_ShowNum(70,0,wendu,3 , 16);} s++;if(s==7){s=0;m++;t--;} if(m==60){m=0;h++;} if(moshi== 4 ) { if((h==jiange)&&(i==0)) { i++; Shfenon(); t=Chishshjian+2; } if(t==2){Chowfenov();Rizyov ( );h=0;i=0;t=0;}} if(h==255){h=0;t=0;}}/ ************** * ****************************************************** * ********************************* ****** * 名称: GPIO_Init() * 功能: 按钮和 LED 控制 IO 方向并启用按钮 IO 上的上拉电阻* 输入参数:无* 退出参数:无* 说明:无* 示例:无********* ******** * ********************************************************** ************************** ********/void GPIO_init(){// -----中断参数设置 -----P2DIR &= ~(BIT0+BIT1+BIT2); // 设置为输入(可选) P2IES |= (BIT0+BIT1+BIT2); //设置为下降沿中断 P2IE |= (BIT0+BIT1+BIT2); //使能中断 }/************ ***** * ****************************************************** ***** ******* ************************** ********** * 姓名: PORT2_ISR() * 功能: 响应P2口外部中断服务* 起始参数: 无* 结束参数: 无* 说明: P2.0到P2.8共享PORT1中断 所以要知道是哪个IO触发了外部中断,需要查询PORT2_ISR()*中的标志位P2IFG。 P1IFG 必须手动清零。 否则,PORT2中断将继续发生。 * 示例:无**************************************************** ********** * ****************************************** ********************** ** * ******/#pragma Vector = PORT2_VECTOR__interrupt void PORT2_ISR(void){P2_IODect();测试通过,调用事件处理函数P2IFG=0。 //结束中断前必须手动清除IO口中断标志位} /************************************ ************************************************************ * ************************ * 名称:P2_IODect() * 功能:识别引起中断的具体IO,并调用Masu中断事件处理函数。 。 对应IO * 入口参数:无* 导出参数:无* 说明:该功能兼容所有8 个IO 的检测。 请根据实际输入IO启用“检测码”。 * * 示例:无 ************************************************* ** * ************************************************** * **** *******/void P2_IODect(){unsigned int Push_Key=0;//----- 消除输出IO干扰后触发的中断标志 仅位 -----Push_Key=P2IFG&(0x07);//----- 固定周期延迟 机械抖动区域 避免 - ]----__lay_cycles(10000);//去抖动延迟//----按钮状态与延迟前相同 [ k4]-[ k4]--if((P2IN&Push_Key)==0) //如果按键确实有效{ //--- - 判断哪个IO是否被按下,调用IO事件处理函数。 ----- switch(Push_Key){ case BIT0:P20_Onclick();break; Case BIT1: P21_Onclick();break;P22_Onclick();Break; default:break;//两种情况都添加默认值 } }}/***************************** ****** * ****** ********************************** ****** ****** ******************************** * 名称:P_Onclick () * 功能:P1.3 中断事件处理函数,即按下某个键时 下一步做什么* 开始参数:无* 结束参数:无* 描述:事件处理功能提高了代码的可移植性和可读性* 示例:没有任何************* ******** **************************** ****************** * ****** ********************** **********/void P20_Onclick()//模式转换 moshi =0 当前温度 moshi=1 设置上限 moshi=2 设置开启时间(分钟) moshi=3 设置关闭时间(小时) KEY3{ if(moshi==4){moshi=0 ;OLED_Clear();xianshi();} else if (moshi= =0){moshi=1;OLED_Clear();xianshi();} else if(moshi= =1){moshi=2;OLED_Clear();先师();} else if(moshi==2) {moshi= 3;OLED_Clear();先师();} else if(moshi==3){moshi= 4;OLED_Clear();xianshi();} else if (moshi==4){moshi=0;OLED_Clear();;}}void P21_Onclick()//Value++KEY1{ if(moshi==4){Set_Bit(P2DIR,BIT3);P2OUT ^= BIT3; Set_Bit(P1DIR,BIT5);P1OUT ^= BIT5;}else if( moshi==1) { wedumax++; if(wendumax==255)wendumax=0; OLED_ShowNum(70,4,wendumax,3,16); }else if(moshi==2) { chixushijian++; )chixushijian=0; OLED_ShowNum(70,4,chixushijian,3,16); }else if(moshi==3) { jiange++; if(jiange==255)jiange=0; ,16); }}void P22_Onclick()//值 --KEY2{ if(moshi==4){Set_Bit(P2DIR,BIT4);P2OUT ^= BIT4; = BIT7;}else if(moshi==1) { if(wendumax==0)wendumax=1; Wendumax--; OLED_ShowNum(70,4,wendumax,3,16); ==2) { if(chixushijian==0)chixushijian=1; OLED_Sho;wNum(70,4,chixushijian,3,16); }else if(moshi==3) { if(jiange==0)jiange=1; OLED_ShowNum(70,4,jiange, 3,16); }}void xianshi(){ if(moshi==4) { OLED_Show Chinese(18,0,39,16);//欢迎使用OLED_Show Chinese(36,0,40,16);// OLED_Show Chinese( 54,0,41 ,16);//OLED_Show Chinese(70,0,42,16);//OLED_Show Chinese(0,4,45,16);//当前模式为OLED_Show Chinese(18 , 4,46,16) ;// OLED_显示中文(36,4,52,16);// OLED_显示中文(54,4,53,16);// OLED_显示中文(70,4,47,16); / / OLED_Show Chinese(0,6,48, 16);//手动/定时 OLED_Show Chinese(18,6,49,16); OLED_ShowChar(36,6,"/",16); 50,16); OLED_显示中文(70,6,51,16); } if(moshi==0) { OLED_显示中文(0,0,7,16);//OLED_显示中文(18,0,8, 16 ) if;//在 OLED_ShowChin 之前ese(36,0,9,16);//温度OLED_显示中文(54,0,10,16);//温度OLED_显示中文(0,2,12,16);//温度OLED_显示中文(18,2 ,13, 16);//有限OLED_显示中文(36,2,9,16);//温度OLED_显示中文(54,2,10,16);//度数OLED_ShowNum(70,2,wendumax,3 ,16 ); OLED_Show Chinese(0 ,4,34,16);// 开启时长 OLED_Show Chinese(18,4,35,16);// 开启 OLED_Show Chinese(36,4,28,16);// 开启时长 OLED_Show Chinese(54,4, 36,16) ;//Long OLED_ShowNum(70,4,chixushijian,3,16); OLED_Show Chinese(0,6,37,16);//关闭时长 OLED_Show Chinese(18,6, 38,16);//OLED_Show Chinese(36, 6,28,16);//OLED_Show Chinese(54,6,36, 16);//Long OLED_ShowNum(70,6,jiange,3 ,16);} else if(moshi==1)//moshi= 0 当前温度 moshi=1 设置上限 moshi=2 设置开启时间 分钟 moshi=3 设置关闭时间(小时) { OLED_Show Chinese(0,0,15,16);/ /设置 OLED_显示中文(18,0,16,16); //设置OLED_显示中文(36,0,43,16).//单位 OLED_显示中文(54,0,44,16);// OLED_显示中文(70,0,11,16);// OLED_ShowChar(80,0,"C",16); ,9, 16);//温度OLED_显示中文(18,4,10,16);//度数OLED_显示中文(36,4,12,16);//上升OLED_显示中文(54,4,13, 16) ;//OLED_ShowNum( 70,4,wendumax,3,16);}else if(moshi==2) { OLED_显示中文(0,0,15,16);//OLED_显示中文(18,0, 16,16 );//设置OLED_显示中文(36,0,43,16);//单位OLED_显示中文(54,0,44,16);//OLED_ShowChar(80,0,"m",16); 0,4,34,16); // 打开 OLED_Show Chinese(18,4,35,16); // 打开 OLED_Show Chinese(36,4,28,16). //打开时段 OLED_Show Chinese(54,4,36,16); //长度 OLED_ShowNum(70, 4,chixushijian,3,16);}else if(moshi==3) { OLED_Show Chinese(38,0, 15) ,16);//设置OLED_显示中文(56,0,16,16);//设置OLED_显示中文(36,0,43,16);//单位 OLED_Show Chinese(54,0,44,16);//OLED_ShowChar(80,0,"h",16);//OLED_Show Chinese(0,4,37,16);//关闭时段OLED_Show Chinese( 18,4,38,16);//关闭 OLED_Show Chinese(36,4,28,16);//OLED_Show Chinese(54,4,36) ,16);//Long OLED_ShowNum(70,4 ,jiange,3, 16);} }

注:开发环境为IAR。 如果要为每个模块添加头文件和函数文件,请使用以下内容:

Subroutine

//Subroutine #include "ds18b20.h"#define CPU_F ( (double) 1000000)#define Late_us( x ) __lay_cycles( (long) (CPU_F * (double) x / 1000000.0) )#define Late_ms( x ) __lay_cycles( (long) (CPU_F * (double) x / 1000.0) )/******** ********************************************* **** ** 函数名称: void restart(void) ** 函数功能:ds18b20 复位功能** 输入:无** 输出:无** 说明: ************** ********* **************************/voidreset(void){DQ_out; /* 首先设置为输入端口 */ DQ_0;复位脉冲强制 DQ 为低电平 */delay_us(750); /* 500vs 延迟 */ DQ_1; Late_us(15);}//等待 DS18B20 的响应 //返回 1:未检测到 DS18B20 的存在 //返回 0:有一个 unsigned char DS18B20_Check(void ) { unsigned char retry = 0; //SET PA0 INPUT while (DQ_val && retry = 200) 返回 1. 否则 retry = 0; while (! DQ_val && retry = 240) 返回 1; return 0;}//从DS18B20读取位//返回值:1/0unsigned char DS18B20_Read_Bit(void ) //读取1位{ unsigned char data; //设置PA0输出 DQ_0 (2); ; //设置PA0输入delay_us(12); if (DQ_val) data = 1; else data = 0; //D fromS18B20 读取 1 个字节 // 返回值:读取数据 unsigned char DS18B20_Read_Byte(void) // 读取 1 个字节{ unsigned char i, j, dat; for (i = 1; i 1 } return dat;} //写入字节到DS18B20//dat:写入的字节 void DS18B20_Write_Byte(unsigned char dat){ unsigned char j; unsigned char testb; // 设置 PA0 输出 for (j = 1; j > 1; if (testb) { DQ_0; // 写入 1 Late_us(60); } else { DQ_0; // 写入 0 Late_us ( 2); (void) // ds18B20_Check(); // ROM DS18B20_Write_Byte(0x44); * 读取温度 */unsigned intget_one_Temperature(void){ unsigned int Temp_l = 0, Temp = 0; DS18B20_Check(); DS18B20_Write_Byte(0xbe); // 转换 Temp_l = DS18B20_Read_Byte(); = DS18B20_Read_Byte(); // MSB DS18B20_Start(); // ds1820 转换开始 Temp=(Temp_l>>4)|(Temp_h

未经允许不得转载:主机频道 » 电子器件由 MSP430 微控制器、OLED、独立按钮、DS18B20 温度传感器、继电器、排气扇和 LED 灯组成

评论 抢沙发

评论前必须登录!