#include<stc15fxxxx.h>
#include "LCD1602.H"
#define dht11_io P20 //P2.0口作为数据读取接口
#define MAIN_Fosc 22118400L //主时钟
#define baud_rate 4800L //波特率
#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / baud_rate)) //Timer1重装值
#define uchar unsigned char
#define uint unsigned int
uchar code tab[9]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};//读CO2气体浓度值
uchar date[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar LCD1602_Table[]="0123456789";//LCD1602显示标尺
//变量定义
u16 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;
u8 datas=0;
//函数声明
void Delay30us();
void Delay40us();
void Delay18ms();
void Delay1000ms();
void read_byte(); //读取一字节的数据,并赋值给U8comdata
u8 read_temp(); //读取温度,返回温度值
u8 read_humi(); //读取湿度,返回湿度值
void serial_init(); //串口初始化
void serial_send_byte(u8 dat); //串口发送一个字节的数据
void serial_send_string(u8 *dat);//串口发送字符串
void UART_init(void)
{
S2_USE_P10P11(); //UART1 使用P30 P31口 默认
// 下面代码设置定时器2
T2H = 0xFD; // 波特率:9600 /22.1184MHZ,1T
T2L = 0xC0; // 波特率:9600 /22.1184MHZ,1T
AUXR = 0x14; // 0001 0100,T2R=1启动T2运行,T2x12=1,定时器2按1T计数
// 下面代码设置定串口2
S2CON = 0x10; // 0001 0000 S2M0=0(最普遍的8位通信),REN=1(允许接收)
// 下面代码设置中断
IE2 =0x01; // 开串口2中断
EA = 1; // 开总中断
}
void send(uchar dat) //发送一字节
{
S2BUF=dat;
while(!TI2);
CLR_TI2();
}
void UART2(void) interrupt 8 // 串行口2中断函数
{
static uchar j;
ES=0; //禁止中断
if(!RI2);
CLR_RI2(); //清楚接收完毕标志
date[j]=S2BUF;
if(date[0]==0xff) //判断接收到的第一位为传感器所发数据
j++;
else
j=0;
if(j==9) //接收传感器所发数据9字节
j=0;
ES=1; //允许串口中断
}
void main()
{
uint tmp;
uchar i;
Delay1000ms();
serial_init();
UART_init();
dht11_io = 1;
LCD1602_Init();
WriteString(0,0,"TH: ");
WriteString(7,0,"RH");
WriteString(12,0,"C");
WriteString(0,1,"CO2:");
ES=1;
EA=1;
while(1)
{
for(i=0;i<9;i++) //向co2传感器发送数据
{
send(tab[i]);
}
Delay1000ms();
tmp=date[2]*256+date[3]; //计算出co2浓度值
if(tmp>9999)
tmp=0;
if((tmp/1000)>0)
WriteChar(6,1,LCD1602_Table[tmp/1000]);
else WriteChar(6,1,' ');
WriteChar(7,1,LCD1602_Table[tmp%1000/100]);
WriteChar(8,1,LCD1602_Table[tmp%100/10]);
WriteChar(9,1,LCD1602_Table[tmp%10]);
SetCur(NoCur); // 有显示无光标
serial_send_string("CO2:");
if((tmp/1000)>0)
serial_send_byte(LCD1602_Table[tmp/1000]);
else serial_send_byte(' ');
serial_send_byte(LCD1602_Table[tmp%1000/100]);
serial_send_byte(LCD1602_Table[tmp%100/10]);
serial_send_byte(LCD1602_Table[tmp%10]);
serial_send_byte(' ');
datas=read_temp();
WriteChar(10,0,datas%100/10+'0');
WriteChar(11,0,datas%10+'0');
SetCur(NoCur); // 有显示无光标
serial_send_string("温度:");
serial_send_byte(datas%100/10+'0');//十位
serial_send_byte(datas%10+'0'); //个位
serial_send_byte(' ');
datas=read_humi();
WriteChar(5,0,datas%100/10+'0');
WriteChar(6,0,datas%10+'0');
SetCur(NoCur); // 有显示无光标
serial_send_string("湿度:");
serial_send_byte(datas%100/10+'0');//十位
serial_send_byte(datas%10+'0'); //个位
serial_send_string("\r\n");
Delay1000ms();
}
}
void read_byte()
{
u8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出
Delay30us();
U8temp=0;
if(dht11_io)U8temp=1;
U8FLAG=2;
while((dht11_io)&&U8FLAG++);//超时3毫秒跳出
if(U8FLAG==1)break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
u8 read_temp()
{
dht11_io=0;
Delay18ms();
dht11_io=1;
Delay40us();
dht11_io=1;
if(!dht11_io)
{
U8FLAG=2;
while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出
U8FLAG=2;
while((dht11_io)&&U8FLAG++);//超时3毫秒跳出
read_byte();
U8RH_data_H_temp=U8comdata;
read_byte();
U8RH_data_L_temp=U8comdata;
read_byte();
U8T_data_H_temp=U8comdata;
read_byte();
U8T_data_L_temp=U8comdata;
read_byte();
U8checkdata_temp=U8comdata;
dht11_io=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;
}
}
return U8T_data_H;
}
u8 read_humi()
{
dht11_io=0;
Delay18ms();
dht11_io=1;
Delay40us();
dht11_io=1;
if(!dht11_io)
{
U8FLAG=2;
while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出
U8FLAG=2;
while((dht11_io)&&U8FLAG++);//超时3毫秒跳出
read_byte();
U8RH_data_H_temp=U8comdata;
read_byte();
U8RH_data_L_temp=U8comdata;
read_byte();
U8T_data_H_temp=U8comdata;
read_byte();
U8T_data_L_temp=U8comdata;
read_byte();
U8checkdata_temp=U8comdata;
dht11_io=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;
}
}
return U8RH_data_H;
}
void serial_init()
{
S1_8bit(); //8位数据
S1_USE_P30P31(); //UART1 使用P30 P31口 默认
TR1 = 0;
AUXR &= ~0x01; //S1 BRT Use Timer1;
TMOD &= ~(1<<6); //Timer1 set As Timer
TMOD &= ~0x30; //Timer1_16bitAutoReload;2
AUXR |= (1<<6); //Timer1 set as 1T mode
TH1 = (u8)(Timer1_Reload >> 8);
TL1 = (u8)Timer1_Reload;
TR1 = 1;
PS = 1; //高优先级中断
REN = 1; //允许接收
ES = 1; //允许中断
EA = 1; //允许全局中断
}
void serial_send_byte(u8 dat)
{
SBUF=dat;
while(!TI);
TI=0;
}
void serial_send_string(u8 *dat)
{
while(*dat)
{
serial_send_byte(*dat++);
}
}
/********************* 串口1中断函数************************/
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = 0;
}
if(TI)
{
}
}
void Delay30us() //@22.1184MHz精确延时30微秒
{
unsigned char i, j;
i = 1;
j = 162;
do
{
while (--j);
} while (--i);
}
void Delay40us() //@22.1184MHz精确延时40微秒
{
unsigned char i, j;
_nop_();
i = 1;
j = 217;
do
{
while (--j);
} while (--i);
}
void Delay18ms() //@22.1184MHz精确延时18毫秒
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 132;
k = 67;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay1000ms() //@22.1184MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 85;
j = 12;
k = 155;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
基于STC15F2K60S2单片机的温湿度+CO2测量,LCD1602显示
需积分: 45 125 浏览量
2018-06-01
15:34:44
上传
评论 14
收藏 70KB RAR 举报
苹果砸到了我
- 粉丝: 1
- 资源: 2
最新资源
- 问题2.zip
- QT登录模块,登录时获取txt文件内账号密码进行判断,注册时写入到本地文件user.txt
- 湖南麒麟系统下,因某些原因无法正常进入系统时可以进入单用户模式
- tsunami-udp 是一款专为网络加速诞生的小工具 用TCP进行传输控制、用UDP进行数据传输
- 基于FreeRTOS、LCD1602 、STM32CubeMX、GP2Y0A21YK0F红外测距传感器的测距proteus仿真
- C语言中的一些算法和面试题
- 個人使用2個人使用2個人使用2個人使用2個人使用2
- A72BDB68-F5FA-4D0F-906E-EACAA6A1EFA5.rar
- TTP229-BSF数据手册
- 時間管理.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0