目錄
一、主要功能
二、使用步驟
三、硬件資源
四、軟件設計
五、實驗現象
一、主要功能
1、LCD1602液晶顯示冷藏冷凍溫度值
2、按鍵設置溫度閾值?
3、冷藏或冷凍溫度高于閾值啟動制冷片
4、限位器開關檢測門狀態,開門過長蜂鳴器警報
5、狀態指示燈,串口通信
二、使用步驟
基于51單片機的冰箱控制系統設計通常包含溫度監測、照明燈控制、冰箱門檢測、數據通信、制冷控制及報警功能等核心模塊。
三、硬件資源
1、51單片機核心模塊
2、按鍵模塊
3、溫度傳感器、限位傳感器模塊
4、蜂鳴器模塊,指示燈模塊
5、繼電器模塊
6、LCD1602顯示模塊
四、軟件設計
#include <reg52.h>?? ??? ??? ? //調用單片機頭文件
#include <intrins.h>
#include "lcd1602.h"
#include "DS18B20_One.h"
#include "DS18B20_Two.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define uchar unsigned char ?//無符號字符型 宏定義?? ?變量范圍0~255
#define uint ?unsigned int?? ? //無符號整型 宏定義?? ?變量范圍0~65535
//按鍵引腳定義
sbit key1 = P1^0; ? ?
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit led1 = P1^5; ? ? ? ?//冷藏指示燈
sbit led2 = P1^6; ? ? ? ?//制冷指示燈
sbit led3 = P1^7; ? ? ? ?//照明指示燈
sbit beep = P2^0; ? ? ? //蜂鳴器
sbit door = P2^1; ? ? ? //門檢測開關
sbit relay1 = P3^6; ? ? ? //繼電器1
sbit relay2 = P3^7; ? ? ? //繼電器2
unsigned char setn=0; ? ? ? ? ? ?//記錄設置按鍵按下次數
unsigned char time=60; ? ? ? ? ? //冰箱門未關時間計時
short temperature1 = 0; ? ? ? ? ?//冷藏溫度 ? ? ? ? ?
short temperature2 = 0; ? ? ? ? ?//制冷溫度 ?
short set_temp1 = 15; ? ? ? ? ? //冷藏溫度設置值
short set_temp2 = 10; ? ? ? ? ? //制冷溫度設置值
bit tixingFlag = 0; ? ?//提醒標志
bit shuaxin = 0; ? ? ?//刷新標志
unsigned char Fasong1[] = "T1: 00°C";
unsigned char Fasong2[] = "T2: 00°C";
void time_init(void)?? ? ?//定時器初始化
{
?? ?TMOD |= 0X01;?? ? ?//定時器0工作方式1
? TL0 = 0x00;?? ??? ?
?? ?TH0 = 0x4C; ?//定時器定時50ms
??? ?TR0 = 1;
?? ?ET0 = 1;?? ??? ? ?//開定時器0中斷?
?? ?EA ?= 1;?? ? ?? ? ?//開總中斷
}
void displaySetValue(short temp1,short temp2) ?//顯示設置的值
{
?? ??? ?short value1 = temp1;
?? ? ?short value2 = temp2;
?? ? ?
?? ? ?if(temp1 < 0)
?? ??? ?{
?? ??? ??? ??? ?value1 = -value1;
?? ??? ??? ? ?lcd_write_char(11,0,'-');
?? ??? ?}
?? ? ?else
?? ??? ?{
?? ??? ??? ??? ?lcd_write_char(11,0,' ');
?? ??? ?}
?? ? ?lcd_write_char(12,0,value1/10+'0');
?? ??? ?lcd_write_char(13,0,value1%10+'0');?? ?
?? ??? ?
?? ??? ?if(temp2 < 0)
?? ??? ?{
?? ??? ??? ??? ?value2 = -value2;
?? ??? ??? ? ?lcd_write_char(11,1,'-');
?? ??? ?}
?? ? ?else
?? ??? ?{
?? ??? ??? ??? ?lcd_write_char(11,1,' ');
?? ??? ?}
?? ? ?lcd_write_char(12,1,value2/10+'0');
?? ??? ?lcd_write_char(13,1,value2%10+'0');?? ?
}
void main()
{
?? ??? ?uart_init();
?? ??? ?lcd_init();//1602初始化
?? ??? ?lcd_write_str(0, 0, "T1: 00 C S: 00 C");
?? ??? ?lcd_write_str(0, 1, "T2: 00 C S: 00 C");
?? ? ?lcd_write_char(6,0,0xDF);
?? ? ?lcd_write_char(6,1,0xDF);
?? ? ?lcd_write_char(14,0,0xDF);
?? ? ?lcd_write_char(14,1,0xDF);
?? ? ?displaySetValue(set_temp1,set_temp2);
?? ? ?do{
?? ??? ??? ?temperature1 = DS18B20_TF();
?? ??? ??? ?delay_ms(100);
?? ??? ?}while(temperature1==85);
?? ??? ?do{
?? ??? ??? ?temperature2 = DS18B20_TF2();
?? ??? ??? ?delay_ms(100);
?? ??? ?}while(temperature2==85);
?? ? ?time_init();//定時器初始化
?? ??? ?while(1)
?? ??? ?{
?? ??? ??? ? ?keyscan(); ? ? //按鍵掃描
?? ??? ??? ? ?if(setn == 0 && shuaxin)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ? ?shuaxin = 0;
?? ??? ??? ??? ??? ? ?temperature1 = DS18B20_TF(); ? ?//讀取溫度
?? ??? ??? ??? ??? ? ?if(temperature1<0)
?? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ?temperature1 = -temperature1;
?? ??? ??? ??? ??? ??? ??? ? ?lcd_write_char(3,0,'-');
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ?lcd_write_char(3,0,' ');
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?lcd_write_char(4,0,temperature1/10+'0'); ? ? ? //顯示溫度 ??
?? ??? ??? ??? ??? ??? ?lcd_write_char(5,0,temperature1%10+'0');?? ??? ?
? ? ? ? ? ? temperature2 = DS18B20_TF2(); ? //讀取溫度
?? ??? ??? ??? ??? ? ?if(temperature2<0)
?? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ?temperature2 = -temperature2;
?? ??? ??? ??? ??? ??? ??? ? ?lcd_write_char(3,1,'-');
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ?lcd_write_char(3,1,' ');
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?lcd_write_char(4,1,temperature2/10+'0'); ? ? ? ? ? ?//顯示溫度 ??
?? ??? ??? ??? ??? ??? ?lcd_write_char(5,1,temperature2%10+'0');?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if(temperature1>set_temp1)led1=0;else led1=1; ? ? ? ? ? //冷藏指示燈亮
?? ??? ??? ??? ?if(temperature2>set_temp2)led2=0;else led2=1; ? ? ? ? ? //制冷指示燈亮
?? ??? ??? ??? ?if(temperature1>set_temp1 || temperature2>set_temp2) ? //當溫度超過設定溫度,則開啟制冷
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?relay1 = relay2 = 0;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?relay1 = relay2 = 1;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if(door == 0) ? ?//冰箱門打開
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?led3 = 0; ? ? ? ? ? ? ? ?//照明指示燈亮
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else ? ? ? ? ? ? //冰箱門關閉
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ? ?led3 = 1; ? ? ? ? ? ? ? ?//照明指示關閉
?? ??? ??? ??? ??? ??? ?tixingFlag = 0;
?? ??? ??? ??? ??? ? ?beep = 1; ? ? ? ? ? ? ? //蜂鳴器關閉
?? ??? ??? ??? ??? ??? ?time = 60; ? ? ? ? ? ? //時間重新賦值
?? ??? ??? ??? ?}
?? ??? ?}
}
?
五、實驗現象
演示視頻: