首页 > 其他分享 >15.基于51单片机的温控风扇(实物)

15.基于51单片机的温控风扇(实物)

时间:2024-12-14 23:29:14浏览次数:7  
标签:15 uchar 51 扇区 delay 单片机 温度 DQ

15.基于51单片机的温控风扇(实物)

通过百度网盘分享的文件:资料详解
链接:https://pan.baidu.com/s/1zPXLcLmqZAljkgMeU2RT7w?pwd=597l 
提取码:597l 

1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机

2.采用DS18B20温度传感器测温(0-99.9°C),三极管驱动数码管显示温度和风扇的档位。

3.共3个按键:设置、加、减。按一下设置可以设置上限,再按下设置下限,均可以按键加减调整。

4.利用PWM调速,当温度低于下限时,风扇不转动,当温度处于上、下限之间时1档转动(50%的转速),当温度超过上限时,全速转动。

使用说明:

一共3个按键:设置、加、减 按下设置键的时候才可以加减。 按一下设置键,是设置温度的上限,再按下设置键,是设置温度的下限,再按下设置键是退出并保存。

#include<reg51.h>
#include<intrins.h>             //包含头文件
#define uchar unsigned char
#define uint unsigned int         //宏定义

#include "eeprom52.h"

sbit dj=P1^0;//电机控制端接口
sbit DQ=P1^6;//温度传感器接口
//按键接口/
sbit key1=P3^5;//设置温度
sbit key2=P3^6;//温度加
sbit key3=P3^7;//温度减
//
sbit w1=P2^4;
sbit w2=P2^5;
sbit w3=P2^6;
sbit w4=P2^7;              //数码管的四个位
/共阴数码管段选//
uchar 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
uint wen_du;                        //温度变量  
uint shang,xia; //对比温度暂存变量
uchar dang;//档位显示
uchar flag;
uchar d1,d2,d3;//显示数据暂存变量
uchar m;
uchar js;

/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
    SectorErase(0x2000);        //清除扇区
    byte_write(0x2000, shang);    //写上限数值到扇区
    byte_write(0x2001, xia);    //写下限数值到扇区
    byte_write(0x2060, a_a);    //写初始变量到扇区指定位置
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
    shang   = byte_read(0x2000);         //从扇区读取上限数据
    xia = byte_read(0x2001);             //从扇区读取下限数据
    a_a      = byte_read(0x2060);         //从扇区读取初始变量
}

/**************开机自检eeprom初始化*****************/
void init_eeprom() 
{
    read_eeprom();        //先读扇区的数据
    if(a_a != 1)        //判断是否是新单片机(原理:新的单片机扇区里的数据都是0,这里判断是否不等于1。如果是不等于1,就是等于0,那就是新单片机了,就会执行下面的上下限值初始化数值的语句,并让a_a变成1,下次开机就会知道是用过的单片机了就会读取EEPROM里的上下限数据了)
    {
        shang   = 30;    //上限数值初始为30
        xia = 20;        //下限数值初始为20
        a_a = 1;        //初始值变量赋值1,下次开机就会直接读取EEPROM内的上下限数据
        write_eeprom();       //将初始的数据保存进单片机的EEPROM
    }    
}

