基于51单片机的空调温度控制器protues仿真

代码设计
#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_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;直插led灯珠
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)

本文发布于:2024-09-24 07:22:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/172541.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   选择   振为   命令   延时   电路   送到
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议