脸肿脚肿是什么原因引起的| 小孩多动症是什么原因引起的| 罗红霉素胶囊治什么病| 什么东西清肺止咳| 扶正固本是什么意思| 什么是假声| 八字加一笔是什么字| 昭觉寺求什么最灵验| 乌龟喜欢吃什么| 藿香正气水什么牌子的好| 干事是什么职务| 什么人不能吃鸡蛋| 旱魃是什么| 无伤大雅是什么意思| 什么病需要做手术| 心脏骤停是什么原因引起的| 荷花指什么生肖| 五福是什么生肖| 1999年是什么命| 杂面是什么面| 痛风能吃什么东西| 脂肪肝挂什么科室| 桂花是什么颜色的| 腊肉炖什么好吃| md是什么牌子| 得了狂犬病有什么症状| 钙化点是什么意思| 滑石是什么| 魏征字什么| 阴囊上长了几根白毛是什么原因| 13年属什么生肖| 兔子拉稀是什么原因| 不显山不露水是什么意思| 荨麻疹能吃什么| 男人眉心有痣代表什么| 农历三月三是什么日子| 核糖体是什么| 消炎药不能和什么一起吃| 月经为什么叫大姨妈| 尿蛋白高是什么意思| 痔疮吃什么药好得快| 身体冒虚汗什么原因| 阳虚是什么原因引起的| 2008年属什么| 农历七月初七俗称什么| 3月27日是什么星座| 急火攻心是什么生肖| 唐筛都检查什么| 交链孢霉过敏是什么| 黄精长什么样| 面包是什么意思| dc是什么| 胆汁反流吃什么食物好| 小孩割包皮挂什么科室| 土豆发芽到什么程度不能吃| 什么颜色的猫最旺财| 妇科炎症是什么原因引起的| 面包糠是什么做的| 梦见洗澡是什么预兆| 梦到挖坟墓是什么意思| 什么人不能吃猪肝| 长命的动物是什么生肖| 见异思迁什么意思| hl什么意思| 得了子宫肌瘤注意什么| 贡高我慢是什么意思| 湿气太重吃什么排湿最快| 女人做梦梦到蛇是什么意思| 喝老陈醋有什么好处| jet是什么意思| 经期吃榴莲有什么好处| 女人梦见蛇是什么预兆| 妈妈吃什么帮宝宝排气| 民族是什么意思| 果酸是什么| ENBD手术全称是什么| 幽门螺杆菌吃什么药好| 肺炎吃什么消炎药| 加拿大货币叫什么| 硬化是什么意思| 什么情况下打破伤风针| 维生素b6有什么作用和功效| yair是什么牌子的空调| 领英是什么| 为什么哭了眼睛会肿| 一热就头疼是什么原因| 欲钱看正月初一是什么生肖| hcg值是什么| 颌下腺肿大是什么原因| 胃痛看什么科| 92年出生属什么生肖| 刘五行属什么| 今年的属相是什么生肖| 末梢神经炎是什么症状| 吃什么能安神助睡眠| 奄奄一息是什么意思| 吃过饭后就想拉大便是什么原因| 渗湿是什么意思| 妤字属于五行属什么| 挺拔的意思是什么| 梦见飞机是什么意思| 鲁班姓什么| 什么食物对肺有好处| 肛门镜检查能查出什么| 唏嘘什么意思| 舌头开裂吃什么药| 夏的五行属什么| 中考报名号是什么| 一个口一个有念什么| 做完磁共振要注意什么| 什么人群不适合吃阿胶糕| 生不如死是什么意思| 拉肚子是什么原因引起的怎么办| 1月9号是什么星座| 单亲家庭什么意思| 感冒咳嗽吃什么药止咳效果好| 孩子呕吐是什么原因| 做背有什么好处及作用| 宫颈肥大是什么原因造成的| 宫颈癌什么症状| 经常放屁是什么病| 印度人是什么人种| 月经期间吃西瓜有什么影响| 腰闪了是什么症状| 甲状腺结节3类什么意思| 断子绝孙是什么意思| 右侧肋骨下面是什么器官| 乳糖不耐受喝什么奶粉| 法国铁塔叫什么名字| 玩得什么| 打眼是什么意思| 抗战纪念日为什么是9月3日| 血氨是什么| 耳朵后面长痘痘是什么原因| 龟头有红点用什么药| 党的性质是什么| 淋巴清扫是什么意思| 1953年是什么生肖| 为什么会口臭| 进展是什么意思| 什么情况下需要做心脏支架| 醋泡什么壮阳最快| 睡美人最怕什么脑筋急转弯| 38度吃什么药| 英国为什么要脱欧| 实证是什么意思| 三维是什么| 军士长是什么军衔| 冬天怕冷夏天怕热是什么原因| cu什么意思| 三有动物是什么意思| 什么是修辞手法| 什么重什么轻| 眩晕症吃什么药| 无犯罪证明需要什么材料| 喜欢吃什么| 宫寒有什么症状| 吃葱有什么好处和坏处| 枸橼酸西地那非片有什么副作用| 头发硬适合什么发型| 吃什么可以增强抵抗力和免疫力| 麻疹是什么症状| 李白字什么号什么| 病理报告是什么| 体力不支是什么意思| 自什么自什么| 什么是鸡冠油| 老年人口干是什么原因| 内服什么可以美白全身| 西辽国在现今什么地方| 什么能让虱子卵脱落| 冰醋酸是什么| 排卵的时候有什么症状| 南瓜不能和什么同吃| 硬下疳是什么样子| 放疗为什么死得更快| 水由什么构成| 推车是什么意思| 感染梅毒有什么症状| 高危妊娠是什么意思啊| 怀孕了用排卵试纸测会显示什么| 晗是什么意思| 12月14是什么星座| 头里面有肿瘤有什么症状| 女性得疱疹是什么症状| 剥离是什么意思| 子宫前位和子宫后位有什么区别| 女人左下腹部疼痛什么原因| 三文鱼为什么可以生吃| 有肾病的人吃什么好| 全科门诊主要看什么| 胃疼恶心吃什么药效果好| 孙策字什么| 查血糖挂什么科| 鼻梁有横纹是什么原因| 小孩子不吃饭是什么原因引起的| 感冒嗓子疼吃什么药| 狗发烧吃什么药| 安宫牛黄丸治什么病| 感冒挂什么科| 胸膜炎挂什么科| 金银花有什么功效和作用| 喝豆腐脑有什么好处和坏处| 畅字五行属什么| 阳历九月份是什么星座| 会考没过有什么影响| 11月14日什么星座| 霖五行属性是什么| 长沙有什么景点| carrots是什么意思| 二级以上医院是什么意思| 东施效颦的意思是什么| 破釜沉舟是什么意思| 辣椒炒什么好吃| 姓蔡的女孩起什么名字| 左眼屈光不正是什么意思| 尿酸高适合吃什么食物| 抬头纹开了是什么意思| 辅酶q10什么时间吃好| 一躺下就咳嗽是什么原因| 怀孕从什么时候开始算起| 覆盆子有什么作用| 吃海鲜喝什么酒| 房性心动过速是什么意思| 美女的阴暗是什么样的| 143是什么意思| 梦见捡硬币是什么预兆| 孕早期有什么症状| 什么时候有雨| 腿麻脚麻用什么药能治| 神经内科看什么病的| 子夜是指什么时间| 完全性右束支传导阻滞是什么意思| 做梦梦到钱是什么预兆| 牛皮癣是什么样的| 肚脐周围疼痛是什么原因| 金匮肾气丸主治什么病| 凌晨两点半是什么时辰| 十一月什么星座| 什么地方| 总爱放屁是什么原因| 喊6个1是什么意思| 倭瓜是什么瓜| 为什么生化妊娠是好事| 脚干裂用什么药膏| 咳嗽吃什么| 1935年属什么| 筒骨炖什么好吃| 手术后为什么不让睡觉| 玉米热量高为什么还减肥| 安抚奶嘴什么时候开始用| 爱啃指甲是什么原因| 1月28号是什么星座| 数字7五行属什么| 吃什么食物可以降低胆固醇| 树欲静而风不止什么意思| 肾疼是因为什么| 二十四节气分别是什么| 前轮轴承坏了会有什么症状| 二尖瓣轻度反流是什么意思| 脚浮肿是什么原因| 痛风吃什么食物好| 什么菜好吃| mchc偏低是什么意思| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 嵌入式开发 ? STM32 ? 【原创】STC89C52简易散热系统--from棚

