### 温控风扇程序知识点解析 #### 一、程序概述 本程序主要实现了基于单片机的温度控制风扇系统,采用C语言编写。程序通过DS18B20温度传感器采集温度数据,并根据读取到的温度值来控制风扇的工作状态。此外,还通过数码管显示当前的温度值。 #### 二、程序结构与功能分析 ##### 1. 定义与初始化 程序首先定义了必要的变量和位操作符号,例如: - `#include "reg51.h"`:包含了单片机的基本寄存器头文件。 - `sbit DQ=P3^6;`:定义了DS18B20的总线引脚为P3.6。 - `sbit wx1=P1^0; //位选1`:定义了数码管的位选信号,用于选择不同的数码管进行显示。 - `ucharcodetable[]={...}`:定义了一个数组,用于存储数字对应的数码管显示代码。 ##### 2. 延时函数 - `void delay1(unsigned int m)`:实现较短时间的延时,主要用于数码管的显示切换。 - `void delay(unsigned int m)`:实现较长时间的延时,主要用于温度传感器的数据采集等待。 ##### 3. DS18B20 初始化与读写操作 - `void Init_DS18B20()`:初始化DS18B20温度传感器,设置通信协议。 - `uchar ReadOneChar()`:从DS18B20读取一个字节的数据。 - `void WriteOneChar(unsigned char dat)`:向DS18B20写入一个字节的数据。 ##### 4. 温度读取与处理 - `void ReadTemperature()`:此函数负责启动温度转换,并读取温度值。具体步骤如下: - 初始化DS18B20,发送跳过ROM命令(0xCC)和启动温度转换命令(0x44)。 - 等待温度转换完成后,再次初始化DS18B20,发送跳过ROM命令(0xCC)和读取刮码寄存器命令(0xBE)。 - 分别读取高低两个字节的数据,并组合成最终的温度值。 - 处理温度值,包括整数部分和小数部分。 ##### 5. 温度显示 - `void wenduxianshi()`:此函数将读取到的温度值显示在数码管上。具体实现为: - 分别设置四位数码管的位选信号,依次显示温度的个位、十位、小数点后的个位以及单位符号(℃)。 ##### 6. 主循环 - `void main()`:主函数中循环调用`ReadTemperature()`获取温度,并调用`wenduxianshi()`进行温度显示。 #### 三、关键知识点详解 1. **DS18B20 温度传感器**: - DS18B20 是一种数字温度传感器,具有高精度和简单的单总线接口。该传感器可以直接输出摄氏温度值,便于处理。 - 通过发送特定的命令来与DS18B20通信,如跳过ROM命令(0xCC)、启动温度转换命令(0x44)和读取刮码寄存器命令(0xBE)等。 - 读取的数据需经过一定的处理才能得到准确的温度值,包括高低字节的组合以及整数和小数部分的分离。 2. **数码管显示**: - 数码管通常用来显示数字或字符,本程序使用了四位数码管。 - 通过位选信号选择不同的数码管进行显示,每个数码管显示不同的数字或符号。 - 使用预定义的数组来映射数字到对应的显示代码,从而实现温度值的正确显示。 3. **单片机编程技巧**: - 使用位操作符来定义引脚,方便后续的I/O操作。 - 通过延时函数控制程序执行的时间间隔,保证温度传感器数据采集和数码管刷新的准确性。 - 在主循环中不断读取温度并更新显示,实现动态显示的功能。 该程序是一个典型的基于单片机的温度监控系统案例,涵盖了温度传感器的应用、数据处理、数码管显示等多个方面,对于学习嵌入式系统的开发具有很好的参考价值。
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^6; //温度数据口
sbit wx1=P1^0; //位选1
sbit wx2=P1^1; //位选2
sbit wx3=P1^2; //位选3
sbit wx4=P1^3; //位选4
unsigned int temp, temp1,temp2, xs;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, //共阳数码管
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};
/******延时程序*******/
void delay1(unsigned int m)
{
unsigned int i,j;
for(i=m;i>0;i--)
}
void delay(unsigned int m) //温度延时程序
{
while(m--);
}
void Init_DS18B20()
{
unsigned char x=0;
DQ = 1; //DQ复位 ds18b20通信端口
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(4);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
/***********ds18b20读一个字节**************/
uchar ReadOneChar()
{
unsigned char i=0;
unsigned char dat = 0;
剩余5页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助