include<intrins.h>
#include <absacc.h>
#include <math.h>
#include "1602.h"
#include "sht11.h"
#define uchar unsigned char
#define uint unsigned int
#define KEY_CANCEL 0x08
#define KEY_UP 0x04
#define KEY_DOWN 0x02
#define KEY_ENTER 0x01
//uchar xdata key_lcd_val_tmp[12];//临时保存用户设置的数据,当用户按ENTER键时写入相应寄存器
//uchar current_page=1;//记录当前正在显示的页面,初始状态显示第一页
uchar is_setting_system = 0;//记录系统是否处于设置系统状态==1,默认是显示页面状态==0
uint key_value = 0; //键值为零
uchar key_value_valid = 0;//系统可以处理新键值
uchar j;
sbit Beep =P3^6;
sbit LED_RED =P1^5;
sbit LED_GREEN=P1^4;
sbit KEY01=P2^0;
sbit KEY02=P2^1;
sbit KEY03=P2^2;
sbit KEY04=P2^3;
void delay(uint);
void Init();
void delay_LCM(uint); //LCD延时子程序
void initLCM( void); //LCD初始化子程序
void lcd_wait(void); //LCD检测忙子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC); //写指令到ICM子函数
void WriteDataLCM(uchar WDLCM); //写数据到LCM子函数
void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数
void DisplayListChar(uchar X,uchar Y,uchar code *DData); //显示指定坐标的一串字符子函数
void weishu1(float m);
void display(void);
void alarm(void);
void handle_key_lcd1602(void);//处理按键与lcd1602显示,while循环中直接使用
/**********main funcation************/
void main(void)
{
/*********************************/
uint temp,humi;
// uint Temp_CHA;
// float humi_val;
// float temp_val; //定义两个共同体,一个用于湿度,一个用于温度
// float dew_point; //用于记录露点值
uchar error; //用于检验是否出现错误
uchar checksum;//CRC
bit temp_f;
unsigned char HUMI,TEMP;
HUMI=0X01;
TEMP=0X02;
temp_f=1;
// uchar wendu[6];//用于记录温度
// uchar shidu[6];//用于记录湿度
/**********************************/
//delay(500); //系统延时500ms启动
//t=0; //采样值存储单元初始化为0
initLCM( );
Init();
LED_GREEN=0;
Beep =1;
delay(1000);
Beep =0;
WriteCommandLCM(0x01,1); //清显示屏
DisplayListChar(0,0,str1);
DisplayListChar(0,1,str2);
s_softreset();
//s_connectionreset(); //启动连接复位
while(1)
{
handle_key_lcd1602();
if( is_setting_system == 0 )
{
error=0; //初始化error=0,即没有错误
error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //温度测量
error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量
if(error!=0) s_connectionreset(); ////如果发生错误,系统复位
else
{
humi_val.f=(float)humi_val.i; //转换为浮点数
temp_val.f=(float)temp_val.i; //转换为浮点数
calc_sth10(&humi_val.f,&temp_val.f); //修正相对湿度及温度
// dew_point=calc_dewpoint(humi_val.f,temp_val.f); //计算e dew_point
temp=temp_val.f*10;
humi=humi_val.f*10;
Temp_bai=temp/1000; //温度百位
Temp_shi=temp%1000/100; //温度十位
Temp_ge =temp%100/10; //温度个位
Temp_fen=temp%10; //温度小数点后第一位
Humi_bai=humi/1000; //湿度百位
Humi_shi=humi%1000/100; //湿度十位
Humi_ge =humi%100/10; //湿度个位
Humi_fen=humi%10; //湿度小数点后第一位
alarm();
if(( Temp_bai !=0) && ( Temp_bai !=1) )
{
temp=temp*-1.0+10.0;
Temp_shi=temp%1000/100; //温度十位
Temp_ge =temp%100/10; //温度个位
Temp_fen=temp%10; //温度小数点后第一位
/*
Temp_CHA=Temp_shi*100+Temp_ge*10+Temp_fen;
Temp_CHA=55.0-Temp_CHA;
Temp_shi=Temp_CHA/100; //温度十位
Temp_ge =Temp_CHA%100/10; //温度个位
Temp_fen=Temp_CHA%10; //温度小数点后第一位
*/
display0();
}
else
{
display1();
}
display2();
}
}
else
handle_key_lcd1602();
}
}
/***********************/
void Init()
{
//TMOD=0x11;
//TL1=0x3C;
//TH1=0xB0;
EA=1;
// ET1=1; //定时器1允许
IT1=1;
EX1=1; //外部中断1允许
// TR1=1; //定时器1运行
}
/*********延时K*1ms,12.000mhz**********/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<100;j++);
}
/*****************报警子函数*******************/
void alarm(void)
{
uint sht_temp1;
uint sht_temp2;
uint sht_humi1;
uint sht_humi2;
uint sht_temp;
uint sht_humi;
sht_temp1=sht_10[0]*100+sht_10[1]*10+sht_10[2];
sht_temp2=sht_10[3]*100+sht_10[4]*10+sht_10[5];
sht_humi1=sht_10[6]*100+sht_10[7]*10+sht_10[8];
sht_humi2=sht_10[9]*100+sht_10[10]*10+sht_10[11];
sht_temp =Temp_bai*100+Temp_shi*10+Temp_ge;
sht_humi =Humi_bai*100+Humi_shi*10+Humi_ge;
if(sht_temp>=sht_temp1)
{
Beep =1;
LED_RED =0;
LED_GREEN=1;
delay(500);
}
else
{
Beep =0;
LED_RED =1;
LED_GREEN=0;
}
if(sht_temp<=sht_temp2)
{
Beep =1;
LED_RED =0;
LED_GREEN=1;
delay(500);
}
else
{
Beep =0;
LED_RED =1;
LED_GREEN=0;
}
if(sht_humi>=sht_humi1)
{
Beep =1;
LED_RED =0;
LED_GREEN=1;
delay(500);
}
else
{
Beep =0;
LED_RED =1;
LED_GREEN=0;
}
if(sht_humi<=sht_humi2)
{
Beep =1;
LED_RED =0;
LED_GREEN=1;
delay(500);
}
else
{
Beep =0;
LED_RED =1;
LED_GREEN=0;
}
/*
if(sht_temp>=124 || sht_temp<=-40 || sht_humi>=101 || sht_humi<0)
{
Beep =1;
LED_RED =0;
LED_GREEN=1;
delay(1000);
}
else
{
Beep =0;
LED_RED =1;
LED_GREEN=0;
}*/
}
void handle_key_lcd1602(void) //处理按键与lcd1602显示,while循环中直接使用
{
//uchar j=0;//临时循环变量
//static uchar xdata save_data[12]={0,0,0,0,0,0,0,0,0,0,0,0};
//static uchar inner_page_offset=1;
//static uchar key_up_down_value = 0;//指向0f
if( is_setting_system == 0 ) //当前处于循环显示 数据界面
{
if(key_value_valid==1)//按键值有效,按键按下(检测ENTER按键按下)
{
if(key_value==KEY_CANCEL)
{
is_setting_system = 1;//下一次进入系统设置页面
//inner_page_offset = 1;
display3();
display4();
}
}
}
else//当前处于设置界面
{
if(key_value_valid == 1)//有效按键按下
{
switch(key_value)//处理有效键值
{
/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
case KEY_UP://按下的是向上键↑
{
sht_10[j]++;
if(sht_10[j]>=9)
sht_10[j]=9;
display3();
display4();
}
break;
/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ case KEY_DOWN://按下的是向下键↓
{
sht_10[j]--;
if(sht_10[j]<=0)
sht_10[j]=0;
display3();
display4();
}
break;
/*ENTER ENTER ENTER ENTER ENTER ENTER */
case KEY_ENTER:
{
j++;
if(j>12)
j=0;
}
break;
/*CANCEL CANCEL CANCEL CANCEL CANCEL */
case KEY_CANCEL:
is_setting_system = 0;//下一次进入系统设置页面
break;
default:
break;
}
}
}
key_value_valid=0;//键值无效,为下一次按键做准备
EX1=1; //外部中断1允许
}
/**************************/
void interrupt_key() interrupt 2 using 2
{
uint delay_time = 10000;
uchar key_command = 0;
//uchar key_command1 = 0;
uchar i;
uchar key_tmep_value[]={0x00,0x00,0x00,0x00};
//置端口为输入状态
KEY01 = 1;
KEY02 = 1;
KEY03 = 1;
KEY04 = 1;
EX1=0; //外部中断1允许
if(key_value_valid==0)//系统正在处理按键信息,所以当前按键无效
{
while(delay_time--);//延时片刻,待信号稳定
key_tmep_value[0] = ~KEY01;
key_tmep_value[1] = ~KEY02;
key_tmep_value[2] = ~KEY03;
key_tmep_value[3] = ~KEY04;
for(i=0;i<4;i++)
{
key_command |= (key_tmep_value[i] <<i);
}
switch(key_command)
{
case KEY_UP:
key_value = key_command;//获取键值
key_value_valid = 1;//键值有效
break;
case KEY_DOWN:
key_value = key_command;//获取键值
key_value_valid = 1;//键值有效
break;
case KEY_ENTER:
key_value = key_command;//获取键值
key_value_valid = 1;//键值有效
break;
case KEY_CANCEL:
key_value = key_command;//获取键值
key_value_valid = 1;//键值有效
break;
default:
//serial_send_string("key error",strlen("key error"));//--test
break;
}
}
错误提示如下;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
大哥,如何定义啊?
一周热门 更多>