共4条 1/1 1 跳转至

【原创】STC89C52简易散热系统--from棚

工程师
2025-08-04 11:58:32     打赏
百度 政府推行完全不加行政干涉的自由放任经济政策(laissezfaireeconomics),财政部长安德鲁·W·梅隆更是把附加税由50%削减至20%。

图片1.png

思路:通过DS18B20测量温度,与设定值进行比较,温度高于设定值启动直流电机风扇降温。低于设定温度时电机停止。

主要模块:DS18B20温度传感器、直流电机驱动、onewire通信协议、定时器扫描按键。

重点为DS18B20的读写,和onewire通信协议的使用,定时器扫描按键。

一. onewire通信协议的使用

 

1.onewire不同的时序结构

1) 初始化时序

单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平

时间至少 480us(该时间的时间范围可以从 480 960 微妙),以产生复位脉

冲。接着主机释放总线,外部的上拉电阻将单总线拉高,延时 1560 us,并进

入接收模式。接着 DS18B20 拉低总线 60~240 us,以产生低电平应答脉冲,若

为低电平,还要做延时,其延时的时间从外部上拉电阻将单总线拉高算起最少要

480 微妙。初始化时序图如下: 

图片2.png

2)写时序

写时序包括写 0 时序和写 1 时序。所有写时序至少需要 60us,且在 2

