找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2565|回复: 2
打印 上一主题 下一主题
收起左侧

求助,温度传感器液晶显示加蜂鸣器报警,有段程序不会写

[复制链接]
跳转到指定楼层
楼主
温度传感器液晶显示加蜂鸣器报警,网上找的电路图和程序,电路图加了蜂鸣器部分,蜂鸣器段的程序不知道怎么写,有人会吗?
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code disp[]="0123456789";
  5. uchar code disp2[]="Tempreture";
  6. uchar code disp3[]="^C";
  7. sbit lcden=P2^0;
  8. sbit lcdrw=P2^1;
  9. sbit lcdrs=P2^2;
  10. sbit tempt=P2^3;
  11. uint u_temp;//定义无符号整型形参
  12. float f_temp;//定义浮点型形参


  13. void delay(uint x)//延时500ms程序
  14. {
  15. uint i,j;
  16. for(i=0;i<x;i++)
  17. for(j=0;j<130;j++);
  18. }

  19. void write_com(uchar com)//液晶写命令
  20. {
  21. lcdrs=0;
  22. P0=com;
  23. delay(5);
  24. lcden=1;
  25. delay(5);
  26. lcden=0;
  27. delay(5);
  28. }

  29. void write_data(uchar date)//液晶写数据
  30. {
  31. lcdrs=1;
  32. P0=date;
  33. delay(5);
  34. lcden=1;
  35. delay(5);
  36. lcden=0;
  37. delay(5);
  38. }


  39. void lcd_init()//液晶初始化
  40. {
  41. lcden=0;
  42. lcdrw=0;
  43. write_com(0x38);
  44. write_com(0x0c);
  45. write_com(0x06);
  46. write_com(0x01);
  47. }

  48. void display_tempt(uint date)//温度数据显示
  49. {
  50. uchar i,j,k;
  51. i=date/100;//十位
  52. j=date%100/10;//个位
  53. k=date%100%10;//小数位
  54. write_com(0x80+0x40+5);
  55. write_data(disp[i]);
  56. write_data(disp[j]);
  57. write_data('.');
  58. write_data(disp[k]);

  59. }



  60. void reset_tempt()//DS18B20复位,初始化
  61. {
  62. uint i;
  63. tempt=0;
  64. i=90;//延时
  65. while(i>0)i--;
  66. tempt=1;
  67. i=4;//延时
  68. while(i>0)i--;
  69. }


  70. bit read_bit()//读一位DS18B20数据
  71. {
  72. uint i;
  73. bit dat;
  74. tempt=0;
  75. i++;//延时
  76. tempt=1;
  77. i++;//延时
  78. i++;
  79. dat=tempt;
  80. i=8;//延时
  81. while(i>0)i--;
  82. return dat;
  83. }


  84. uchar read_tempt()//读一个字节DS18B20数据
  85. {
  86. uchar i,j,dat;
  87. dat=0;
  88. for(i=1;i<=8;i++)
  89. {
  90. j=read_bit();
  91. dat=(j<<7)|(dat>>1);//将读取的数据位按读取先后顺序,
  92. }//从低位到高位(从右往左)排列保存到dat
  93. return dat;
  94. }


  95. void write_byte(uchar dat)//写一个字节数据到DS18B20
  96. {
  97. uint i;
  98. uchar j;
  99. bit testbit;
  100. for(j=1;j<=8;j++)
  101. {
  102. testbit=dat&0x01;//每次只写一位数据
  103. dat=dat>>1;
  104. if(testbit)
  105. {
  106. tempt=0;
  107. i++;//延时
  108. tempt=1;
  109. i=8;//延时
  110. while(i>0)i--;
  111. }
  112. else
  113. {
  114. tempt=0;
  115. i=8;//延时
  116. while(i>0)i--;
  117. tempt=1;
  118. i++;//延时
  119. i++;
  120. }
  121. }
  122. }


  123. void convert_tempt()//DS18B20开始获取温度并进行转换
  124. {
  125. reset_tempt();
  126. delay(1);
  127. write_byte(0xcc);
  128. write_byte(0x44);
  129. }
  130. uint get_tempt()//读取DS18B20寄存器中的温度数据
  131. {
  132. uchar a,b;
  133. reset_tempt();
  134. delay(1);
  135. write_byte(0xcc);
  136. write_byte(0xbe);
  137. a=read_tempt();
  138. b=read_tempt();
  139. u_temp=b;
  140. u_temp<<=8;
  141. u_temp=u_temp|a;
  142. f_temp=u_temp*0.0625;//精度为12位,所以分辨率为0.0625
  143. u_temp=f_temp*10;//乘以10,将实际温度扩大10倍
  144. return u_temp;//返回的u_temp是整型数据
  145. }



  146. void display()//静态文字显示
  147. {
  148. uchar i,j;
  149. write_com(0x80+3);
  150. for(i=0;i<10;i++)
  151. {
  152. write_data(disp2[i]);
  153. }
  154. write_com(0x80+0x40+10);
  155. for(j=0;j<2;j++)
  156. {
  157. write_data(disp3[j]);
  158. }
  159. }



  160. void main()//主函数
  161. {
  162.   uchar i;
  163.   lcd_init();
  164.   display();
  165.   while(1)
  166. {
  167.   convert_tempt();
  168.   for(i=0;i<10;i++)
  169.   {display_tempt(get_tempt());}
  170.   }
  171.   }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

板凳
ID:325185 发表于 2018-5-9 17:40 | 只看该作者
笨笨兔 发表于 2018-5-9 09:47
程序懒得看。
好好看看原理图,你的蜂鸣器怎么报警?

怎么看?我第一次做,电路图已经觉得会了,但是程序对我来说太难了,不知道温度传感器怎么读取温度并显示,然后温度超过50度蜂鸣器报警
回复

使用道具 举报

沙发
ID:158375 发表于 2018-5-9 09:47 | 只看该作者
程序懒得看。
好好看看原理图,你的蜂鸣器怎么报警?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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