找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机检测温度,光照,测距,串口上传程序

[复制链接]
跳转到指定楼层
楼主
ID:222500 发表于 2019-8-3 11:48 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  1. /*------------------------------------------------
  2.                 包含头文件
  3. ------------------------------------------------*/
  4. #include<reg52.h>
  5. #include"uart.h"
  6. #include"lcd.h"
  7. #include"ds1302.h"
  8. #include"18b20.h"
  9. #include"xpt2046.h"
  10. #include"hcsr04.h"
  11. #include"delay.h"
  12. #include<stdio.h>
  13. #include"hcsr04.h"
  14. #include"key.h"

  15. char CMER [10] = "厘米--";
  16. char TIER[10] = "摄氏度--";
  17. char TIMER[6] = "时间\n";
  18. char LIGHTH[10] = "光照强度--";






  19. bit      flag =0;
  20. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.',':','-','M','S'};


  21. void UsartConfiguration()
  22. {
  23.         SCON=0X50;                        //设置为工作方式1
  24.         TMOD=0X20;                        //设置计数器工作方式2
  25.         PCON=0X80;                        //波特率加倍
  26.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  27.         TL1=0XF3;
  28. //        ES=1;                                                //打开接收中断
  29. //        EA=1;                                                //打开总中断
  30.         TR1=1;                                        //打开计数器
  31. }


  32. void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  33.   {
  34.     flag=1;                                                         //中断溢出标志
  35. }



  36. /*------------------------------------------------
  37.                    S级延时
  38. ------------------------------------------------*/
  39. void DelayS(unsigned char u)
  40. {
  41. while(u--)
  42.       {
  43.           DelayMs(250);
  44.           DelayMs(250);
  45.           DelayMs(250);
  46.           DelayMs(250);
  47.           }
  48. }

  49. /*------------------------------------------------
  50.                    主函数
  51. ------------------------------------------------*/
  52. main()
  53. {
  54.    unsigned char DisNum = 0; //显示用指针                                 
  55.    unsigned int  time=0;
  56.    unsigned long S=0;
  57.    unsigned char i, disbuff[2]           ={0,0,};
  58.   unsigned char disp[3];
  59.   unsigned char datas[] = {0, 0, 0, 0};
  60.   int temp,light;                 //温度值
  61.    float tp;


  62. Int0Configuration();
  63. InitUART ();     //初始化串口
  64. LCD_Init();      //初始化LCD1602
  65. Ds1302Init();
  66. DelayMs(30);     //稳定
  67. zhongduan()        ;
  68. UsartConfiguration();
  69. LCD_Write_String(0,0,"Welcome to me!");//液晶显示测试
  70. LCD_Write_String(0,1,"tengjianhao");
  71. DelayS(2);
  72. LCD_Clear();
  73. while(1)
  74.      {         
  75.              key();
  76.                  LCD_Write_String(0,0,"Time:");//液晶显示测试
  77.                  LCD_Write_Com(0x85);
  78.                  LCD_Write_Data('0'+TIME[2]/16) ;
  79.                  LCD_Write_Data('0'+(TIME[2]&0x0f));
  80.                  SBUF = '0'+TIME[2]/16;//将接收到的数据放入到发送寄存器
  81.           while (!TI);                                 //等待发送数据完成
  82.               TI = 0;
  83.                   SBUF = '1'+TIME[2]/16;//将接收到的数据放入到发送寄存器
  84.           while (!TI);                                 //等待发送数据完成
  85.               TI = 0;
  86.                    SBUF = '.';//将接收到的数据放入到发送寄存器
  87.           while (!TI);                                 //等待发送数据完成
  88.               TI = 0;
  89.                  LCD_Write_Data('-');
  90.                  LCD_Write_Data('0'+TIME[1]/16) ;
  91.                  LCD_Write_Data('0'+(TIME[1]&0x0f));
  92.                  SBUF = '0'+TIME[1]/16;//将接收到的数据放入到发送寄存器
  93.           while (!TI);                                 //等待发送数据完成
  94.               TI = 0;
  95.                   SBUF = '1'+TIME[1]/16;//将接收到的数据放入到发送寄存器
  96.           while (!TI);                                 //等待发送数据完成
  97.               TI = 0;
  98.                    SBUF = '.';//将接收到的数据放入到发送寄存器
  99.           while (!TI);                                 //等待发送数据完成
  100.               TI = 0;
  101.                  LCD_Write_Data('-');
  102.                  LCD_Write_Data('0'+TIME[0]/16) ;
  103.                  LCD_Write_Data('0'+(TIME[0]&0x0f));
  104.                  SBUF = '0'+TIME[0]/16;//将接收到的数据放入到发送寄存器
  105.           while (!TI);                                 //等待发送数据完成
  106.               TI = 0;
  107.                   SBUF = '1'+TIME[0]/16;//将接收到的数据放入到发送寄存器
  108.           while (!TI);                                 //等待发送数据完成
  109.               TI = 0;
  110.          for(i=0; i<8; i++)
  111.                {
  112.                       SBUF = TIMER[i];//将接收到的数据放入到发送寄存器
  113.                        while (!TI);                                 //等待发送数据完成
  114.                     TI = 0;
  115.                  }
  116.                  
  117.                  

  118.                 LCD_Write_String(0,1,"T:");
  119.                  temp=ReadTemperature();//读取温度
  120.          DelayS(1);
  121.          temp=ReadTemperature();
  122.                  tp=temp;
  123.                  temp=tp*0.0625*100+0.5;
  124.              datas[0] = temp % 10000 / 1000;
  125.              datas[1] = temp % 1000 / 100;
  126.                  LCD_Write_Com(0x80+0x42);
  127.                  LCD_Write_Data('0'+datas[0])  ;
  128.                  LCD_Write_Data('0'+datas[0]&0x0f)  ;
  129.                 SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器
  130.           while (!TI);                                 //等待发送数据完成
  131.               TI = 0;
  132.                  LCD_Write_Com(0x80+0x43);
  133.                  LCD_Write_Data('0'+datas[1]);
  134.                  LCD_Write_Data('0'+datas[1]&0x0f) ;
  135.                  SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器
  136.           while (!TI);                                 //等待发送数据完成
  137.               TI = 0;
  138.                   for(i=0; i<10; i++)
  139.                {
  140.                       SBUF = TIER[i];//将接收到的数据放入到发送寄存器
  141.                        while (!TI);                                 //等待发送数据完成
  142.                     TI = 0;
  143.                  }
  144.                  LCD_Write_Com(0x80+0x44);
  145.                  LCD_Write_Data('C') ;


  146.                  LCD_Write_String(6,1,"L:");
  147.                  light = Read_AD_Data(0xA4)/10;
  148.              disp[0]=light%1000/100;//百位
  149.              disp[1]=light%1000%100/10;//个位
  150.              disp[2]=light%1000%100%10;
  151.                  LCD_Write_Com(0x80+0x48);
  152.                  LCD_Write_Data('0'+disp[1])  ;
  153.                  LCD_Write_Data('0'+disp[1]&0x0f)  ;
  154.                  SBUF = '0'+disp[1];//将接收到的数据放入到发送寄存器
  155.           while (!TI);                                 //等待发送数据完成
  156.               TI = 0;
  157.                  LCD_Write_Com(0x80+0x49);
  158.                  LCD_Write_Data('0'+disp[2])  ;
  159.                  LCD_Write_Data('0'+disp[2]&0x0f)  ;
  160.                  SBUF = '0'+disp[2];//将接收到的数据放入到发送寄存器
  161.           while (!TI);                                 //等待发送数据完成
  162.               TI = 0;
  163.                    for(i=0; i<10; i++)
  164.                {
  165.                       SBUF = LIGHTH[i];//将接收到的数据放入到发送寄存器
  166.                        while (!TI);                                 //等待发送数据完成
  167.                     TI = 0;
  168.                  }
  169.                  LCD_Write_Com(0x80+0x4A);
  170.                  LCD_Write_Data('%') ;
  171.                


  172.                  LCD_Write_String(12,1,"S:");
  173.                  chaosheng() ;
  174.              time=TH0*256+TL0;
  175.              TH0=0;
  176.              TL0=0;
  177.              S=(time*1.7)/1000;     //算出来是CM
  178.              if((S>=100)||flag==1) //超出测量范围显示“-”
  179.              {         
  180.                flag=0;
  181.                SBUF='0';//将接收到的数据放入到发送寄存器
  182.                while(!TI);                                 //等待发送数据完成
  183.                TI=0;
  184.                    SBUF='0';//将接收到的数据放入到发送寄存器
  185.                while(!TI);                                 //等待发送数据完成
  186.                TI=0;
  187.                          for(i=0; i<10; i++)
  188.                {
  189.                       SBUF = CMER [i];//将接收到的数据放入到发送寄存器
  190.                        while (!TI);                                 //等待发送数据完成
  191.                     TI = 0;
  192.                  }
  193.                    LCD_Write_Com(0x80+0x4E);
  194.                    LCD_Write_Data(ASCII[12]) ;
  195.                    LCD_Write_Com(0x80+0x4F);
  196.                    LCD_Write_Data(ASCII[12]) ;        

  197.               }
  198.               else
  199.               {
  200.          
  201.               disbuff[0]=S%1000%100/10;
  202.               SBUF = '0'+disbuff[0];//将接收到的数据放入到发送寄存器
  203.           while (!TI);                                 //等待发送数据完成
  204.               TI = 0;
  205.               disbuff[1]=S%1000%10 %10;
  206.               SBUF = '0'+disbuff[1];//将接收到的数据放入到发送寄存器
  207.               while (!TI);                                 //等待发送数据完成
  208.               TI = 0;
  209.               for(i=0; i<10; i++)
  210.                {
  211.                       SBUF = CMER [i];//将接收到的数据放入到发送寄存器
  212.                        while (!TI);                                 //等待发送数据完成
  213.                     TI = 0;
  214.                  }
  215.                    LCD_Write_Com(0x80+0x4E);
  216.                    LCD_Write_Data(ASCII[disbuff[0]]) ;
  217.                    LCD_Write_Com(0x80+0x4F);
  218.                    LCD_Write_Data(ASCII[disbuff[1]]);
  219.                }

  220. }
  221. }
复制代码

多功能测量(功能).rar

107.86 KB, 下载次数: 13, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:1 发表于 2019-8-3 15:22 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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