独立的写时序之间至少需要 1us 的恢复时间,两种写时序均起始于主机拉低总

线。写 1 时序:主机输出低电平,延时 2us,然后释放总线,延时 60us。写 0

时序:主机输出低电平,延时 60us,然后释放总线,延时 2us。写时序图如下:

图片3.png

3)读时序

单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出

读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少

需要 60us,且在 2 次独立的读时序之间至少需要 1us 的恢复时间。每个读时

序都由主机发起,至少拉低总线 1us。主机在读时序期间必须释放总线,并且在

时序起始后的 15us 之内采样总线状态。读时序图如下:

典型的读时序过程为:主机输出低电平延时 2us,然后主机转入输入模式延时 12us,然后读取单总线当前的电平,然后延时 50us

图片4.png

#include <REGX52.H>

#include "INTRINS.H"

sbit DQ=P3^7;

unsigned char OneWire_Init()  //开始指令

{

char i,Reception;

EA=0;

DQ=1;

DQ=0;

_nop_();i = 247;while (--i);  //延时

DQ=1;

_nop_();i = 32;while (--i);

Reception=DQ;

_nop_();i = 247;while (--i);

EA=1;

return Reception;

}

 

void Send_Bit(unsigned char Bit)  //发送一位

{

unsigned char i;

EA=0;

DQ=1;

DQ=0;

_nop_();i = 4;while (--i);

DQ=Bit;

_nop_();i = 24;while (--i);

DQ=1;

EA=1;

}

 

unsigned char Receive_Bit()  //接收一位

{

unsigned char Bit,i;

EA=0;

DQ=1;

DQ=0;

i = 2;while (--i);

DQ=1;

i = 2;while (--i);

Bit=DQ;

_nop_();

i = 24;while (--i);

EA=1;

return Bit;

}

 

void OneWire_SendByte(unsigned char Byte)  //发送一个字节

{

unsigned char i;

for(i=0;i<8;i++)

{

Send_Bit(Byte&(0x01<<i));

}

}

unsigned char OneWire_ReceiveByte()  //接收一个字节

{

unsigned char Byte=0x00,i;

for(i=0;i<8;i++)

{

if(Receive_Bit())Byte|=(0x01<<i);

}


return Byte;

}

 

DS18B20温度传感器

图片5.png

图片6.png

#include <REGX52.H>

#include "OneWire.H"

 

#define SKIP_ROM    0xCC     //跳过ROM

#define Conver  0x44     // 温度更新

#define ReadT_T  0xBE     //读取温度

 

void ConverT()  //温度转换(更新温度)

{

OneWire_Init();

OneWire_SendByte(SKIP_ROM);

OneWire_SendByte(Conver);

}

 

float ReadT()  //读取温度