void delay(uint ms)        //延时函数,大约延时1ms
{
    uchar x;
    for(ms;ms>0;ms--)
        for(x=121;x>0;x--);
}
/***********ds18b20延迟子函数(晶振12MHz )*******/ 
void delay_18B20(uint i)
{
    while(i--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20() 
{
     uchar 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读一个字节**************/  
uchar ReadOneChar()
{
    uchar i=0;
    uchar 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(uchar dat)
{
     uchar i=0;
     for (i=8;i>0;i--)
     {
          DQ=0;
         DQ=dat&0x01;
        delay_18B20(5);
         DQ=1;
        dat>>=1;
    }
}
/**************读取ds18b20当前温度************/
void ReadTemperature()
{
    uchar a=0;
    uchar b=0;
    uchar 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 zi_keyscan()//自动模式按键扫描函数
{
    if(key1==0)                              //设置键按下
    {
        delay(80);                          //延时去抖
        if(key1==0)
        {
            flag=1;                  //再次判断按键,按下的话进入设置状态
            while(key1==0);//松手检测          //按键释放
        }
    }
    while(flag==1)        

 

 

标签:15,uchar,51,扇区,delay,单片机,温度,DQ
From: https://blog.csdn.net/2402_89220103/article/details/144357324

相关文章

  • 14.基于51单片机的智能花盆设计(实物)
    14.基于51单片机的智能花盆设计(实物)通过百度网盘分享的文件:资料详解链接:https://pan.baidu.com/s/1zPXLcLmqZAljkgMeU2RT7w?pwd=597l 提取码:597l 设计简介:基于单片机的智能花盆设计单片机:STC89C52功能:1、通过显示屏显示花盆中土壤的温度、湿度,花盆外光照强度;2、通......
  • 基于UI交互意图理解的异常检测方法15
      1.背景近年来,随着美团多种业务线的扩充和迭代,UI测试的任务愈发繁重。针对UI测试中人工成本过高的问题,美团到店测试团队开发了视觉自动化工具以进行UI界面的静态回归检查。然而,对于UI交互功能逻辑的检验仍强依赖于脚本测试,其无法满足对于进一步效率、覆盖面提升的强烈需求......
  • USACO备考冲刺必刷题 | P1588 Catch That Cow S
    学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考学习过程中的题目,记录每一个瞬间。附上汇总贴:USACO备考冲刺必刷题|汇总-CSDN博客【题目描述】FJ丢失了他的一头牛,他决定追回他的牛。已知FJ和牛在一条直线上,初始位置分别为 x 和 y,假定牛在原地不动。FJ的行走方式......
  • USACO备考冲刺必刷题 | P1596 Lake Counting S
    学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考学习过程中的题目,记录每一个瞬间。附上汇总贴:USACO备考冲刺必刷题|汇总-CSDN博客【题目描述】由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 N×M(1≤N≤100,1≤M≤100)的网格图表示。每个网格中有水(W......
  • 搜索广告召回技术在美团的实践15
     美团搜索广告介绍从美团流量场景角度来看,美团搜索广告分为两大类,一是列表推荐广告;二是搜索广告。推荐广告以展现商家模式为主,通常叫商家流。搜索广告的展现形式比较丰富,有商家模式,即以商家展现为主,会挂上菜品/商品;还有商品模式,即以商品展现为主,以呈现商品大图、商品标题等核......
  • 历年英语四六级真题+解析合集【2015-2024.6】
    前言英语四六级考试,犹如一座横亘在众多学子求学道路上的重要关卡,其重要性不言而喻。回首自己的备考历程,那是一段充满挑战与汗水的时光。在备考期间,我深知优质学习资源对于提升成绩的关键作用,于是四处寻觅,如同在知识的海洋中奋力打捞珍贵的宝藏。幸运的是,经过不懈努力,我终......
  • 2024-2025-1 学号20241315《计算机基础与程序设计》第十二周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12这个作业的目标<写上具体方面>《C语言程序设计》第11章并完成云班课测试作业正文https://www.cnblogs......
  • STM32单片机芯片与内部20 中断管理
    目录一、中断/异常的响应序列1、入栈2、取向量3、更新寄存器二、异常返回三、嵌套中断四、咬尾中断五、晚到异常六、异常返回值七、中断延迟八、异常相应期间的faults1、入栈期间2、出栈期间3、取向量期间4、无效返回时        前面有提到定时器中断......
  • STM32单片机芯片与内部21 电源管理——低功耗 睡眠模式 停止模式 待机模式
    目录一、SMT32电源框图1、ADC电源与参考电压VDDA2、调压器供电电路VDD/1.8V3、备份域电路二、电源监控器1、上电复位与掉电复位(POR与PDR)2、可编程电压检测器PVD三、功耗模式1、睡眠模式2、停止模式3、待机模式        电源对电子设备的重要性不言而喻,它......
  • 5、多线程-按顺序调用,A->B->C,AA 打印 5 次,BB 打印10 次,CC 打印 15 次,重复 10 次
    题目多线程按顺序调用,A->B->C,AA打印5次,BB打印10次,CC打印15次,重复10次代码示例usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;publicclassABCPrinter{ privateintrepeatCount; privateintaPrintCount; privateintbPrintCount; ......