找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6197|回复: 8
收起左侧

基于51单片机和红外收发模块的远程温度控制与检测

[复制链接]
ID:223492 发表于 2017-7-31 10:20 | 显示全部楼层 |阅读模式
红外线遥控Proteus仿真电路+发射+接收程序

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

同时还附带了大量的相关新资料:
0.png
目录:
hw+ds1307\
38kHz 红外发射与接收.doc
8050.pdf
8050S.pdf
90182.pdf
901850303.pdf
S8050.pdf
wendu.ldb
基于M50462AP和CX20106A芯片的双工红外线通信系统.pdf
基于nRF9E5的多点无线温度采集系统设计.pdf
基于ZigBee技术的公共场所无线温度采集系统.pdf
微机—单片机红外线通信.pdf
无线温度采集系统.doc
无线温度采集系统.pdf
无线温度采集系统的设计.pdf
无线温度采集系统设计报告.doc
用89C51单片机控制红外线通信接口电路设计.pdf
短距离无线温度采集系统设计.pdf
线温度采集系统.pdf

0.png

单片机发送源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<absacc.h>

  4. #define  uchar  unsigned  char
  5. #define  uint   unsigned  int

  6. #define Write_comm XBYTE[0XFCFF]    //RS=0,RW=0,指令寄存器写入  0100 0000
  7. #define Read_addr XBYTE[0XFEFF]     //RS=0,RW=1,忙标志和地址计数器读出   0100 0010
  8. #define Write_data XBYTE[0X4DFF]

  9. sbit  DATA = P1^0; //DS18B20接入口

  10. uchar t;
  11. uchar xsd;



  12. delay1(uint i)            //延时1MS
  13. {
  14. uint j,k;
  15. for(j=0;j<i;j++)
  16. for(k=0;k<120;k++);
  17. }

  18. /*延时子函数*/
  19. void delay(uint num)
  20. {
  21.         while(num--) ;
  22. }


  23. void LCDBusy()           //------------lcd忙碌判断
  24. {

  25. uchar a;
  26.    do{
  27.       P0=0xFF;
  28.       a=Read_addr;
  29.       }
  30.      while ((a&0x80)!=0x00);
  31. }


  32. void LCDInit()                        //---------------lcd初始化
  33. {
  34.   LCDBusy();
  35. Write_comm=0x38;       //使用8 位数据,显示两行,使用5*7 的字型
  36.   LCDBusy();
  37. Write_comm=0x01;      //清屏
  38.   LCDBusy();
  39. Write_comm=0x06;       //字符不动,光标自动右移一格
  40.   LCDBusy();
  41. Write_comm=0x0c;      //显示器开,光标不显示,字符不闪烁
  42. }



  43. lcd1()        //---------数据处理,液晶显示屏第一行处理程序
  44. {
  45. LCDBusy();
  46. Write_comm=0x80;
  47. LCDBusy();
  48. Write_data=(0x54);             //T
  49. LCDBusy();
  50. Write_data=(0x65);            //e
  51. LCDBusy();
  52. Write_data=(0x6d);            //m
  53. LCDBusy();
  54. Write_data=(0x70);             //p
  55. LCDBusy();
  56. Write_data=(0x65);             //e
  57. LCDBusy();
  58. Write_data=(0x72);             //r
  59. LCDBusy();
  60. Write_data=(0x61);             //a
  61. LCDBusy();
  62. Write_data=(0x74);             //t
  63. LCDBusy();
  64. Write_data=(0x75);             //u
  65. LCDBusy();
  66. Write_data=(0x72);             //r
  67. LCDBusy();
  68. Write_data=(0x65);             //e
  69. LCDBusy();
  70. Write_data=(0x3a);             //:
  71. LCDBusy();
  72. Write_comm=0xc0;
  73. LCDBusy();
  74. Write_data=0x2b;
  75. LCDBusy();
  76. Write_comm=0xc4;
  77. LCDBusy();
  78. Write_data=0x2e;  
  79. LCDBusy();
  80. Write_comm=0xc6;
  81. LCDBusy();
  82. Write_data=0xdf;
  83. LCDBusy();
  84. Write_data=0x43;

  85. }


  86. xsdcl()         //小数点位处理程序
  87. {
  88.   switch(xsd)
  89. {
  90. case 0x00:  return(0);   break;
  91. case 0x01:  return(0);   break;
  92. case 0x02:  return(1);   break;
  93. case 0x03:  return(1);   break;
  94. case 0x04:  return(2);   break;
  95. case 0x05:  return(3);   break;
  96. case 0x06:  return(3);   break;
  97. case 0x07:  return(4);   break;
  98. case 0x08:  return(5);   break;
  99. case 0x09:  return(5);   break;
  100. case 0x0a:  return(6);   break;
  101. case 0x0b:  return(6);   break;
  102. case 0x0c:  return(7);   break;
  103. case 0x0d:  return(8);   break;
  104. case 0x0e:  return(8);   break;
  105. case 0x0f:  return(9);   break;
  106. default:   break;
  107. }

  108. }



  109. lcd2()        //---------数据处理,液晶显示屏第二行处理程序,显示当前温度
  110. {

  111. uchar a[4];

  112. a[0]=t/100;                                           
  113. a[1]=(t%100)/10;                                             
  114. a[2]=t%10;
  115. a[3]=xsdcl();                                              
  116.                      
  117. LCDBusy();
  118. Write_comm=0xc1;
  119. LCDBusy();
  120. Write_data=a[0]+0x30;          //百位
  121. LCDBusy();
  122. Write_data=a[1]+0x30;         //十位
  123. LCDBusy();
  124. Write_data=a[2]+0x30;        //个
  125. LCDBusy();
  126. Write_comm=0xc5;

  127. LCDBusy();
  128. Write_data=a[3]+0x30;      //小数点位      
  129. }



  130. /*******************************************DS18b20温度传感器函数***************************************/

  131. //传感器初始化
  132. Init_DS18B20(void)                  
  133. {
  134.         uchar x=0;
  135.         DATA = 1;    //DQ复位
  136.         delay(10);  //稍做延时
  137.         DATA = 0;    //单片机将DQ拉低
  138.         delay(80); //精确延时 大于 480us    //450
  139.         DATA = 1;    //拉高总线
  140.         delay(20);
  141.         x=DATA;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  142.         delay(30);
  143. }

  144. //读一个字节
  145. ReadOneChar(void)
  146. {
  147.         uchar i=0;
  148.         uchar dat = 0;
  149.         for (i=8;i>0;i--)
  150.         {
  151.                   DATA = 0; // 给脉冲信号
  152.                   dat>>=1;
  153.                   DATA = 1; // 给脉冲信号
  154.                   if(DATA)
  155.                    dat|=0x80;
  156.                   delay(8);
  157.         }
  158.         return(dat);
  159. }

  160. //写一个字节
  161. WriteOneChar(unsigned char dat)
  162. {
  163.         uchar i=0;
  164.         for (i=8; i>0; i--)
  165.         {
  166.                   DATA = 0;
  167.                   DATA = dat&0x01;
  168.           delay(10);
  169.           DATA = 1;
  170.           dat>>=1;
  171.         }
  172.         delay(8);
  173. }

  174. //读取温度
  175. ReadTemperature(void)
  176. {
  177.         uchar a=0;
  178.         uchar b=0;
  179.         //int t=0;
  180.         float tt=0;
  181.         Init_DS18B20();
  182.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  183.         WriteOneChar(0x44); // 启动温度转换
  184.         Init_DS18B20();
  185.         WriteOneChar(0xCC); //跳过读序号列号的操作
  186.         WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

  187.         a=ReadOneChar();//低位
  188.         b=ReadOneChar();//高位

  189.     //b=b&0x0f;
  190.         t=b<<4;

  191.     xsd=a&0x0f;
  192.     a=a>>4;
  193.     t=t|a;
  194. }
  195. /*********************************************************************************************************/



  196. //*****************温度采集单片机串行口发送程序***********************//

  197. void transdata()   
  198. {
  199. uchar m[2];
  200. uchar i;
  201. m[0]=t;
  202. m[1]=xsd;
  203. for(i=0;i<2;i++)
  204. {
  205. SBUF=m[i];
  206. while(!TI);
  207. TI=0;
  208. }
  209. }


  210. //**********串行口初始化,串行工作在工作方式1,T1定时,工作在方式2,波特率不加倍*************//
  211. void Initial()   
  212. ……………………

  213. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
基于51单片机和红外收发模块的远程温度控制与检测.rar (2.37 MB, 下载次数: 113)
回复

使用道具 举报

ID:102679 发表于 2017-8-5 10:53 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:294229 发表于 2018-3-23 09:37 | 显示全部楼层
谢谢您的分享,很有帮助
回复

使用道具 举报

ID:294229 发表于 2018-3-23 09:38 | 显示全部楼层
谢谢分享,很有帮助
回复

使用道具 举报

ID:297180 发表于 2018-3-26 13:10 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:322550 发表于 2018-5-5 10:02 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:328844 发表于 2018-5-13 14:31 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:440585 发表于 2019-12-7 15:40 | 显示全部楼层
楼主您好  这个程序非常实用  能帮我加一个接收模块上 当温度达到255.9度时P1^7脚输出低电平吗? 谢谢了
回复

使用道具 举报

ID:698376 发表于 2020-3-23 17:00 | 显示全部楼层
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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