{

unsigned char TLSB,TMSB;

int Temp;

float T;

OneWire_Init();

OneWire_SendByte(SKIP_ROM);

OneWire_SendByte(ReadT_T);

//将数据合并并转化为浮点数

TLSB=OneWire_ReceiveByte();

TMSB=OneWire_ReceiveByte();

Temp=(TMSB<<8)|TLSB;

T=Temp/16.0;

return T;

}

三、定时器扫描按键

 

通过中断在相同间隔时间内对按下的按键进行扫描消抖,再通过判断两次扫描的结果判断上升沿来确定按键是否按下。

#include <REGX52.H>

 

unsigned char Key_KeyNumber;

 

unsigned char Key(void)

{

    unsigned char Temp = 0;

    Temp = Key_KeyNumber;    // 将全局变量Key_KeyNumber的值赋给Temp,以便后续返回该值

    Key_KeyNumber = 0;      // Key_KeyNumber清零,为下一次记录按键相关情况做准备

    return Temp;                                                                                                

}

 

unsigned char Key_GetState() // 函数Key_GetState用于检测按键的当前状态,根据P3端口特定引脚的电平情况来确定按下的按键对应的编号

{

    unsigned char KeyNumber = 0;    // 定义一个无符号字符型变量KeyNumber,用于存储检测到的按键编号,初始化为0

    if (P3_1 == 0) { KeyNumber = 1; }

    if (P3_0 == 0) { KeyNumber = 2; }

    if (P3_2 == 0) { KeyNumber = 3; }

    if (P3_3 == 0) { KeyNumber = 4; }

    return KeyNumber;

}

 

void Key_Loop(void)     //通过判断定时器中断每段扫描后的电平变化,来判断按键是否被按下

{

    static unsigned char NowState, LastState;    // NowState用于记录按键的当前状态,LastState用于记录按键的上一次状态

    // 静态变量在函数多次调用之间能保持其值,便于对比前后状态变化

    LastState = NowState;    // 将当前状态赋值给上一次状态变量LastState,用于记录之前的状态

    NowState = Key_GetState();    // 获取当前按键的状态并赋值给NowState变量

    if (LastState == 1 && NowState == 0)

    {

        Key_KeyNumber = 1;

    }                                                                                                                                         

 

    if (LastState == 2 && NowState == 0)

    {

        Key_KeyNumber = 2;

    }

 

    if (LastState == 3 && NowState == 0)

    {

        Key_KeyNumber = 3;

    }

 

    if (LastState == 4 && NowState == 0)

    {

        Key_KeyNumber = 4;

    }

}

四、主函数

 

#include <REGX52.H>

#include "LCD1602.H"

#include "Timer0.H"

#include "DS18B20.H"

#include "Delay.H"

#include "Key.H"

 

sbit Motor = P1^0;// 定义电机控制引脚

float T;// 用于存储温度值

char STD = 28;// 存储设定温度值,为28

char KeyNum;// 用于存储按键的键值

 

// 函数功能:在LCD1602上显示当前温度值

// 具体步骤包括进行温度转换、适当延时后读取温度值,然后根据温度正负情况进行相应的显示处理

// 同时也会在LCD上显示设定温度值相关的符号和数值

 

void Show_Temperature()

{

    ConverT();                           // 调用温度转换函数,启动DS18B20进行温度转换

    Delay(300);                          // 延时300毫秒,等待温度转换完成(这个延时时间根据实际情况调整,确保转换完成)

    T = ReadT();                         // 读取温度传感器DS18B20转换后的温度值,并存储到变量T

    if (T < 0)                           // 如果温度值小于0

    {

        LCD_ShowChar(2, 10, '-');        // LCD1602的第2行第10列显示负号'-'

        T = -T;                          // 将温度值取绝对值,方便后续显示处理(因为显示时一般正数处理更统一)

    }

    else

    {

        LCD_ShowChar(2, 10, '+');       // LCD1602的第2行第10列显示正号'+'

    }

    LCD_ShowChar(2, 14, '.');

    LCD_ShowNum(2, 11, T, 3);

    LCD_ShowNum(2, 15, (unsigned long)(T * 100) % 100, 2);    // LCD1602的第2行第15列开始显示温度值的小数部分(乘以100取余得到两位小数对应的整数)

    if (STD >= 0)                       // 如果设定温度STD大于等于0

    {

        LCD_ShowChar(2, 5, '+');        // LCD1602的第2行第5列显示正号'+'

    }

    if (STD < 0)                        // 如果设定温度STD小于0

    {

        LCD_ShowChar(2, 5, '-');        // LCD1602的第2行第5列显示负号'-'

    }

    if (STD >= 0)                       // 如果设定温度STD大于等于0

    {

        LCD_ShowNum(2, 6, STD, 2);      // LCD1602的第2行第6列开始显示设定温度的整数部分,保留2位有效数字

    }

    else

    {

        LCD_ShowNum(2, 6, -STD, 2);     // LCD1602的第2行第6列开始显示设定温度的绝对值,保留2位有效数字(因为是负数情况)

    }

}

 

