❶ 基於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);
}
}