基于单片机的数据采集器(具备上位机VC++上传功能)源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#define DataPort P0 //LCD1602数据端口
sbit add=P1^0; //按键加
sbit out=P1^1; //按键确认
sbit sub=P1^2; //按键减
sbit be =P1^3; //蜂鸣器
sbit DQ =P1^4; //DS温度传感器数据口
sbit SCL=P1^5; //IIC时钟引脚定义
sbit SDA=P1^6; //IIC数据引脚定义
sbit DH_data = P1^7 ;//DHT11的数据接口
sbit runled=P2^0;
sbit dataled=P2^1;
sbit warnled=P2^2;
sbit setled=P2^3;
sbit LCM_RW=P2^5; //LCD1602命令端口
sbit LCM_RS=P2^6; //LCD1602命令端口
sbit LCM_EN=P2^7; //LCD1602命令端口
sbit sw485=P3^4;
sbit setdata=P3^5; //设置按键
//P3_0、P3_1为串口通信端口
//P3_2、P3_3为中断,分别为故障检测和设置参数按键
///////////////////////////////////////////////////////////////////////////
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
/////////////////////////////////////////////////////////////////////////// DH
U8 U8FLAG;
U8 U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
///////////////////////////////////////////////////////////////////////////
bit presence;
float temper;
U16 data display[2];
U8 data temp_data[2]; //data :可直接寻址的内部数据存储区(128B)
//在keil c里,data表示内部储存区开始的128字节,可以直接寻址,速度较快
//如果变量很多,大于128字节,有部分变量必然被放在后128字节,采用间接寻址,速度稍慢。
//这时,把常量的变量规定为data,可以提高执行速度
S8 code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节,表示在0x3b开始存放,【n】表示存放几个数
//code只程序存储区
/**********************************************************
*********************************
*************************/
int temp_max,temp_min,HUM_max,HUM_min,light_max,light_min;
#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
typedef unsigned char BYTE;
typedef unsigned short WORD;
U8 BUF[8]; //接收数据缓存区
U8 code dis_temp[] = {"TEMP: 'C"};
U8 code dis_light[] = {"LIGHT: lx"};
U8 code dis_HUM[] = {"HUM: %RH "};
U8 code dis_SET0[] = {"SET ( )"};
U8 code dis_SET[] = {"From: To:"};
U8 code dis_ERROR[] = {"DATA ERROR"};
S16 dis_data; //变量
S16 light; //最终光照强度数据
void Multiple_Read_BH1750(void); //连续读出数据,存储在BUF中 ////////////////
/**********************************************************/
void delay_1(U8 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
//----------------------
DH_data=0 ; //T
DH_data=1 ; //T
//----------------------
while( ( !DH_data ) && U8FLAG++ );
Delay_10us();
Delay_10us();
U8temp=0;
if(DH_data)
U8temp=1;
U8FLAG=2;
while( ( DH_data ) && U8FLAG++ );
//----------------------
DH_data=0 ; //T
DH_data=0 ; //T
//----------------------
//超时则跳出for循环
if( U8FLAG == 1 )
break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata <<= 1;
U8comdata |= U8temp; //0
}
}
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
void RH( void )
{
//主机拉低18ms
DH_data = 0;
delay_1( 180 );
DH_data = 1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
DH_data = 1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if( !DH_data ) //T !
{
U8FLAG = 2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while( (!DH_data) && U8FLAG++ );
U8FLAG = 2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while( (DH_data) && U8FLAG++ );
//数据接收状态
COM();
U8RH_data_H_temp = U8comdata;
COM();
U8RH_data_L_temp = U8comdata;
COM();
U8T_data_H_temp = U8comdata;
COM();
U8T_data_L_temp = U8comdata;
COM();
U8checkdata_temp = U8comdata;
DH_data = 1;
//数据校验
U8temp = ( U8T_data_H_temp + U8T_data_L_temp + U8RH_data_H_temp + U8RH_data_L_temp );
if( U8temp == U8checkdata_temp )
{
U8RH_data_H = U8RH_data_H_temp;
U8RH_data_L = U8RH_data_L_temp;
U8T_data_H = U8T_data_H_temp;
U8T_data_L = U8T_data_L_temp;
U8checkdata = U8checkdata_temp;
}
}
}
//**************************GY-30驱动程序*******************************/
//毫秒延时**************************************************************/
void delay_nms(U8 k)
{
U16 i,j;
for(i=0;i
for(j=0;j<121;j++)
{
;
}
}
}
/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{
WORD n = 560;
while (n--);
}
/**************************************
起始信号
**************************************/
void BH1750_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void BH1750_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
bit BH1750_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信
号
SCL = 0; //拉低时钟线
Delay5us(); //延时
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(U8 dat)
{
U8 i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
BH1750_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE BH1750_RecvByte()
{
U8 i;
U8 dat = 0;
SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
//*********************************
void Single_Write_BH1750(U8 REG_Address)
{
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
BH1750_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
// BH1750_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
BH1750_Stop(); //发送停止信号
}
//*********************************************************
//
//连续读出BH1750内部数据
//
//*********************************************************
void Multiple_read_BH1750(void)
{ U8 i;
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
for (i=0; i<3; i++) //连续读取6个地址数据,存储中BUF
{
BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 3)
{
BH1750_SendACK(1); //最后一个数据需要回NOACK
}
else
{
BH1750_SendACK(0); //回应ACK
}
}
BH1750_Stop(); //停止信号
Delay5ms();
}
//初始化BH1750,根据需要请参考pdf进行修改****
void Init_BH1750()
{
Single_Write_BH1750(0x01);
}
Get_light()
{
Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
delay_nms(180); //延时180ms
Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];//合成数据,即光
照数据
light =(float)dis_data/1.2;
}
/**********************************************************
串口初始化
**********************************************************/
Uart_Init()
{
SCON = 0X50; //scon:工作模式1,8bit数据位,允许接收
TMOD |= 0X20; //定时器T1,工作牧师2,8位自动重载方式
TH1 = 0Xf3; //当波特率为2400时,定时器初值
TR1 = 1; //定时器T1开始运行
TI = 1; //允许发送数据
}
///////////////////////////////////////////////////////////////////////////
/**********************************************************
us延时函数 (8*1.085)*num
**********************************************************/
void Delay( U16 num) //延时函数
{
while (--num)
;
}
/**********************************************************/
void delayms( U16 ms)
{
U8 k;
while (ms--)
{
for (k = 0; k < 114; k++)
;
}
}
/**********************************************************
DS18B20初始化
presence=0 OK presence=1 ERROR
**********************************************************/
U8 Init_DS18B20(void)
{
DQ = 0; //单片机发出低电平复位信号
Delay(60); //延时>480us
DQ = 1; //释放数据线
Delay(8); //延时>64us,等待应答
presence = DQ; //接收应答信号
Delay(50); //延时>400us,等待数据线出现高电平
DQ = 1; //释放数据线
return (presence); //返回presence信号
}
/**********************************************************
读一个字节数据
**********************************************************/
unsigned char ReadOneChar(void)
{
U8 i = 0;
U8 dat = 0;
DQ = 1;
for (i = 0; i < 8; i++)
//一个字节8个bit
{
DQ = 0; //给低脉冲信号
dat >>= 1;
DQ = 1; //释放总线
_nop_();
_nop_();
if (DQ)
//读总线电平状态
dat |= 0x80;
//最高位置1
Delay(6); //延时>45us
DQ = 1; //释放总线,表示此次读操作完成
}
return (dat); //返回所读得数据
}
/**********************************************************
写一个字节数据
**********************************************************/
void WriteOneChar(U8 dat)
{
U8 i = 0;
for (i = 0; i < 8; i++)
//一个字节8个bit
{
DQ = 0; //给低脉冲信号
Delay(1); //延时<15us
dat >>= 1; //数据右移一位,最低位移入CY
DQ = CY; //写1bit数据
Delay(6); //延时>45us
DQ = 1; //释放总线,表示此次写操作完成
}
}
/**********************************************************
温度数据转换子程序
**********************************************************/
void Temperature_conver()
{
U8 minus = 0;
if (temp_data[1] > 127) // 127 => 0111 1111 一共8bit,data[1]为寄存器高八位,其中高四位为1111则表示温度为负数
//温度为负值
{
temp_data[
0] = (~temp_data[0]) + 1; //取反加一,将补码变成原码
if ((~temp_data[0]) >= 0xff)
temp_data[1] = (~temp_data[1]) + 1;
else
temp_data[1] = ~temp_data[1];
minus = 1; //温度为负值标志
}
display[0] = temp_data[0] &0x0f; //取小数位数据
display[1] = (display[0] *10) / 16; //保留一位小数
display[0] = ((temp_data[0] &0xf0) >> 4) | ((temp_data[1] &0x0f) << 4);
//取整数
temper = display[0]+ display[1]*0.1;
if (minus)
{
display[5] = '-'; //显示负号
}
}
void DS18B20(void)
{
Init_DS18B20();
if (presence == 0)
{
WriteOneChar(0xCC); //跳过ROM匹配操作
WriteOneChar(0x44); //启动温度转换
}
Init_DS18B20();
if (presence == 0)
{
WriteOneChar(0xCC); //跳过ROM匹配操作
WriteOneChar(0xBE); //读取温度寄存器
temp_data[0] = ReadOneChar(); //温度低8位
temp_data[1] = ReadOneChar(); //温度高8位
Temperature_conver(); //数据转换
}
// printf("The data of temperature is %.1f \n",temper);
}
/**********************************************************
**********************************************************/
/************************************************************************/
U8 xiaoshu,ge,shi,bai,qian,wan; //显示变量
//*********************************************************
void conversion_wan(U16 temp_data) // 数据转换出 个,十,百,千,万
{
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000; //取余运算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余运算
bai=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余运算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
}
void conversion_bai(U16 temp_data) // 数据转换出 个,十
{
bai=temp_data/100+0x30 ;
temp_data=temp_data%100;
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
}
void conversion_shi(U16 temp_data) // 数据转换出 个,十
{
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
}
//*********************************************************
// ***********************1602驱动部分********
//*********************************************************
/*******************************/
void WaitForEnable(void) //等待响应
{
DataPort=0xff;
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);
LCM_EN=0;
}
/*******************************/
void WriteCommandLCM(U8 CMD,U8 Attribc)
{
if(Attribc)WaitForEnable();
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/*******************************/
void WriteDataLCM(U8 dataW)
{
WaitForEnable();
LCM_
RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/***********************************/
void InitLcd()
{
WriteCommandLCM(0x38,1);//显示模式设置,开始要求每次监测忙信号
WriteCommandLCM(0x08,1);//关闭显示
WriteCommandLCM(0x01,1);//显示清屏
// WriteCommandLCM(0x06,1);//显示光标移动设置
WriteCommandLCM(0x04,1);//显示光标移动设置
WriteCommandLCM(0x0c,1);//显示开以及光标设置
}
/***********************************/
void DisplayOneChar(U8 X,U8 Y,U8 DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
//*********************************************************
//蜂鸣器********
//*********************************************************
void delaym( U8 xx)
{
unsigned i,j;
for(i=0;i
}
void bee(U8 ii)
{
while(ii>0)
{
be=1;
delaym(1);
be=0;
delaym(1);
ii--;
}
}
void Data_Init(void)
{
temp_max=22;
temp_min=15;
HUM_max=60;
HUM_min=50;
light_max=2000;
light_min=0;
dataled=0;
}
void System_Init(void)
{
U8 f;
BYTE code dis1[] = {" WELCOME TO "};
InitLcd(); //初始化LCD
WriteCommandLCM(0x01,1);//显示清屏
for( f=0;f<16;f++)
{
DisplayOneChar(f,0,dis1[f]);
}
Uart_Init();
Init_DS18B20();
Init_BH1750(); //初始化BH1750
}
void printset(void)
{
U8 j;
for(j=0;j<16;j++)
{
DisplayOneChar(j,0,dis_SET0[j]);
}
for(j=0;j<11;j++)
{
DisplayOneChar(j,1,dis_SET[j]);
}
}
//*********************************************************
//主程序********
//*********************************************************
void main()
{
S16 tem1;
U8 i,j;
int sign;
int t_shi=5;
int t_ge=5;
// int sign;
// float checksum;
System_Init();
Data_Init();
bee(75);
sign=1;
setled=1;
while(1) //大循环 系统工作
{
i=0;
runled=1;//系统运行指示灯
WriteCommandLCM(0x01,1);//显示清屏
DS18B20() ;
delaym(500);
for(j=0;j<12;j++)
{
DisplayOneChar(j,i,dis_temp[j]);
}
if(tem1<0)
DisplayOneChar(5,i,'-');
temper = (temper*10);
conversion_bai(temper);
DisplayOneChar(6,i,bai);
DisplayOneChar(7,i,shi);
DisplayOneChar(8,i,'.'); ////显示数单位 xiaoshudian
DisplayOneChar(9,i,ge);
delaym(500);
temper = (temper*0.1);
if( ( (temper+2) >= temp_max )||( (temper-2) <= temp_min ) )
{
warnled=0; //警示
if( ( temper >= temp_max ) || ( temper <= temp_min ) )
{
bee(100);//需要添加相应的处理函数
}
}else
{
warnled=1; //消除警示
}
/////////////////////////////////////////////////////////////////////////////////////
Get_light(); //检测出光照强度
WriteCommandLCM(0x01,1);//显示清屏
delaym(500);
f
or(j=0;j<14;j++)
{
DisplayOneChar(j,i,dis_light[j]);
}
conversion_wan(light);
if(light>9999)
DisplayOneChar(6,i,wan);
if(light>999)
DisplayOneChar(7,i,qian);
if(light>99)
DisplayOneChar(8,i,bai);
if(light>9)
DisplayOneChar(9,i,shi);
DisplayOneChar(10,i,ge);
if( ( (light+200) >= light_max )||( (light-200) <= light_min ) )
{
warnled=0; //警示
if( ( light >= light_max ) || ( light <= light_min ) )
{
bee(100);//需要添加相应的处理函数
}
}else
{
warnled=1; //消除警示
}
//////////////////////////////////////////////////////////////////////
RH();
delaym(500);
tem1 = ( (unsigned int)U8RH_data_H );
// printf("湿度 = %d %RH \n",tem1);
WriteCommandLCM(0x01,1);//显示清屏
delaym(500);
for(j=0;j<11;j++)
{
DisplayOneChar(j,i,dis_HUM[j]);
}
conversion_shi(tem1);
DisplayOneChar(5,i,shi);
DisplayOneChar(6,i,ge);
if( ( (tem1+2) >= HUM_max )||( (tem1-2) <= HUM_min ) )
{
warnled=0; //警示
if( ( tem1 >= HUM_max ) || ( tem1 <= HUM_min ) )
{
bee(100);//需要添加相应的处理函数
}
}else
{
warnled=1; //消除警示
}
delaym(500);
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
sw485 = 1;
if(temper<0)
sign=0;
printf("$");
printf("%1d",sign); // sign
printf("%4.1f",temper); //temp
printf("%2d",temp_max); //temp_max
printf("%2d",temp_min); //temp_min
printf("%2d",tem1); //RH
printf("%2d",HUM_max); //RH_max
printf("%2d",HUM_min); //RH_min
printf("%5d",light); //light
printf("%5d",light_max); //light_max
printf("%5d",light_min); //light_min
printf("*");
temper = sign + temper + temp_max + temp_min + tem1 + HUM_max + HUM_min + light + light_max+ light_min;
printf("%7.1f",temper);
printf("#\n"); //结束
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
runled=0;//系统运行指示灯
delaym(500);
// printf("The intensity of the illumination is %f lx\n",light);
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
if( setdata == 0 ) //设置按键被按下的时候
{
delaym(20);
bee(75);
if( setdata == 0 )
{
WriteCommandLCM(0x01,1);//显示清屏
setled=0;//设置参数指示LED亮
delaym(500);
printset() ; //完成设置界面框架
WriteCommandLCM(0x0f,1);//显示开以及光标设置
delaym(500);
////////////////////////////////////////////////
/////////////////////////////////
////////////////////////////TEMPmin
/////////////////////////////////////////////////////////////////////////////////
for(j=0;j<4;j++) // 显示TEMP
{
DisplayOneChar(j+4,0,dis_temp[j]);
}
DisplayOneChar(12,0,dis_temp[10]);
DisplayOneChar(13,0,'C');
DisplayOneChar(5,1,dis_SET0[4]);//调回光标
while(1)
{
if(add == 0)
{
while(add == 0);
t_shi++;
if(t_shi > 9)
t_shi = 0;
temp_min= t_shi*10+t_ge;
conversion_shi(temp_min);
DisplayOneChar(6,1,shi);
}
if(sub == 0)
{
while(sub == 0);
t_shi--;
if(t_shi <0)
t_shi = 9;
temp_min= t_shi*10+t_ge;
conversion_shi(temp_min);
DisplayOneChar(6,1,shi);
}
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
while(1)
{
if(add == 0)
{
while(add == 0);
t_ge++;
if(t_ge == 10)
t_ge = 0;
temp_min= t_shi*10+t_ge;
conversion_shi(temp_min);
DisplayOneChar(7,1,ge);
}
if(sub == 0)
{
while(sub == 0);
t_ge--;
if(t_ge <0)
t_ge = 9;
temp_min= t_shi*10+t_ge;
conversion_shi(temp_min);
DisplayOneChar(7,1,ge);
}
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
////////////////////////////////////////////////////////////////////////////////////
DisplayOneChar(11,1,dis_SET0[4]);//调回光标
while(1)
{
if(add == 0)
{
while(add == 0);
t_shi++;
if(t_shi > 9)
t_shi = 0;
temp_max= t_shi*10+t_ge;
conversion_shi(temp_max);
DisplayOneChar(12,1,shi);
}
if(sub == 0)
{
while(sub == 0);
t_shi--;
if(t_shi <0)
t_shi = 9;
temp_max= t_shi*10+t_ge;
conversion_shi(temp_max);
DisplayOneChar(12,1,shi);
}
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
while(1)
{
if(add == 0)
{
while(add == 0);
t_ge++;
if(t_ge == 10)
t_ge = 0;
temp_max= t_shi*10+t_ge;
conversion_shi(temp_max);
DisplayOneChar(13,1,ge);
}
if(sub == 0)
{
while(sub == 0);
t_ge--;
if(t_ge <0)
t_ge = 9;
temp_max= t_shi*10+t_ge;
conversion_shi(temp_max);
DisplayOneChar(13,1,ge);
}
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
////////////////////////////////////////////////////////////////////////////////////
/////////////////
///////////////////////////////////////////////////////////////////
for(j=0;j<4;j++) // 显示HUM
{
DisplayOneChar(j+4,0,dis_HUM[j]);
}
DisplayOneChar(12,0,'%');
DisplayOneChar(13,0,'R');
DisplayOneChar(14,0,'H');
DisplayOneChar(5,1,dis_SET0[4]);//调回光标
while(1)
{
if(add == 0)
{
while(add == 0);
t_shi++;
if(t_shi > 9)
t_shi = 0;
HUM_min= t_shi*10+t_ge;
conversion_shi(HUM_min);
DisplayOneChar(6,1,shi);
}
if(sub == 0)
{
while(sub == 0);
t_shi--;
if(t_shi <0)
t_shi = 9;
HUM_min= t_shi*10+t_ge;
conversion_shi(HUM_min);
DisplayOneChar(6,1,shi);
}
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
while(1)
{
if(add == 0)
{
while(add == 0);
t_ge++;
if(t_ge == 10)
t_ge = 0;
HUM_min= t_shi*10+t_ge;
conversion_shi(HUM_min);
DisplayOneChar(7,1,ge);
}
if(sub == 0)
{
while(sub == 0);
t_ge--;
if(t_ge <0)
t_ge = 9;
HUM_min= t_shi*10+t_ge;
conversion_shi(HUM_min);
DisplayOneChar(7,1,ge);
}
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
////////////////////////////////////////////////////////////////////////////////////
DisplayOneChar(11,1,dis_SET0[4]);//调回光标
while(1)
{
if(add == 0)
{
while(add == 0);
t_shi++;
if(t_shi > 9)
t_shi = 0;
HUM_max= t_shi*10+t_ge;
conversion_shi(HUM_max);
DisplayOneChar(12,1,shi);
}
if(sub == 0)
{
while(sub == 0);
t_shi--;
if(t_shi <0)
t_shi = 9;
HUM_max= t_shi*10+t_ge;
conversion_shi(HUM_max);
DisplayOneChar(12,1,shi);
}
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
while(1)
{
if(add == 0)
{
while(add == 0);
t_ge++;
if(t_ge == 10)
t_ge = 0;
HUM_max= t_shi*10+t_ge;
conversion_shi(HUM_max);
DisplayOneChar(13,1,ge);
}
if(sub == 0)
{
while(sub == 0);
t_ge--;
if(t_ge <0)
t_ge = 9;
HUM_max= t_shi*10+t_ge;
conversion_shi(HUM_max);
DisplayOneChar(13,1,ge);
}
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
/////////////////////////////////////修改light///////////////////////////////////////////////
for(j=0;j<5;j++) // 显示
{
DisplayOneChar(j+4,0,dis_li
ght[j]);
}
DisplayOneChar(10,0,'*');
DisplayOneChar(11,0,'1');
DisplayOneChar(12,0,'0');
DisplayOneChar(13,0,'0');
DisplayOneChar(14,0,'l');
DisplayOneChar(15,0,'x');
// DisplayOneChar(5,1,dis_SET0[4]);//调回光标
/*
while(1)
{
if(add == 0)
{
while(add == 0);
t_shi++;
if(t_shi > 9)
t_shi = 0;
}
if(sub == 0)
{
while(sub == 0);
t_shi--;
if(t_shi <0)
t_shi = 9;
}
light_min= t_shi*10+t_ge;
conversion_shi(light_min);
DisplayOneChar(6,1,shi);
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
while(1)
{
if(add == 0)
{
while(add == 0);
t_ge++;
if(t_ge == 10)
t_ge = 0;
}
if(sub == 0)
{
while(sub == 0);
t_ge--;
if(t_ge <0)
t_ge = 9;
}
light_min= t_shi*10+t_ge;
conversion_shi(light_min);
DisplayOneChar(7,1,ge);
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
light_min=light_min*100;
*/
////////////////////////////////////////////////////////////////////////////////////
DisplayOneChar(6,1,'0');
DisplayOneChar(7,1,dis_temp[7]);
DisplayOneChar(11,1,dis_SET0[4]);//调回光标
while(1)
{
if(add == 0)
{
while(add == 0);
t_shi++;
if(t_shi > 9)
t_shi = 0;
}
if(sub == 0)
{
while(sub == 0);
t_shi--;
if(t_shi <0)
t_shi = 9;
}
light_max= t_shi*10+t_ge;
conversion_shi(light_max);
DisplayOneChar(12,1,shi);
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
while(1)
{
if(add == 0)
{
while(add == 0);
t_ge++;
if(t_ge == 10)
t_ge = 0;
}
if(sub == 0)
{
while(sub == 0);
t_ge--;
if(t_ge <0)
t_ge = 9;
}
light_max= t_shi*10+t_ge;
conversion_shi(light_max);
DisplayOneChar(13,1,ge);
light_max = light_max*100;
if( out == 0)
{
delaym(20);
if( out == 0)
{
while(out == 0);
break;
}
}
}
dataled=1;//关闭默认数据指示灯
setled=0;//设置参数指示LED不亮
if( (temp_max <= temp_min) || (HUM_max <= HUM_min))
{
Data_Init();
setled=1;//设置参数指示LED不亮
dataled=0;//开默认数据指示灯
WriteCommandLCM(0x01,1);//显示清屏
delaym(500);
for(j=0;j<10;j++)
{
DisplayOneChar(j+2,0,dis_ERROR[j]);
}
bee(1000);
delaym(5000);
}
InitLcd(); //消除光标闪烁
////////////////////////////////////////////////////////////////////////////////////
}
}
////////////////////////////////////////////////////////////////////////////////
}
}