❶ 基于51单片机,温湿度无线检测系统设计
单片机温度控制系统的设计
http://www.tabobo.cn/soft/20/233/2007/233428910074.html
摘 要
随着电子技术的发展,特别是随着大规模集成电路的产生,给人们的生活带来了根本性的变化,如果说微型计算机的出现使现代的科学研究得到了质的飞跃,那么可编程控制器的出现则是给现代工业控制测控领域带来了一次新的革命。在现代社会中,温度控制不仅应用在工厂生产方面,其作用也体现到了各个方面。
随着人们生活质量的提高,酒店厂房及家庭生活中都会见到温度控制的影子,温度控制将更好的服务于社会目前,单片机控制器在从生活工具到工业应用的各个领域,例如生活工具的电梯、工业生产中的现场控制仪表、数控机床等。尤其是用单片机控制器改造落后的设备具有性价比高、提高设备的使用寿命、提高设备的自动化程度的特点。
现代工业设计、工程建设及日常生活中常常需要用到温度控制,早期温度控制主要应用于工厂中,例如钢铁的水溶温度,不同等级的钢铁要通过不同温度的铁水来实现,这样就可能有效的利用温度控制来掌握所需要的产品了。
随着社会的发展,人们对食品温度的控制要求也越来越高,对于低温冷藏车的温度控制也就相应的不断提高,而我设计的低温冷藏车就是为了达到这样的温度控制要求而进行设计的。我所采用的控制芯片为AT89C51,此芯片功能强大,能够满足设计要求。通过对电路的设计,对芯片的外围扩展,来达到对冷藏车温度的控制和调节功能。
关键字:AT89C51单片机、温度 、软件设计
目 录
摘 要………………………………………………………………………………6
目 录………………………………………………………………………………7
第一章 绪 论
1-1概述………………………………………………………………………………9
1-2温度控制的总体设计和思路……………………………………………………9
1-3温度控制方框图…………………………………………………………………10
1-4温度巡回测量控制仪基本要求…………………………………………………10
1-5发挥部分…………………………………………………………………………10
第二章 单片机AT89C51的结构和原理
2-1 AT89C51单片机的结构…………………………………………………………11
2-2 AT89C51单片机主要特性………………………………………………………11
2-3 AT89C51单片机引脚功能说明…………………………………………………11
2-4复位电路…………………………………………………………………………12
2-5时钟电路…………………………………………………………………………13
第三章 温度控制的硬件设备
3-1采样系统及温度传感器的选择
3-1-1采样系统…………………………………………………………………15
3-1-2温度传感器的选择………………………………………………………15
3-2集成运放的选择
3-2-1放大系统. ………………………………………………………………16
3-2-2集成运放的选择…………………………………………………………16
3-3控制系统及光电耦合器的选择
3-3-1控制系统…………………………………………………………………17
3-3-2光电耦合器的选择………………………………………………………17
3-4 A/D转换器的选择及介绍………………………………………………………18
3-5 显示系统及显示器的选择
3-5-1显示系统…………………………………………………………………18
3-5-2显示器的选择……………………………………………………………19
3-6电源电路…………………………………………………………………………20
第四章 温度控制的软件设计
4-1程序模块化处理………………………………………………………………22
4-2内RAM资源配置………………………………………………………………22
4-3程序清单
4-3-1程序入口地址……………………………………………………………22
4-3-2主程序……………………………………………………………………22
4-3-3显示程序…………………………………………………………………23
4-3-4定时器中断子程序………………………………………………………26
4-3-5温度检测子程序…………………………………………………………27
4-3-6温度控制子程序…………………………………………………………28
4-3-7报警子程序………………………………………………………………29
4-3-8键盘子程序用于调节设定值……………………………………………29
第五章 调试及小结
5-1单片机温度控制系统的工作原理……………………………………………32
5-2温度检测和A/D转换电路图……………………………………………………32
5-3测试报告………………………………………………………………………32
小 结………………………………………………………………………………34
致 谢………………………………………………………………………………35
参考文献……………………………………………………………………………36
是否可以解决您的问题?
❷ 基于51单片机的温湿度报警系统设计
加语音模块报温度和湿度
加万年历
加蓝牙模块,写个APP与手机无缝对接
加串口模块,写个上位机,可以在电脑上查看和控制你的系统
……………………
实在是太多了
❸ 用51单片机实现温湿度的调节
那两个东西直接用继电器控制一下就可以了,看你电源用什么,如果市电就买最普通的。
有问题追问,你是搞科创的吧。
❹ 求设计基于51单片机的温湿度计
感觉没什么东西啊~~单片机控制基于I2C总线的SHT10系列数字温湿度传感器的温湿度值,不用处理直接做个类型转换就可以送LED示。然后在程序里加个对所采数据的比较,超过或低于设置值就让蜂鸣器响。
没什么硬件,就一个单片机最小系统,一个温湿度传感器加一个数码管显示电路,再接个蜂鸣器全搞定。
你把18B20换成SHT10(其他温湿度传感器也可以)再加一根线,因为18B20是单总线的。再到网上当一个驱动程序就好了。找不到的话找我,我发给你。
❺ 基于89C51单片机控制的智能湿度控制系统C语言程序
#define DATA P1_1
#define SCK P1_0
#define ACK 1
#define noACK 0
#define MEASURE_TEMP 0x03 //测量温度命令
#define MEASURE_HUMI 0x05 //测量湿度命令
//读温湿度数据
char s-measure(unsigned char *p- value, un-signed char *p_checksum, unsigned char mode)
{
unsigned char error=0;
unsigned int i;
s_transstart(); //传输开始
switch(mode){
case
TEMP:error+=s_write_byte(measure_temp);
break;
case
HUMI:error+=s_write_byte(measure_humi);break;
default:break;
}
for(i=0;i<65535;i++) if(DATA==0) break;
if (DATA) reeor+=1;
*(p_value)=s_read_byte(ACK);
*(p_value+1)=s_read_byte(ACK);
*p_checksum=s_read_byte(noACK);
return error;
}
//温湿度值标度变换及温度补偿
void calc_sth15(float *p_humidity,float *p_tempera-ture)
{
const float c1=-4.0;
const float c2=0.0405;
const float c3=-0.0000028;
const float t1=-0.01;
const float t2=0.00008;
float rh=×p_humidity;
float t=×p_temperature;
float rh_lin;
float th_ture;
float t_c;
t_c=t×0.01-40;
rh_lin=c3×rh×rh+c2×rh+c1;
trh_ture=(t_c-25)×(t1+t2×rh)+rh_lin;
×p_temperature=t-c;
×p_humidity=rh_ture;
}
//从相对温度和湿度计算露点
char calc_dewpoint(float h,float t)
{float logex,dew_point;
logex=0.66077+7.5×t/(237.3+t)+[log10(h)-2];
dew_point=(logex-0.66077)×237.3/(0.66077+7.5-logex);
return dew_point;
}
❻ 基于单片机AT89C51的家用温湿度计的设计
AM2301 proteus仿真中好像没有吧。SHT11和SHT10都有。
❼ 求一份基于51系列单片机的数字式温湿度计的单片机课程设计报告,要求如下
数字式温湿度传感器可以选择sht20,直接输出数字信号,与单片机通过io口通讯,单片机驱动数码管显示温湿度数据,可以选择两组数码管分别显示温度和湿度,也可以使用一组数码管交替显示温度和湿度。
❽ 求一份基于51单片机的家用温湿度表的设计
这里有份程序是华清远见出的一本单片机书中的程序,只能给你模仿,1602液晶屏显示,
/********************************************
读取DS18B20温度,通过LCD1602显示出来
第一行: 实时温度值
第二行: 最大值和最小值
********************************************/
/*头文件*/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define _Nop() _nop_()
sbit DQ =P2^2; //定义DS18B20通信端口
sbit lcd_rs_port = P3^5; /*定义LCD控制端口*/
sbit lcd_rw_port = P3^6;
sbit lcd_en_port = P3^4;
#define lcd_data_port P0
////////////////////////////////////////
sbit WELA=P2^7; //数码管的位选信号
void delay1 (void)//关闭数码管延时程序
{
int k;
for (k=0; k<1000; k++);
}
//////////////////////////////////////
//////////////以下是LCD1602驱动程序////////////////
void lcd_delay(uchar ms) /*LCD1602 延时*/
{
uchar j;
while(ms--){
for(j=0;j<250;j++)
{;}
}
}
void lcd_busy_wait() /*LCD1602 忙等待*/
{
lcd_rs_port = 0;
lcd_rw_port = 1;
lcd_en_port = 1;
lcd_data_port = 0xff;
while (lcd_data_port&0x80);
lcd_en_port = 0;
}
void lcd_command_write(uchar command) /*LCD1602 命令字写入*/
{
lcd_busy_wait();
lcd_rs_port = 0;
lcd_rw_port = 0;
lcd_en_port = 0;
lcd_data_port = command;
lcd_en_port = 1;
lcd_en_port = 0;
}
void lcd_system_reset() /*LCD1602 初始化*/
{
lcd_delay(20);
lcd_command_write(0x38);
lcd_delay(100);
lcd_command_write(0x38);
lcd_delay(50);
lcd_command_write(0x38);
lcd_delay(10);
lcd_command_write(0x08);
lcd_command_write(0x01);
lcd_command_write(0x06);
lcd_command_write(0x0c);
}
void lcd_char_write(uchar x_pos,y_pos,lcd_dat) /*LCD1602 字符写入*/
{
x_pos &= 0x0f; /* X位置范围 0~15 */
y_pos &= 0x01; /* Y位置范围 0~ 1 */
if(y_pos==1) x_pos += 0x40;
x_pos += 0x80;
lcd_command_write(x_pos);
lcd_busy_wait();
lcd_rs_port = 1;
lcd_rw_port = 0;
lcd_en_port = 0;
lcd_data_port = lcd_dat;
lcd_en_port = 1;
lcd_en_port = 0;
}
void lcd_bad_check() /*LCD1602 坏点检查*/
{
char i,j;
for(i=0;i<2;i++){
for(j=0;j<16;j++) {
lcd_char_write(j,i,0xff);
}
}
lcd_delay(200);
lcd_delay(200);
lcd_delay(200);
lcd_delay(100);
lcd_delay(200);
lcd_command_write(0x01); /* clear lcd disp */
}
//////////////////以上是LCD1602驱动程序////////////////
//////////////////以下是DS18B20驱动程序////////////////
//延时函数
void delay(unsigned int i)
{
while(i--);
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--){
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ) dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--){
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
}
//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625; //将温度的高位与低位合并
t= tt*10+0.5; //对结果进行4舍5入
return(t);
}
//////////////////以上是DS18B20驱动程序////////////////
/*定义数字ascii编码*/
unsigned char mun_char_table[]={"0123456789abcdef"};
unsigned char temp_table[] ={"Temp: . 'C"};
unsigned char temp_high_low[]={"H: . L: . "};
/*1MS为单位的延时程序*/
void delay_1ms(uchar x)
{
uchar j;
while(x--){
for(j=0;j<125;j++)
{;}
}
}
main()
{
unsigned int i=0;
unsigned int temp_high;
unsigned int temp_low;
ReadTemperature(); /*读取当前温度*/
lcd_system_reset(); /*LCD1602 初始化*/
////////////////////////////////////////////////////////////////
P0=0XFF;//关掉数码管的位选信号。阻止数码管受到P0口信号的影响。
delay();
WELA=1;
delay();
WELA=0;
////////////////////////////////////////////////////////////////
lcd_bad_check(); /*LCD1602 坏点检查*/
for (i=0;i<12;i++) lcd_char_write(i,0,temp_table[i]);
for (i=0;i<16;i++) lcd_char_write(i,1,temp_high_low[i]);
i=ReadTemperature(); /*读取当前温度*/
temp_high = i;
temp_low = i;
while(1){
i=ReadTemperature(); //读取当前温度
if(temp_high<i) temp_high=i;
if(temp_low>i) temp_low=i;
lcd_char_write(6,0,mun_char_table[i/100]); /*把温度显示出来*/
lcd_char_write(7,0,mun_char_table[i%100/10]);
lcd_char_write(9,0,mun_char_table[i%10]);
lcd_char_write(2,1,mun_char_table[temp_high/100]); /*显示最高温度*/
lcd_char_write(3,1,mun_char_table[temp_high%100/10]);
lcd_char_write(5,1,mun_char_table[temp_high%10]);
lcd_char_write(10,1,mun_char_table[temp_low/100]); /*显示最低温度*/
lcd_char_write(11,1,mun_char_table[temp_low%100/10]);
lcd_char_write(13,1,mun_char_table[temp_low%10]);
delay_1ms(100);
}
}