标题:
单片机空调温度控制器设计(全套资料仿真原理图程序)
[打印本页]
作者:
屿浪大魔王
时间:
2019-8-16 17:16
标题:
单片机空调温度控制器设计(全套资料仿真原理图程序)
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char//宏定义
#define uint unsigned int
////////////////////全局变量/////////////////////////////
float TEMP_NOW=0.0;
float TEMP_SET=21.0;
uint T_Count=0;
uint S_Count=0;
uint P_Count=0;
uint N_Count=0;
uint M_Count=1;
#define K_UP 0X20//定义键值
#define K_DOWN 0X21
#define K_CLEAR 0X24
#define K_OK 0X25
#define K_ONE 0X30
#define K_FOUR 0X31
#define K_SEVEN 0X32
#define K_POINT 0X33
#define K_TWO 0X34
#define K_FIVE 0X43
#define K_EIGHT 0X36
#define K_ZERO 0X37
#define K_THREE 0X38
#define K_SIX 0X40
#define K_NINE 0X41
#define K_SET 0X42
extern float TEMP_NOW;
extern float TEMP_SET;
extern uint T_Count;
extern uint S_Count;
extern uint P_Count;
extern uint N_Count;
extern uint M_Count;
extern uchar Current_Temp_Display_Buffer[];
extern uchar set_Temp_Display_Buffer[];
extern int sel;
sbit lcden=P2^7;//液晶使能
sbit lcdrs=P2^6;//液晶数据/命令选择端
sbit DQ =P3^7;//DS18B20数据端
sbit XX =P2^5;//读写选择端
sbit cold =P2^0;//输出信号
sbit warm =P2^1;//输出信号
uchar Current_Temp_Display_Buffer[]={" NOW: 00.0"};
uchar set_Temp_Display_Buffer[]= {" SET: 38.0"};
int sel=0;
uchar code KeyCodeTable[]=
{
0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88
};
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
uchar code Temperature_Char[8] = {0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT = 0;
uchar Temp_Value[]={0x00,0x00};
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK = 1;
void Read_Temperature();
void Display_Temperature();
void Comparison();
//////////////////////定时///////////////////////////////
void timer0_init(void)
{
TMOD = 0x00 ; //设置定时器0的工作方式
TH0 = (8192-5000)/32;//单片机晶振为12MHz,机器周期为1us,t=5ms,
//N=5000/1=5000
TL0 = (8192-5000)%32;
IE = 0x82;
TR0=1;
}
void timer0() interrupt 1
{
TH0 = (8192-5000)/32;
TL0 = (8192-5000)%32;
if(++T_Count == 100) //////100为0.5s
{
TR0=0;
Read_Temperature();
Display_Temperature() ;
T_Count=0;
if(++P_Count == 6)
{
N_Count=1;
}
TR0=1;
}
}
void delay1(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //写命令函数
{
lcdrs=0; //选择写命令模式
P0=com; //将要写的命令字送到数据总线上
delay1(5); //稍作延时以待数据稳定
lcden=1; //使能端给一高脉冲,因为初始化函数中已经将lcden置零
delay1(5); //稍作延时
lcden=0; //将使能端置0完成高脉冲
}
void write_date(uchar date) //写数据函数
{
lcdrs=1; //选择写数据模式
P0=date;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
void init_lcd() //初始化函数
{
lcden=0;
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
}
void Print()
{
uchar num;
write_com(0x80);
for(num=0;num<12;num++)
{
write_date(Current_Temp_Display_Buffer[num]);
}
write_date(0xdf);
write_date('C');
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(set_Temp_Display_Buffer[num]);
}
write_date(0xdf);
write_date('C');
}
void Delay_INI(uint x)
{
while(--x);
}
void Delay(unsigned int n)
{
do
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();
n--;
}while(n);
}
uchar Init_DS18B20()
{
uchar status;
DQ = 1;
Delay_INI(8);
DQ = 0;
Delay_INI(90);
DQ = 1;
Delay_INI(8);
status=DQ;
Delay_INI(100);
DQ = 1;
return status;
}
uchar ReadOneByte()
{
uchar i,dat=0;
DQ = 1;
_nop_();
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if(DQ)
dat |= 0X80;
Delay(30);
DQ = 1;
}
return dat;
}
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat& 0x01;
Delay(5);
DQ = 1;
dat >>= 1;
}
}
void Read_Temperature()
{
if(Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xcc);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0xbe);
Temp_Value[0] = ReadOneByte();
Temp_Value[1] = ReadOneByte();
DS18B20_IS_OK=1;
}
}
void Display_Temperature()
{
uchar t = 150, ng = 0;
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1] = ~Temp_Value[1];
Temp_Value[0] = ~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng = 1;
}
Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];
CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
Display_Digit[3] = CurrentT/100;
Display_Digit[2] = CurrentT%100/10;
Display_Digit[1] = CurrentT%10;
Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';
Current_Temp_Display_Buffer[10] = '.';
Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';
Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';
Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';
TEMP_NOW=Display_Digit[2]*10+Display_Digit[1]+Display_Digit[0]*0.1 ;
if(Display_Digit[3] == 0)
Current_Temp_Display_Buffer[7] = ' ';
if(Display_Digit[2] == 0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8] = ' ';
if(ng)
{
TEMP_NOW=-(Display_Digit[2]*10+Display_Digit[1]+Display_Digit[0]*0.1);
if(Current_Temp_Display_Buffer[8] == ' ')
Current_Temp_Display_Buffer[8] = '-';
else if(Current_Temp_Display_Buffer[7] == ' ')
Current_Temp_Display_Buffer[7] = '-';
else
Current_Temp_Display_Buffer[6] = '-';
}
}
void Delay_key()
{
uchar i;
for(i=0;i<200;i++);
}
uchar Keys_Scan()
{
uchar sCode,kCode,k;
P1 = 0xf0;
if((P1&0xf0)!=0xf0)
{
Delay_key();
if((P1&0xf0)!=0xf0)
{
sCode = 0xfe;
for(k=0;k<4;k++)
{
P1 = sCode;
if((P1&0xf0)!=0xf0)
{
kCode = ~P1;
if(kCode == KeyCodeTable[0]) return K_ONE;
else if(kCode == KeyCodeTable[1]) return K_TWO;
else if(kCode == KeyCodeTable[2]) return K_THREE;
else if(kCode == KeyCodeTable[3]) return K_FOUR;
else if(kCode == KeyCodeTable[4]) return K_FIVE;
else if(kCode == KeyCodeTable[5]) return K_SIX;
else if(kCode == KeyCodeTable[6]) return K_SEVEN;
else if(kCode == KeyCodeTable[7]) return K_EIGHT;
else if(kCode == KeyCodeTable[8]) return K_NINE;
else if(kCode == KeyCodeTable[9]) return K_UP;
else if(kCode == KeyCodeTable[10]) return K_DOWN;
else if(kCode == KeyCodeTable[11]) return K_CLEAR;
else if(kCode == KeyCodeTable[12]) return K_OK;
else if(kCode == KeyCodeTable[13]) return K_ZERO;
else if(kCode == KeyCodeTable[14]) return K_POINT;
else if(kCode == KeyCodeTable[15]) return K_SET;
}
else
sCode = _crol_(sCode,1);
}
}
}
return -1;
}
void set_num()
{
uchar key;
if(sel==0)
{
key = Keys_Scan();
if(K_CLEAR == key)
{
while(Keys_Scan() == K_CLEAR);
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' '; // 48(0)49(1)50(2)51(3)52(4)53(5)54(6)55(7)56(8)57(9)
M_Count=0;
cold=0;
warm=0;
}
if(K_UP == key)
{
while(Keys_Scan() == K_UP);
if((set_Temp_Display_Buffer[11]>47)&&(set_Temp_Display_Buffer[11]<57))
{
set_Temp_Display_Buffer[11]+=1;
}
else if(set_Temp_Display_Buffer[11]==57)
{
set_Temp_Display_Buffer[11]=48;
if((set_Temp_Display_Buffer[9]>47)&&(set_Temp_Display_Buffer[9]<57))
{
set_Temp_Display_Buffer[9]+=1;
}
else if(set_Temp_Display_Buffer[9]==57)
{
set_Temp_Display_Buffer[9]=48;
if((set_Temp_Display_Buffer[8]>47)&&(set_Temp_Display_Buffer[8]<57))
{
set_Temp_Display_Buffer[8]+=1;
}
else if(set_Temp_Display_Buffer[8]==57)
{
set_Temp_Display_Buffer[8]=48;
}
}
}
}
if(K_DOWN == key) // 48(0)49(1)50(2)51(3)52(4)53(5)54(6)55(7)56(8)57(9)
{
while(Keys_Scan() == K_DOWN);
if((set_Temp_Display_Buffer[11]>48)&&(set_Temp_Display_Buffer[11]<58))
{
set_Temp_Display_Buffer[11]-=1;
}
else if(set_Temp_Display_Buffer[11]==48)
{
set_Temp_Display_Buffer[11]=57;
if((set_Temp_Display_Buffer[9]>48)&&(set_Temp_Display_Buffer[9]<58))
{
set_Temp_Display_Buffer[9]-=1;
}
else if(set_Temp_Display_Buffer[9]==48)
{
set_Temp_Display_Buffer[9]=57;
if((set_Temp_Display_Buffer[8]>48)&&(set_Temp_Display_Buffer[8]<58))
{
set_Temp_Display_Buffer[8]-=1;
}
else if(set_Temp_Display_Buffer[8]==48)
{
set_Temp_Display_Buffer[8]=57;
}
}
}
}
if(K_ONE == key)
{
while(Keys_Scan() == K_ONE);
set_Temp_Display_Buffer[11]='1';
sel++;
}
if(K_TWO == key)
{
while(Keys_Scan() == K_TWO);
set_Temp_Display_Buffer[11]='2';
sel++;
}
if(K_THREE == key)
{
while(Keys_Scan() == K_THREE);
set_Temp_Display_Buffer[11]='3';
sel++;
}
if(K_FOUR == key)
{
while(Keys_Scan() == K_FOUR);
set_Temp_Display_Buffer[11]='4';
sel++;
}
if(K_FIVE == key)
{
while(Keys_Scan() == K_FIVE);
set_Temp_Display_Buffer[11]='5';
sel++;
}
if(K_SIX == key)
{
while(Keys_Scan() == K_SIX);
set_Temp_Display_Buffer[11]='6';
sel++;
}
if(K_SEVEN == key)
{
while(Keys_Scan() == K_SEVEN);
set_Temp_Display_Buffer[11]='7';
sel++;
}
if(K_EIGHT == key)
{
while(Keys_Scan() == K_EIGHT);
set_Temp_Display_Buffer[11]='8';
sel++;
}
if(K_NINE == key)
{
while(Keys_Scan() == K_NINE);
set_Temp_Display_Buffer[11]='9';
sel++;
}
if(K_ZERO == key)
{
while(Keys_Scan() == K_ZERO);
set_Temp_Display_Buffer[11]='0';
sel++;
}
if(K_OK == key)
{
while(Keys_Scan() == K_OK);
TEMP_SET=(set_Temp_Display_Buffer[8]-48)*10+(set_Temp_Display_Buffer[9]-48)+(set_Temp_Display_Buffer[11]-48)*0.1;
sel=0;
M_Count=1;
}
}
if(sel==1)
{
key = Keys_Scan();
if(K_CLEAR == key)
{
while(Keys_Scan() == K_CLEAR);
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' ';
M_Count=0;
cold=0;
warm=0;
sel=0;
}
if(K_ONE == key)
{
while(Keys_Scan() == K_ONE);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='1';
sel++;
}
if(K_TWO == key)
{
while(Keys_Scan() == K_TWO);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='2';
sel++;
}
if(K_THREE == key)
{
while(Keys_Scan() == K_THREE);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='3';
sel++;
}
if(K_FOUR == key)
{
while(Keys_Scan() == K_FOUR);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='4';
sel++;
}
if(K_FIVE == key)
{
while(Keys_Scan() == K_FIVE);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='5';
sel++;
}
if(K_SIX == key)
{
while(Keys_Scan() == K_SIX);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='6';
sel++;
}
if(K_SEVEN == key)
{
while(Keys_Scan() == K_SEVEN);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='7';
sel++;
}
if(K_EIGHT == key)
{
while(Keys_Scan() == K_EIGHT);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='8';
sel++;
}
if(K_NINE == key)
{
while(Keys_Scan() == K_NINE);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='9';
sel++;
}
if(K_ZERO == key)
{
while(Keys_Scan() == K_ZERO);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='0';
sel++;
}
}
if(sel==2)
{
key = Keys_Scan();
if(K_CLEAR == key)
{
while(Keys_Scan() == K_CLEAR);
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' ';
M_Count=0;
cold=0;
warm=0;
sel=0;
}
if(K_POINT == key)
{
while(Keys_Scan() == K_POINT);
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='.';
sel++;
}
}
if(sel==3)
{
key = Keys_Scan();
if(K_CLEAR == key)
{
while(Keys_Scan() == K_CLEAR);
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' ';
M_Count=0;
cold=0;
warm=0;
sel=0;
}
if(K_ONE == key)
{
while(Keys_Scan() == K_ONE);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='1';
sel++;
}
if(K_TWO == key)
{
while(Keys_Scan() == K_TWO);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='2';
sel++;
}
if(K_THREE == key)
{
while(Keys_Scan() == K_THREE);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='3';
sel++;
}
if(K_FOUR == key)
{
while(Keys_Scan() == K_FOUR);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='4';
sel++;
}
if(K_FIVE == key)
{
while(Keys_Scan() == K_FIVE);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='5';
sel++;
}
if(K_SIX == key)
{
while(Keys_Scan() == K_SIX);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='6';
sel++;
}
if(K_SEVEN == key)
{
while(Keys_Scan() == K_SEVEN);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='7';
sel++;
}
if(K_EIGHT == key)
{
while(Keys_Scan() == K_EIGHT);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='8';
sel++;
}
if(K_NINE == key)
{
while(Keys_Scan() == K_NINE);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='9';
sel++;
}
if(K_ZERO == key)
{
while(Keys_Scan() == K_ZERO);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='0';
sel++;
}
}
if(sel==4)
{
key = Keys_Scan();
if(K_CLEAR == key)
{
while(Keys_Scan() == K_CLEAR);
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' ';
M_Count=0;
cold=0;
warm=0;
sel=0;
}
if(K_OK == key)
{
while(Keys_Scan() == K_OK);
TEMP_SET=(set_Temp_Display_Buffer[8]-48)*10+(set_Temp_Display_Buffer[9]-48)+(set_Temp_Display_Buffer[11]-48)*0.1;
sel=0;
M_Count=1;
}
}
}
////////////////////主程序///////////////////////////////
void main()
{
init_lcd();
Init_DS18B20();
timer0_init();
while(1)
{
Print();
set_num();
Comparison();
}
}
void Comparison()
{
if(N_Count&&M_Count)
{
if(TEMP_NOW<TEMP_SET)
{
warm=1;
cold=0;
}
if(TEMP_NOW>TEMP_SET)
{
cold=1;
warm=0;
}
if(TEMP_NOW==TEMP_SET)
{
cold=0;
warm=0;
}
}
}
复制代码
基于单片机设计的空调温度控制器.zip
2019-8-16 17:16 上传
点击文件名下载附件
下载积分: 黑币 -5
677.37 KB, 下载次数: 119, 下载积分: 黑币 -5
作者:
夏一
时间:
2020-6-28 21:47
没看到里面有仿真,都放那了
作者:
jovew
时间:
2020-6-29 15:12
能不能把温度传感器 更换为 NTC 传感器?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1