//////////////////////////////////////////////////////////////////////////////////////////////////////

void main()

{

//初始化

    Motor = 0;

    ConverT();

    Delay(1000);

    LCD_Init();

    Timer0_Init();

    LCD_ShowString(2, 8, "T:");

    LCD_ShowString(2, 1, "STD:");

    LCD_ShowString(1, 1, "T Control:");


    while (1)

    {

        KeyNum = Key();                     // 检测控制电机开关

        if (STD < T)

            Motor = 1;

        else

            Motor = 0;

        if (KeyNum)                         // 如果有按键按下(即KeyNum不为0

        {

            if (KeyNum == 1)                // 如果按下的是按键K1

            {

                STD++;                      // 设定温度值加1,然后对125取余(防止超出温度合理范围)

                STD %= 125;

            }

            if (KeyNum == 2)                // 如果按下的是按键K2

            {

                STD--;                  // 设定温度值减1

                if (STD < -54)              // 如果设定温度值小于 -54,则将其重置为0(同样是范围限定处理)

                    STD = 0;

            }

        }

        Show_Temperature();        // 调用函数显示当前温度和设定温度相关信息到LCD1602

    }

}

//////////////////////////////////////////////////////////////////////////////////////////////////////

void Routine() interrupt 1  //用于扫描按键

{

    // 用于计数定时器中断的次数

    int T0Count;

    TL0 = 0xCD;

    TH0 = 0xD4;

    T0Count++;

    if (T0Count > 20)

    {

        // 将计数变量清零,重新开始计数

        T0Count = 0;

        // 调用按键扫描循环函数

        Key_Loop();

    }

}



工程师
2025-08-04 13:45:54     打赏
2楼

上个示波器看看波形呀!


院士
2025-08-04 14:47:29     打赏
3楼

谢谢分享。


工程师
2025-08-04 09:38:28     打赏
4楼

上个PID控制一下温度啊


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
慢性胃炎吃什么药 湿气重喝什么茶好 频发室性早搏是什么意思 不知道干什么 94属什么生肖
尖嘴是什么生肖 萝卜炖什么好吃 妊娠反应什么时候开始 医保是什么 生不如死是什么意思
10月30是什么星座 湿热体质吃什么药 生殖感染用什么消炎药效果好 小麦秸秆是什么材质 膝盖疼做什么检查最好
检查甲状腺挂什么科 什么是川崎病是什么病 西双版纳有什么好玩的地方 孩子说话晚是什么原因 诸葛亮是个什么样的人
脚板疼是什么原因hcv9jop5ns7r.cn 粘土是什么土hcv8jop2ns0r.cn 唐宝是什么意思hcv9jop7ns2r.cn 一人一口是什么字huizhijixie.com 和解少阳是什么意思hcv7jop5ns0r.cn
喉咙嘶哑吃什么药hcv9jop2ns1r.cn 什么眉头hcv8jop1ns2r.cn 四面八方指什么生肖hcv8jop0ns1r.cn 王羲之兰亭序是什么字体1949doufunao.com 胸部什么时候停止发育hcv8jop3ns1r.cn
只出不进什么意思ff14chat.com 什么是精神出轨hcv8jop0ns3r.cn 女人喝什么茶最好hcv7jop6ns3r.cn 男性尿道痒吃什么药hcv9jop3ns9r.cn 蚊虫叮咬涂什么药hcv8jop7ns3r.cn
八九年属什么xscnpatent.com 红肉是什么hcv9jop4ns0r.cn 蔓越莓是什么水果hcv8jop3ns9r.cn 黄飞鸿是什么生肖adwl56.com 脉沉细是什么意思hcv9jop2ns3r.cn
百度