找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+433M无线室内外温度显示装置设计与制作 含实物与仿真图

  [复制链接]
跳转到指定楼层
楼主
作品:基于433M的无线温度传输模块,显示在数码管上,左边为室外温度,右边为室内温度(可以自己根据需要在代码中调节左右显示的内容),附件中含有发送部分和接收部分的代码以及HC-12的使用说明书

制作出来的实物图如下:


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



发送部分代码:
  1. /*******************************************************************************
  2. *  标题:   基于433M的无线温度传输模块                         *
  3. *  时间  2018年11月6日12:24:58                                   *
  4. *                                                                              *
  5. *  实验说明:本装置用的是433M进行无线传输,理论距离在1KM左右,实际可能会短点, *
  6. 433的启动电流在200mA,所以需要锂电池或者USB进行供电。所以耗电量比较大。        *
  7.                                                                                *
  8. ********************************************************************************
  9. * 实验心得:代码中的数码管显示部分,在proteus中是不显示的,因为DS18B20的温度采 *
  10. 集在ms级别,而数码管全显的刷新时间是在μs级别。所以在仿真中不会成功显示,但是按 *
  11. 照仿真焊接的实物图可以成功显示。如果想让protues也成功显示,需要将数码管显示或者*
  12. 温度采集的部分放入时间中断里面,即可成功显示。但是实际的实物效果不好,会出现跳 *
  13. 动的情况,费眼睛                                                                                                                           *
  14.                                                                                                                                                *
  15. ********************************************************************************/
  16. #include<reg51.h>
  17. #include "ds18b20.h"

  18. unsigned char TP[2];
  19. int Temp;
  20. sbit LED = P1^0;
  21. //--声明全局函数--//
  22. void UsartConfiguration();
  23. void Delay10ms(unsigned int c);   //误差 0us

  24. /*******************************************************************************
  25. * 函 数 名         : main
  26. * 函数功能                   : 主函数
  27. * 输    入         : 无
  28. * 输    出         : 无
  29. *******************************************************************************/

  30. void main()
  31. {
  32.         unsigned char i;
  33.         float tp;
  34.         UsartConfiguration();
  35.         LED = 0;
  36.         while(1)
  37.         {
  38.                 Temp = Ds18b20ReadTemp();
  39.                 if(Temp< 0)                                //当温度值为负数
  40.                   {
  41.                         Temp=Temp-1;
  42.                         tp=~Temp;
  43.                         Temp=tp*0.0625*10+0.5;        
  44.                         //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  45.                         //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  46.                         //算由?.5,还是在小数点后面。
  47.                         TP[0] = Temp/256;
  48.                         TP[1] = Temp%256;
  49.          
  50.                   }
  51.                   else
  52.                   {
  53.                     tp = Temp;                        
  54.                         Temp=tp*0.0625*10+0.5;        
  55.                         //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  56.                         //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  57.                         //算加上0.5,还是在小数点后面。
  58.                         TP[0] = Temp/256;
  59.                         TP[1] = Temp%256;
  60.                 }
  61.                 for(i=0; i<2; i++)
  62.                 {
  63.                         SBUF = TP[i];   //将要发送的数据放入到发送寄存器
  64.                         while(!TI);                  //等待发送数据完成
  65.                         TI=0;
  66.                         Delay10ms(100);                  //延时一下再发                          //清除发送完成标志位
  67.                 }
  68.         
  69.             //Delay10ms(10);        
  70.         }
  71. }
  72. /*******************************************************************************
  73. * 函 数 名         :UsartConfiguration()
  74. * 函数功能                   :设置串口
  75. * 输    入         : 无
  76. * 输    出         : 无
  77. *******************************************************************************/

  78. void UsartConfiguration()
  79. {
  80.         SCON=0X50;                        //设置为工作方式1
  81.         TMOD=0X20;                        //设置计数器工作方式2
  82.         PCON=0X00;                        //波特率加倍
  83.         TH1=0XFA;                    //计数器初始值设置,注意波特率是4800的
  84.         TL1=0XFA;
  85.         EA=1;                                                //打开总中断
  86.         TR1=1;                                            //打开计数器
  87. }

  88. /*******************************************************************************
  89. * 函 数 名         : Delay10ms
  90. * 函数功能                   : 延时函数,延时10ms
  91. * 输    入         : 无
  92. * 输    出         : 无
  93. *******************************************************************************/

  94. void Delay10ms(unsigned int c)   //误差 0us
  95. {
  96.     unsigned char a, b;

  97.         //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
  98.     for (;c>0;c--)
  99.         {
  100.                 for (b=38;b>0;b--)
  101.                 {
  102.                         for (a=130;a>0;a--);
  103.                 }         
  104.         }      
  105. }

