📄 main.c
字号:
#include "main.h"
/***************************************///
void delay_ms(unsigned int count)
{
uint i,j;
for(j=0;j<count;j++)
{
for(i=0;i<350;i++)
;
}
}
void init_port(void)
{
P0=0xFF;
P1=0xFF;
P2=0xFF;
P3=0xFF;
}
/**********************************///开机准备时间
void minute(uchar a)
{
uchar a1,a2,a3;
TMOD=0x01; /*定时器为模式为1*/
TH0=(65536-50000)/256; /*设定定时器值为50毫秒*/
TL0=(65536-50000)%256;
TR0=1; /*启动定时器*/
for(a3=0;a3<a;a3++)
{
for(a2=0;a2<60;a2++) /*定时1分钟*/
{
for(a1=0;a1<20;a1++) /*定时1s*/
{
do{}while(!TF0);
TF0=0;
TH0=(65536-50000)/256; /*重新装载*/
TL0=(65536-50000)%256;
}
}
}
}
/*************************************/
/***********************串口收发程序********************************/
void b9600(void)
{
SCON = 0x50; //串口工作方式设置字节,1个起始位,8个数据位,1个停止位组成10位帧
PCON = 0x80; //波特率加倍模式
TMOD |= 0x20; //0010, //COM2:自动重置初值的8位定时/计数器
TH1 = 0xfa;TL1=0xfa;
//串行口波特率发生器,=f=12M
TR1 = 1;
//启动T1
}
//串口发送字符程序
void SendByte(uchar SSD)
{
TI = 0;
RI = 0;
SBUF = SSD;
while (!TI){}
;
TI = 0;
}
//串口接收字符程序
unsigned char RxByte(void)
{
unsigned char a;
while (RI == 0){}
; //为低是一直停止
RI = 0;
a = SBUF;
return (a);
}
//向串口发送一个字符串,strlen为该字符串长度
void SendStr(unsigned char *str, unsigned int strlen)
{
unsigned int k = 0;
do
{
SendByte(*(str + k));
k++;
}
while (k < strlen);
}
/***********************************************************/
/***********得到温度值转换成十进制***********/
uchar receive_temperature(void)
{
unsigned char tempL=0,tempH=0,temperature=0;
uchar buffer[8]={0,0,0,0,0,0,0,0};
receive_string(0x9B,buffer,8);//iic读取转换结果,放入buffer中
delay_ms(10);
tempH=buffer[0];tempL=buffer[1];
// SendByte(buffer[0]);
//SendByte(buffer[1]);
temperature=((tempH*256)+tempL)*0.01; //数据处理
return(temperature);
}
/**********数值转换ANSII码*********/
void adc_str(uint Val,uchar *Data)//对应标准ANSII码表,代码48刚好对应ANSII中的'0',其他的如是类推
{
Data[0]=Val/10+48;//Data[3]=48+5= '5'
Data[1]=Val%10+48;//Data[4]=48+0 '0'
}
/*************************************************************************///
/******************************主函数**************************************/
void main()
{
uchar temperature1,temperature2,temperature0;
uchar set,cool,min;
uchar Data[]={"12 "};
uchar Work[]={"work "};
init_port();
b9600();
//delay_ms(10);
while(1)
{
if(P0^0!=0)
{
P1=0xee; // 循环风机启动,制冷系统关闭,风阀A打开,风阀B关闭
min=RxByte();//得到定时运行准备时间
//SendByte(min);
minute(min);
b9600();
SendStr(Work,6);
while(P0^0!=0)
{
b9600();
set=RxByte(); // 得到设定温度值
//SendByte(set);
cool=RxByte(); // 得到冷源温度值
//SendByte(cool);
P2=0x80; //通道1选通
temperature1=receive_temperature(); //得到室内温度值
adc_str(temperature1,Data);
SendStr("i=",2);
SendStr(Data, 3);
P2=0x00; //通道0选通
temperature0=receive_temperature(); //得到室外温度值
adc_str(temperature0,Data);
SendStr("o=",2);
SendStr(Data, 3);
//SendByte(temperature0);
P2=0x40; //通道2选通
temperature2=receive_temperature(); //得到回风管温度值
adc_str(temperature2,Data);
SendStr("p=",2);
SendStr(Data,3);
//SendByte(temperature2);
if(temperature1<=(set-3)) // 检查室内温度是否达到设定温度
{
P1=0xed; //制冷系统关闭,风阀A关闭,风阀B打开
//temperature1=receive_temperature(); //得到温度值
//SendByte(temperature1);
SendStr("S1/ ",4);
//delay_ms(500);
}
else if(temperature1>=(set+3)) // 室内温度达到(设定温度+3)度
{
if(temperature0<=cool) // 室外温度达到冷源温度
{
P1=0xee;
SendStr("S2/ ",4);
//delay_ms(500);
}
if(temperature0>=(cool+3)) // 室外温度达到(冷源温度+3)
{
if(temperature2>=temperature0) // 回风管温度高于室外温度
{
P1=0xe6;
SendStr("S3/ ",4);
//SendByte(3);
//delay_ms(500);
}
else //回风管温度不高于室外温度
{
P1=0xe5;
SendStr("S4/ ",4);
//SendByte(4);
//delay_ms(500);
}
}
}
//delay_ms(500);
}
}
else P1=0xff;
}
}
/**********************************主函数结束*************************//////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -