找回密码
 立即注册

QQ登录

只需一步,快速开始

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

使用道具 举报

沙发
ID:94031 发表于 2019-4-1 08:08 | 只看该作者
在你这个c文件所在的工程文件里找,并加到头文件搜索路径里。
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

5#
ID:491621 发表于 2019-4-1 09:23 | 只看该作者
如果.h已经在工程的目录里,检查一下options里面的c/c++有没有include paths对应的路径
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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