标题:
单片机编译显示找不到lcd1602,dht11和key-contrl头文件?
[打印本页]
作者:
monster啊
时间:
2019-3-31 23:34
标题:
单片机编译显示找不到lcd1602,dht11和key-contrl头文件?
#include <reg51.h>
#include "key_contrl.h"
#include "lcd1602.h"
#define LCM_Data P1
#define Busy 0x80 //用于检测 LCM 状态字中的 Busy 标识
extern int temp_value, humi_value;
extern int flag;
extern int temp;
sbit red=P2^6;
sbit blue=P2^7;
sbit LCM_RW= P2^4; // 定义引脚
sbit LCM_RS= P2^5;
sbit LCM_E= P2^3;
sbit beep = P0^6; //beep = 0时候发声
extern int temph,templ,disp_mode,huih,huil;
extern char tel,teh,hh,hl;
//写数据
void alarm()
{
beep=0;
Delay5Ms();
Delay5Ms();
beep=1;
Delay5Ms();
Delay5Ms();
}
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; // 若晶振速度太高可以在这后加小的延时
LCM_E = 0; // 延时
LCM_E = 1;
}
//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC 为 0 时忽略忙检
测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
//读状态
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); // 检测忙信号
return(LCM_Data);
}
void LCMInit(void) //LCM 初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); // 三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); // 显示模式设置 ,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); // 关闭显示
WriteCommandLCM(0x01,1); // 显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; // 限制 X 不能大于 15,Y 不能大于 1
if (Y) X |= 0x40; // 当要显示第二行时地址码 0x40;
X |= 0x80; // 算出指令码
WriteCommandLCM(X, 0); // 这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; // 限制 X 不能大于 15,Y 不能大于 1
while (DData[ListLength]>0x20) // 若到达字串尾则退出
{
if (X <= 0xF) //X 坐标应小于 0xF
{
DisplayOneChar(X, Y, DData[ListLength]); // 显示单个字符
ListLength++;
X++;
}
}
}
//5ms 延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
/*void Delay_xMs(unsigned int x)
{
unsigned int i,j;
for( i =0;i < x;i++ )
{
for( j =0;j<500;j++ );
}
}
*/
void display_temp(void)
{
DisplayOneChar(0,0,' ');
DisplayOneChar(1,0,' ');
DisplayOneChar(2,0,'T');
DisplayOneChar(3,0,'e');
DisplayOneChar(4,0,'m');
DisplayOneChar(5,0,'p');
DisplayOneChar(6,0,':');
DisplayOneChar(10,0,'C');
DisplayOneChar(9,0,0xdf);
DisplayOneChar(7,0,temp_value/100+0x30);
DisplayOneChar(8,0,(temp_value/10)-(temp_value/100)*10+0x30);
DisplayOneChar(11,0,' ');
DisplayOneChar(12,0,' ');
DisplayOneChar(13,0,' ');
DisplayOneChar(14,0,' ');
DisplayOneChar(15,0,' ');
DisplayOneChar(0,1,' ');
DisplayOneChar(1,1,' ');
DisplayOneChar(2,1,'H');
DisplayOneChar(3,1,'u');
DisplayOneChar(4,1,'m');
DisplayOneChar(5,1,'i');
DisplayOneChar(6,1,'d');
DisplayOneChar(7,1,'i');
DisplayOneChar(8,1,'t');
DisplayOneChar(9,1,'y');
DisplayOneChar(10,1,':');
DisplayOneChar(11,1,humi_value/100+0x30);
DisplayOneChar(12,1,(humi_value/10)-(humi_value/100)*10+0x30);
DisplayOneChar(13,1,'%');
DisplayOneChar(14,1,' ');
DisplayOneChar(15,1,' ');
}
void display_temp1(void)
{
DisplayOneChar(0,0,' ');
DisplayOneChar(1,0,'T');
DisplayOneChar(2,0,'h');
DisplayOneChar(3,0,':');
if(flag&teh)
{
DisplayOneChar(4,0,0x20);
DisplayOneChar(5,0,0x20);
}
else
{
DisplayOneChar(4,0,temph/10+0x30);
DisplayOneChar(5,0,temph%10+0x30);
}
DisplayOneChar(6,0,0xdf);
DisplayOneChar(7,0,'C');
DisplayOneChar(8,0,' ');
DisplayOneChar(9,0,'T');
DisplayOneChar(10,0,'h');
DisplayOneChar(11,0,':');
if(flag&tel)
{
DisplayOneChar(12,0,0x20);
DisplayOneChar(13,0,0x20);
}
else
{
DisplayOneChar(12,0,templ/10+0x30);
DisplayOneChar(13,0,templ%10+0x30);
}
DisplayOneChar(14,0,0xdf);
DisplayOneChar(15,0,'C');
DisplayOneChar(0,1,' ');
DisplayOneChar(1,1,'H');
DisplayOneChar(2,1,'h');
DisplayOneChar(3,1,':');
if(flag&hh)
{
DisplayOneChar(4,1,0x20);
DisplayOneChar(5,1,0x20);
}
else
{
DisplayOneChar(4,1,huih/10+0x30);
DisplayOneChar(5,1,huih%10+0x30);
}
DisplayOneChar(6,1,'%');
DisplayOneChar(7,1,' ');
DisplayOneChar(8,1,' ');
DisplayOneChar(9,1,'H');
DisplayOneChar(10,1,'l');
DisplayOneChar(11,1,':');
if(flag&hl)
{
DisplayOneChar(12,1,0x20);
DisplayOneChar(13,1,0x20);
}
else
{
DisplayOneChar(12,1,huil/10+0x30);
DisplayOneChar(13,1,huil%10+0x30);
}
DisplayOneChar(14,1,'%');
DisplayOneChar(15,1,' ');
}
void displayfun1()
{
display_temp();
}
void displayfun2()
{
display_temp1();
}
void display()
{
if((((temp_value/10)%100)<templ)||(((humi_value/10)%100)<huil))
{beep=0;red=0;} //温度低于下限值,报警
else if(((temp_value/10)%100)>=temph || ((humi_value/10)%100)>=huih)
{beep=0;blue=0;} //温度高于或等于上限值,报警
else {beep=1;red=1;blue=1;}
// if(((humi_value/10)%100)<huil){beep=0;led=0;} //温度低
于下限值,报警
// else if(((humi_value/10)%100)>=huih)beep=0; //温度高于或等于上限
值,报警
// else {beep=1;led=1;}
if(!disp_mode)
displayfun1(); //显示正常
else
displayfun2(); //设置界面
}
#include "dht11.h"
#include <reg52.h>
//请根据自己的 dht11 接的 IO 口来改动位定义
sbit dht11 = P3^0;
//防止在与硬件通信时发生死循环的计数范围
#define NUMBER 20
#define SIZE 5
static unsigned char status;
//存放五字节数据的数组
static unsigned char value_array[SIZE];
/*可在其他的文件引用温湿度值 ,实际是温度的整数的 10 倍
如 dht11 读回的温度是 26,则 temp_value = 260, 湿度同理 */
int temp_value, humi_value;
static unsigned char ReadValue(void);
void Delay_1ms(unsigned int ms)
{
unsigned int x, y;
for(x = ms; x > 0; x--)
{
for(y = 124; y > 0; y--);
}
}
static void DHT11_Delay_10us(void)
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/*读一个字节的数据 */
static unsigned char DHT11_ReadValue(void)
{
unsigned char count, value = 0, i;
status = OK; //设定标志为正常状态
for(i = 8; i > 0; i--)
{
//高位在先
value <<= 1;
count = 0;
//每一位数据前会有一个 50us 的低电平时间 .等待 50us 低电平结束
while(dht11 == 0 && count++ < NUMBER);
if(count >= NUMBER)
{
status = ERROR; //设定错误标志
return 0; //函数执行过程发生错误就退出函数
}
//26-28us 的高电平表示该位是 0,为 70us 高电平表该位 1
DHT11_Delay_10us();
DHT11_Delay_10us();
DHT11_Delay_10us();
//延时 30us 后检测数据线是否还是高电平
if(dht11 != 0)
{
//进入这里表示该位是 1
value++;
//等待剩余 (约 40us)的高电平结束
while(dht11 != 0 && count++ < NUMBER)
{
dht11 = 1;
}
if(count >= NUMBER)
{
status = ERROR; //设定错误标志
return 0;
}
}
}
return (value);
}
//读温度和湿度函数, 读一次的数据 ,共五字节,读出成功函数返回 OK, 错误返回
ERROR
unsigned char DHT11_ReadTempAndHumi(void)
{
unsigned char i = 0, check_value = 0,count = 0;
EA = 0;
dht11 = 0; //拉低数据线大于 18ms 发送开始信号
Delay_1ms(20); //需大于 18 毫秒
dht11 = 1; //释放数据线 ,用于检测低电平的应答信号
//延时 20-40us,等待一段时间后检测应答信号 ,应答信号是从机拉低数据线
80us
DHT11_Delay_10us();
DHT11_Delay_10us();
DHT11_Delay_10us();
DHT11_Delay_10us();
if(dht11 != 0) // 检测应答信号 ,应答信号是低电平
{
//没应答信号
EA = 1;
return ERROR;
}
else
{
//有应答信号
while(dht11 == 0 && count++ < NUMBER); // 等待应答信号结束
if(count >= NUMBER) // 检测计数器是否超过了设定的范围
{
dht11 = 1;
EA = 1;
return ERROR; //读数据出错 ,退出函数
}
count = 0;
dht11 = 1;//释放数据线
//应答信号后会有一个 80us 的高电平,等待高电平结束
while(dht11 != 0 && count++ < NUMBER);
if(count >= NUMBER)
{
dht11 = 1;
EA = 1;
return ERROR; //退出函数
}
//读出湿 .温度值
for(i = 0; i < SIZE; i++)
{
value_array[i] = DHT11_ReadValue();
if(status == ERROR)//调用 ReadValue()读数据出错会设定 status 为
ERROR
{
dht11 = 1;
EA = 1;
return ERROR;
}
//读出的最后一个值是校验值不需加上去
if(i != SIZE - 1)
{
//读出的五字节数据中的前四字节数据和等于第五字节数据表示
成功
check_value += value_array[i];
}
}//end for
//在没用发生函数调用失败时进行校验
if(check_value == value_array[SIZE - 1])
{
//将温湿度扩大 10 倍方便分离出每一位
humi_value = value_array[0] * 10;
temp_value = value_array[2] * 10;
dht11 = 1;
EA = 1;
return OK; //正确的读出 dht11 输出的数据
}
else
{
//校验数据出错
EA = 1;
return ERROR;
}
}
}
#include "lcd1602.h"
#include "key_contrl.h"
#include"dht11.h"
#include <reg52.h>
int temp;
int temph = 40; //初始上限值
int templ = 10; //初始下限值
int huih = 90;
int huil =10;
int timecount,flag=0,number=0,count=0;
void t0(void) interrupt 1 using 0
{ TH0=(65535-50000)/256; //50ms定时
TL0=(65535-50000)%256;
timecount++;//re_disp++;
if(timecount>9){timecount=0;flag=~flag;} //50ms 到了则反显
//if(re_disp>200){re_disp=0;if(id)id=0;} //10 秒到了则由调整模式自动进入正
常显示模式
}
void t1(void) interrupt 3 using 0
{
TH1=(65535-50000)/256;//50ms定时
TL1=(65535-50000)%256;
number++;
if(number>2)
{
number=0;
count++;
//beep=0;
}
}
void main(void)
{
TMOD=0x11; //初始化定时器 t0 方式 1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
LCMInit(); //LCM 初始化
Delay5Ms(); //延时片刻
while(1)
{
if(count==2)
{
DHT11_ReadTempAndHumi();
count=0;
}
delay_LCM(300);
Scan_Key();
}
复制代码
作者:
xuyaqi
时间:
2019-4-1 08:08
在你这个c文件所在的工程文件里找,并加到头文件搜索路径里。
作者:
HC6800-ES-V2.0
时间:
2019-4-1 08:09
你把几个程序直接拷贝到一起是不行的!!!
原来的C程序,都应该加入到工程中,原来有的头文件,也应该在你设定的目录内。
程序可不是文档,直接复制粘贴是没有用的。
作者:
chtyise
时间:
2019-4-1 08:49
看看文件夹里面有没有那两个头文件,如果没有,看看在哪,在工程设置里面把文件路径加进去,也可以用#include “头文件绝对路径”
作者:
好整以暇
时间:
2019-4-1 09:23
如果.h已经在工程的目录里,检查一下options里面的c/c++有没有include paths对应的路径
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1