复制代码
接收部分代码:
  1. #include <reg51.h>
  2. #include "ds18b20.h"

  3. //--定义使用的IO--//
  4. #define GPIO_DIG P0

  5. sbit LSA=P2^0;
  6. sbit LSB=P2^1;
  7. sbit LSC=P2^2;
  8. sbit E = P1^0;
  9. sbit AB = P2^3;

  10. //--定义全局变量--//
  11. unsigned char TP[8];
  12. int Temp;
  13. int i;
  14. int j = -1;
  15. int receiveData;
  16. unsigned char receive[2];


  17. unsigned char code DIG_CODE[17]={
  18. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  19. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  20. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  21. unsigned char DisplayData[8];
  22. //用来存放要显示的8位数的值

  23. //--声明全局函数--//
  24. void DigDisplay();         //动态显示函数           
  25. void UsartConfiguration();
  26. /*******************************************************************************
  27. * 函 数 名         : main
  28. * 函数功能                   : 主函数
  29. * 输    入         : 无
  30. * 输    出         : 无
  31. *******************************************************************************/

  32. void main()
  33. {
  34.         float tp;
  35.         UsartConfiguration();
  36.         E = 1;
  37.         AB = 1;        
  38.         while(1)
  39.         {
  40.                 Temp = Ds18b20ReadTemp();
  41.                 if(Temp< 0)                                //当温度值为负数
  42.                   {
  43.                         Temp=Temp-1;
  44.                         tp=~Temp;
  45.                         Temp=tp*0.0625*10+0.5;        
  46.                         //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  47.                         //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  48.                         //算由?.5,还是在小数点后面。
  49.                         TP[4] = (Temp%1000)/100;
  50.                         TP[5] = ((Temp%1000)%100)/10;
  51.                         TP[6] = Temp%10;
  52.                         TP[7] =  12;
  53.          
  54.                   }
  55.                   else
  56.                   {
  57.                     tp = Temp;                        
  58.                         Temp=tp*0.0625*10+0.5;        
  59.                         //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  60.                         //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  61.                         //算加上0.5,还是在小数点后面。
  62.                         TP[4] = (Temp%1000)/100;
  63.                         TP[5] = ((Temp%1000)%100)/10;
  64.                         TP[6] = Temp%10;
  65.                         TP[7] =  12;
  66.                 }
  67. //
  68.                 if(RI == 1)                                //查看是否接收到数据
  69.                 {
  70.                         j++;  
  71.                         receive[j] = SBUF;        //读取数据
  72.                         if(j==2)
  73.                         {
  74.                             j = 0;
  75.                                 receiveData = 256*receive[0]+receive[1];
  76.                                 receive[0] = SBUF;
  77.                                 TP[0] =  (receiveData%1000)/100;
  78.                                 TP[1] =  ((receiveData%1000)%100)/10;
  79.                                 TP[2] =  receiveData%10;
  80.                                 TP[3] =  12;
  81.                         }
  82.                         RI = 0;        
  83.                         
  84.                 }
  85.             DigDisplay();
  86.         //        P0 = 0xef;
  87.         
  88.                
  89.         }
  90. }
  91. /*******************************************************************************
  92. * 函 数 名         :UsartConfiguration()
  93. * 函数功能                   :设置串口
  94. * 输    入         : 无
  95. * 输    出         : 无
  96. *******************************************************************************/

  97. void UsartConfiguration()
  98. {
  99.         SCON=0X50;                        //设置为工作方式1
  100.         TMOD=0X20;                        //设置计数器工作方式2
  101.         //PCON=0X80;                        //波特率加倍
  102.         PCON=0x00;                        //波特率未加倍
  103.         TH1=0XFA;                    //计数器初始值设置,注意波特率是4800的
  104.         TL1=0XFA;
  105.         TR1=1;                                            //打开计数器
  106. }
  107. /*******************************************************************************
  108. * 函 数 名         : DigDisplay
  109. * 函数功能                   : 使用数码管显示
  110. * 输    入         : 无
  111. * 输    出         : 无
  112. *******************************************************************************/
  113. void DigDisplay()
  114. {
  115.         unsigned char i;
  116.         unsigned int j;
  117.         for(i=0;i<8;i++)
  118.         {
  119.                 switch(i)         //位选,选择点亮的数码管,
  120.                 {
  121.                         case(0):
  122.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  123.                         case(1):                                                                                                                                                                                                                           
  124.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  125.                         case(2):
  126.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  127.                         case(3):
  128.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  129.                         case(4):
  130.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  131.                         case(5):
  132.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  133.                         case(6):
  134.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  135.                         case(7):
  136.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  137.                 }
  138.                 if(i!=1 && i!=5)
  139.                 GPIO_DIG=DIG_CODE[TP[i]];//发送段码
  140.                 else if(i==1 || i==5)
  141.                 GPIO_DIG=DIG_CODE[TP[i]]+0x80;
  142.                 j=30;                                                 //扫描间隔时间设定.
  143.                 while(j--);        
  144.                 GPIO_DIG=0x00;//消隐   
  145.         }
  146. }

复制代码


433M无线温度系统的全部设计资料51hei下载地址:
基于433M室内外无线温度传输模块.zip (1.62 MB, 下载次数: 95)


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:243076 发表于 2019-1-14 16:50 | 只看该作者
楼主你好,我想问一下你仿真的图片显示的是P3.7  这个是接受的吗?   发送的是不是只需要接P3.6就可以了
回复

使用道具 举报

板凳
ID:372961 发表于 2019-1-19 23:36 | 只看该作者
tw081531 发表于 2019-1-14 16:50
楼主你好,我想问一下你仿真的图片显示的是P3.7  这个是接受的吗?   发送的是不是只需要接P3.6就可以了

仿真图不支持433模拟,所以仿真图中我没有放入串口通信的部分。P3.7是用于ds18b20的,另外433这边只支持半双工,同一时间只能由一个设备发送。从全双工改下就可以
回复

使用道具 举报

地板
ID:483019 发表于 2019-3-1 22:53 | 只看该作者
哇!好耶,很想学习。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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