找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1535|回复: 4
收起左侧

单片机编译显示找不到lcd1602,dht11和key-contrl头文件?

[复制链接]
ID:502084 发表于 2019-3-31 23:34 | 显示全部楼层 |阅读模式
  1. #include <reg51.h>
  2. #include "key_contrl.h"
  3. #include "lcd1602.h"
  4. #define LCM_Data P1
  5. #define Busy 0x80 //用于检测 LCM 状态字中的 Busy 标识
  6. extern int temp_value, humi_value;
  7. extern int flag;
  8. extern int temp;
  9. sbit red=P2^6;
  10. sbit blue=P2^7;
  11. sbit LCM_RW= P2^4; // 定义引脚
  12. sbit LCM_RS= P2^5;
  13. sbit LCM_E= P2^3;
  14. sbit beep = P0^6; //beep = 0时候发声
  15. extern int temph,templ,disp_mode,huih,huil;
  16. extern char tel,teh,hh,hl;
  17. //写数据
  18. void alarm()
  19. {
  20. beep=0;
  21. Delay5Ms();
  22. Delay5Ms();
  23. beep=1;
  24. Delay5Ms();
  25. Delay5Ms();
  26. }
  27. void WriteDataLCM(unsigned char WDLCM)
  28. {
  29. ReadStatusLCM(); //检测忙
  30. LCM_Data = WDLCM;
  31. LCM_RS = 1;
  32. LCM_RW = 0;
  33. LCM_E = 0; // 若晶振速度太高可以在这后加小的延时
  34. LCM_E = 0; // 延时
  35. LCM_E = 1;
  36. }
  37. //写指令
  38. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC 为 0 时忽略忙检

  39. {
  40. if (BuysC) ReadStatusLCM(); //根据需要检测忙
  41. LCM_Data = WCLCM;
  42. LCM_RS = 0;
  43. LCM_RW = 0;
  44. LCM_E = 0;
  45. LCM_E = 0;
  46. LCM_E = 1;
  47. }
  48. //读数据
  49. unsigned char ReadDataLCM(void)
  50. {
  51. LCM_RS = 1;
  52. LCM_RW = 1;
  53. LCM_E = 0;
  54. LCM_E = 0;
  55. LCM_E = 1;
  56. return(LCM_Data);
  57. }
  58. //读状态
  59. unsigned char ReadStatusLCM(void)
  60. {
  61. LCM_Data = 0xFF;
  62. LCM_RS = 0;
  63. LCM_RW = 1;
  64. LCM_E = 0;
  65. LCM_E = 0;
  66. LCM_E = 1;
  67. while (LCM_Data & Busy); // 检测忙信号
  68. return(LCM_Data);
  69. }
  70. void LCMInit(void) //LCM 初始化
  71. {
  72. LCM_Data = 0;
  73. WriteCommandLCM(0x38,0); // 三次显示模式设置,不检测忙信号
  74. Delay5Ms();
  75. WriteCommandLCM(0x38,0);
  76. Delay5Ms();
  77. WriteCommandLCM(0x38,0);
  78. Delay5Ms();
  79. WriteCommandLCM(0x38,1); // 显示模式设置 ,开始要求每次检测忙信号
  80. WriteCommandLCM(0x08,1); // 关闭显示
  81. WriteCommandLCM(0x01,1); // 显示清屏
  82. WriteCommandLCM(0x06,1); // 显示光标移动设置
  83. WriteCommandLCM(0x0C,1); // 显示开及光标设置
  84. }
  85. //按指定位置显示一个字符
  86. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  87. {
  88. Y &= 0x1;
  89. X &= 0xF; // 限制 X 不能大于 15,Y 不能大于 1
  90. if (Y) X |= 0x40; // 当要显示第二行时地址码 0x40;
  91. X |= 0x80; // 算出指令码
  92. WriteCommandLCM(X, 0); // 这里不检测忙信号,发送地址码
  93. WriteDataLCM(DData);
  94. }
  95. //按指定位置显示一串字符
  96. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  97. {
  98. unsigned char ListLength;
  99. ListLength = 0;
  100. Y &= 0x1;
  101. X &= 0xF; // 限制 X 不能大于 15,Y 不能大于 1
  102. while (DData[ListLength]>0x20) // 若到达字串尾则退出
  103. {
  104. if (X <= 0xF) //X 坐标应小于 0xF
  105. {
  106. DisplayOneChar(X, Y, DData[ListLength]); // 显示单个字符
  107. ListLength++;
  108. X++;
  109. }
  110. }
  111. }
  112. //5ms 延时
  113. void Delay5Ms(void)
  114. {
  115. unsigned int TempCyc = 5552;
  116. while(TempCyc--);
  117. }
  118. /*void Delay_xMs(unsigned int x)
  119. {
  120. unsigned int i,j;
  121. for( i =0;i < x;i++ )
  122. {
  123. for( j =0;j<500;j++ );
  124. }
  125. }
  126. */
  127. void display_temp(void)
  128. {
  129. DisplayOneChar(0,0,' ');
  130. DisplayOneChar(1,0,' ');
  131. DisplayOneChar(2,0,'T');
  132. DisplayOneChar(3,0,'e');
  133. DisplayOneChar(4,0,'m');
  134. DisplayOneChar(5,0,'p');
  135. DisplayOneChar(6,0,':');
  136. DisplayOneChar(10,0,'C');
  137. DisplayOneChar(9,0,0xdf);
  138. DisplayOneChar(7,0,temp_value/100+0x30);
  139. DisplayOneChar(8,0,(temp_value/10)-(temp_value/100)*10+0x30);
  140. DisplayOneChar(11,0,' ');
  141. DisplayOneChar(12,0,' ');
  142. DisplayOneChar(13,0,' ');
  143. DisplayOneChar(14,0,' ');
  144. DisplayOneChar(15,0,' ');
  145. DisplayOneChar(0,1,' ');
  146. DisplayOneChar(1,1,' ');
  147. DisplayOneChar(2,1,'H');
  148. DisplayOneChar(3,1,'u');
  149. DisplayOneChar(4,1,'m');
  150. DisplayOneChar(5,1,'i');
  151. DisplayOneChar(6,1,'d');
  152. DisplayOneChar(7,1,'i');
  153. DisplayOneChar(8,1,'t');
  154. DisplayOneChar(9,1,'y');
  155. DisplayOneChar(10,1,':');
  156. DisplayOneChar(11,1,humi_value/100+0x30);
  157. DisplayOneChar(12,1,(humi_value/10)-(humi_value/100)*10+0x30);
  158. DisplayOneChar(13,1,'%');
  159. DisplayOneChar(14,1,' ');
  160. DisplayOneChar(15,1,' ');
  161. }
  162. void display_temp1(void)
  163. {
  164. DisplayOneChar(0,0,' ');
  165. DisplayOneChar(1,0,'T');
  166. DisplayOneChar(2,0,'h');
  167. DisplayOneChar(3,0,':');
  168. if(flag&teh)
  169. {
  170. DisplayOneChar(4,0,0x20);
  171. DisplayOneChar(5,0,0x20);
  172. }
  173. else
  174. {
  175. DisplayOneChar(4,0,temph/10+0x30);
  176. DisplayOneChar(5,0,temph%10+0x30);
  177. }
  178. DisplayOneChar(6,0,0xdf);
  179. DisplayOneChar(7,0,'C');
  180. DisplayOneChar(8,0,' ');
  181. DisplayOneChar(9,0,'T');
  182. DisplayOneChar(10,0,'h');
  183. DisplayOneChar(11,0,':');
  184. if(flag&tel)
  185. {
  186. DisplayOneChar(12,0,0x20);
  187. DisplayOneChar(13,0,0x20);
  188. }
  189. else
  190. {
  191. DisplayOneChar(12,0,templ/10+0x30);
  192. DisplayOneChar(13,0,templ%10+0x30);
  193. }
  194. DisplayOneChar(14,0,0xdf);
  195. DisplayOneChar(15,0,'C');
  196. DisplayOneChar(0,1,' ');
  197. DisplayOneChar(1,1,'H');
  198. DisplayOneChar(2,1,'h');
  199. DisplayOneChar(3,1,':');
  200. if(flag&hh)
  201. {
  202. DisplayOneChar(4,1,0x20);
  203. DisplayOneChar(5,1,0x20);
  204. }
  205. else
  206. {
  207. DisplayOneChar(4,1,huih/10+0x30);
  208. DisplayOneChar(5,1,huih%10+0x30);
  209. }
  210. DisplayOneChar(6,1,'%');
  211. DisplayOneChar(7,1,' ');
  212. DisplayOneChar(8,1,' ');
  213. DisplayOneChar(9,1,'H');
  214. DisplayOneChar(10,1,'l');
  215. DisplayOneChar(11,1,':');
  216. if(flag&hl)
  217. {
  218. DisplayOneChar(12,1,0x20);
  219. DisplayOneChar(13,1,0x20);
  220. }
  221. else
  222. {
  223. DisplayOneChar(12,1,huil/10+0x30);
  224. DisplayOneChar(13,1,huil%10+0x30);
  225. }
  226. DisplayOneChar(14,1,'%');
  227. DisplayOneChar(15,1,' ');
  228. }
  229. void displayfun1()
  230. {
  231. display_temp();
  232. }
  233. void displayfun2()
  234. {
  235. display_temp1();
  236. }
  237. void display()
  238. {
  239. if((((temp_value/10)%100)<templ)||(((humi_value/10)%100)<huil))
  240. {beep=0;red=0;} //温度低于下限值,报警
  241. else if(((temp_value/10)%100)>=temph || ((humi_value/10)%100)>=huih)
  242. {beep=0;blue=0;} //温度高于或等于上限值,报警
  243. else {beep=1;red=1;blue=1;}
  244. // if(((humi_value/10)%100)<huil){beep=0;led=0;} //温度低
  245. 于下限值,报警
  246. // else if(((humi_value/10)%100)>=huih)beep=0; //温度高于或等于上限
  247. 值,报警
  248. // else {beep=1;led=1;}
  249. if(!disp_mode)
  250. displayfun1(); //显示正常
  251. else
  252. displayfun2(); //设置界面
  253. }
  254. #include "dht11.h"
  255. #include <reg52.h>
  256. //请根据自己的 dht11 接的 IO 口来改动位定义
  257. sbit dht11 = P3^0;
  258. //防止在与硬件通信时发生死循环的计数范围
  259. #define NUMBER 20
  260. #define SIZE 5
  261. static unsigned char status;
  262. //存放五字节数据的数组
  263. static unsigned char value_array[SIZE];
  264. /*可在其他的文件引用温湿度值 ,实际是温度的整数的 10 倍
  265. 如 dht11 读回的温度是 26,则 temp_value = 260, 湿度同理 */
  266. int temp_value, humi_value;
  267. static unsigned char ReadValue(void);
  268. void Delay_1ms(unsigned int ms)
  269. {
  270. unsigned int x, y;
  271. for(x = ms; x > 0; x--)
  272. {
  273. for(y = 124; y > 0; y--);
  274. }
  275. }
  276. static void DHT11_Delay_10us(void)
  277. {
  278. unsigned char i;
  279. i--;
  280. i--;
  281. i--;
  282. i--;
  283. i--;
  284. i--;
  285. }
  286. /*读一个字节的数据 */
  287. static unsigned char DHT11_ReadValue(void)
  288. {
  289. unsigned char count, value = 0, i;
  290. status = OK; //设定标志为正常状态
  291. for(i = 8; i > 0; i--)
  292. {
  293. //高位在先
  294. value <<= 1;
  295. count = 0;
  296. //每一位数据前会有一个 50us 的低电平时间 .等待 50us 低电平结束
  297. while(dht11 == 0 && count++ < NUMBER);
  298. if(count >= NUMBER)
  299. {
  300. status = ERROR; //设定错误标志
  301. return 0; //函数执行过程发生错误就退出函数
  302. }
  303. //26-28us 的高电平表示该位是 0,为 70us 高电平表该位 1
  304. DHT11_Delay_10us();
  305. DHT11_Delay_10us();
  306. DHT11_Delay_10us();
  307. //延时 30us 后检测数据线是否还是高电平
  308. if(dht11 != 0)
  309. {
  310. //进入这里表示该位是 1
  311. value++;
  312. //等待剩余 (约 40us)的高电平结束
  313. while(dht11 != 0 && count++ < NUMBER)
  314. {
  315. dht11 = 1;
  316. }
  317. if(count >= NUMBER)
  318. {
  319. status = ERROR; //设定错误标志
  320. return 0;
  321. }
  322. }
  323. }
  324. return (value);
  325. }
  326. //读温度和湿度函数, 读一次的数据 ,共五字节,读出成功函数返回 OK, 错误返回
  327. ERROR
  328. unsigned char DHT11_ReadTempAndHumi(void)
  329. {
  330. unsigned char i = 0, check_value = 0,count = 0;
  331. EA = 0;
  332. dht11 = 0; //拉低数据线大于 18ms 发送开始信号
  333. Delay_1ms(20); //需大于 18 毫秒
  334. dht11 = 1; //释放数据线 ,用于检测低电平的应答信号
  335. //延时 20-40us,等待一段时间后检测应答信号 ,应答信号是从机拉低数据线
  336. 80us
  337. DHT11_Delay_10us();
  338. DHT11_Delay_10us();
  339. DHT11_Delay_10us();
  340. DHT11_Delay_10us();
  341. if(dht11 != 0) // 检测应答信号 ,应答信号是低电平
  342. {
  343. //没应答信号
  344. EA = 1;
  345. return ERROR;
  346. }
  347. else
  348. {
  349. //有应答信号
  350. while(dht11 == 0 && count++ < NUMBER); // 等待应答信号结束
  351. if(count >= NUMBER) // 检测计数器是否超过了设定的范围
  352. {
  353. dht11 = 1;
  354. EA = 1;
  355. return ERROR; //读数据出错 ,退出函数
  356. }
  357. count = 0;
  358. dht11 = 1;//释放数据线
  359. //应答信号后会有一个 80us 的高电平,等待高电平结束
  360. while(dht11 != 0 && count++ < NUMBER);
  361. if(count >= NUMBER)
  362. {
  363. dht11 = 1;
  364. EA = 1;
  365. return ERROR; //退出函数
  366. }
  367. //读出湿 .温度值
  368. for(i = 0; i < SIZE; i++)
  369. {
  370. value_array[i] = DHT11_ReadValue();
  371. if(status == ERROR)//调用 ReadValue()读数据出错会设定 status 为
  372. ERROR
  373. {
  374. dht11 = 1;
  375. EA = 1;
  376. return ERROR;
  377. }
  378. //读出的最后一个值是校验值不需加上去
  379. if(i != SIZE - 1)
  380. {
  381. //读出的五字节数据中的前四字节数据和等于第五字节数据表示
  382. 成功
  383. check_value += value_array[i];
  384. }
  385. }//end for
  386. //在没用发生函数调用失败时进行校验
  387. if(check_value == value_array[SIZE - 1])
  388. {
  389. //将温湿度扩大 10 倍方便分离出每一位
  390. humi_value = value_array[0] * 10;
  391. temp_value = value_array[2] * 10;
  392. dht11 = 1;
  393. EA = 1;
  394. return OK; //正确的读出 dht11 输出的数据
  395. }
  396. else
  397. {
  398. //校验数据出错
  399. EA = 1;
  400. return ERROR;
  401. }
  402. }
  403. }
  404. #include "lcd1602.h"
  405. #include "key_contrl.h"
  406. #include"dht11.h"
  407. #include <reg52.h>
  408. int temp;
  409. int temph = 40; //初始上限值
  410. int templ = 10; //初始下限值
  411. int huih = 90;
  412. int huil =10;
  413. int timecount,flag=0,number=0,count=0;
  414. void t0(void) interrupt 1 using 0
  415. { TH0=(65535-50000)/256; //50ms定时
  416. TL0=(65535-50000)%256;
  417. timecount++;//re_disp++;
  418. if(timecount>9){timecount=0;flag=~flag;} //50ms 到了则反显
  419. //if(re_disp>200){re_disp=0;if(id)id=0;} //10 秒到了则由调整模式自动进入正
  420. 常显示模式
  421. }
  422. void t1(void) interrupt 3 using 0
  423. {
  424. TH1=(65535-50000)/256;//50ms定时
  425. TL1=(65535-50000)%256;
  426. number++;
  427. if(number>2)
  428. {
  429. number=0;
  430. count++;
  431. //beep=0;
  432. }
  433. }
  434. void main(void)
  435. {
  436. TMOD=0x11; //初始化定时器 t0 方式 1
  437. TH0=(65535-50000)/256;
  438. TL0=(65535-50000)%256;
  439. TH1=(65535-50000)/256;
  440. TL1=(65535-50000)%256;
  441. EA=1;
  442. ET0=1;
  443. ET1=1;
  444. TR0=1;
  445. TR1=1;
  446. LCMInit(); //LCM 初始化
  447. Delay5Ms(); //延时片刻
  448. while(1)
  449. {
  450. if(count==2)
  451. {
  452. DHT11_ReadTempAndHumi();
  453. count=0;
  454. }
  455. delay_LCM(300);
  456. Scan_Key();
  457. }
复制代码
回复

使用道具 举报

ID:94031 发表于 2019-4-1 08:08 | 显示全部楼层
在你这个c文件所在的工程文件里找,并加到头文件搜索路径里。
回复

使用道具 举报

ID:164602 发表于 2019-4-1 08:09 | 显示全部楼层
你把几个程序直接拷贝到一起是不行的!!!
原来的C程序,都应该加入到工程中,原来有的头文件,也应该在你设定的目录内。
程序可不是文档,直接复制粘贴是没有用的。
回复

使用道具 举报

ID:337069 发表于 2019-4-1 08:49 | 显示全部楼层
看看文件夹里面有没有那两个头文件,如果没有,看看在哪,在工程设置里面把文件路径加进去,也可以用#include “头文件绝对路径”
回复

使用道具 举报

ID:491621 发表于 2019-4-1 09:23 | 显示全部楼层
如果.h已经在工程的目录里,检查一下options里面的c/c++有没有include paths对应的路径
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表