单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LPC1788的多路数据采集系统下位机+LabVIEW下位机程序

[复制链接]
跳转到指定楼层
楼主
包含程序源码,电路图


单片机源程序如下:
  1. #include "../LPC177x_8x/LPC177x_8x.h"
  2. #include "../LPC177x_8x/type.h"
  3. #include "../ADC/adc.h"
  4. #define BEEPON            (LPC_GPIO3->CLR = 1ul << 30)                  /* 蜂鸣器工作                   */
  5. #define BEEPOFF           (LPC_GPIO3->SET = 1ul << 30)                  /* 蜂鸣器不工作                 */
  6. #if ADC_DEBUG
  7. #include "../UART/uart.h"
  8. #endif

  9. extern volatile uint32_t ADCValue[ADC_NUM];
  10. extern volatile uint32_t ADCIntDone;

  11. #if ADC_DEBUG
  12. extern volatile uint32_t UART0Count;
  13. extern volatile uint8_t UART0Buffer[BUFSIZE];
  14. #endif


  15. #if ADC_DEBUG
  16. /*********************************************************************************************************
  17. ** 函数名称 :ConvertDigital
  18. ** 函数功能 :Convert Digital to ASCII
  19. ** 输入参数 : 字符
  20. ** 返回值   : ASCII字符
  21. *********************************************************************************************************/
  22. static uint8_t ConvertDigital ( uint8_t digit )
  23. {
  24.     static uint8_t hex[] = "0123456789ABCDEF";
  25.     return hex[digit & 0xf];
  26. }
  27. #endif

  28. /*********************************************************************************************************
  29. ** 函数名称:myDelay
  30. ** 函数描述:软件延时
  31. ** 输入参数:ulTime    延时大小
  32. ** 返回值  :无
  33. *********************************************************************************************************/
  34. //uint8_t tdata[5]={0x00,0x00,0x00,0x00,0x00};
  35. uint8_t buf[7];
  36. uint8_t sbuf,check;
  37. void myDelay (uint32_t ulTime)
  38. {
  39.     uint32_t i = 0;

  40.     while (ulTime--)
  41.                 {
  42.         for (i = 0; i < 20000; i++);
  43.     }
  44. }
  45. void usDelay (uint32_t ulTime)
  46. {
  47.     uint32_t i = 0;
  48.     while (ulTime--)
  49.                 {
  50.         for (i = 0; i < 20; i++);
  51.     }
  52. }
  53. void DHT11_Rst(void)          
  54. {                 
  55.         LPC_GPIO3->DIR |= 1<<25;        //SET OUTPUT
  56.   LPC_GPIO3->CLR = 1ul << 25 ;         //拉低DQ
  57.   myDelay(20);            //拉低至少18ms
  58.   LPC_GPIO3->SET = 1ul << 25;        //DQ=1
  59.         usDelay(30);             //主机拉高20~40us
  60. }
  61. //等待DHT11的回应
  62. //返回1:未检测到DHT11的存在
  63. //返回0:存在
  64. uint8_t DHT11_Check(void)           
  65. {   
  66.         uint8_t retry=0;
  67.         LPC_GPIO3->DIR &= ~(1 << 25);    //SET INPUT         
  68.   while (!(LPC_GPIO3->PIN & 1 << 25)&&retry<100)//DHT11会拉低40~80us
  69.         {
  70.                 retry++;
  71.                 usDelay(1);
  72.         }
  73.         if(retry>=100)
  74.                 return 1;
  75.         else retry=0;
  76.   while ((LPC_GPIO3->PIN & 1 << 25)&&retry<100)//DHT11拉低后会再次拉高40~80us
  77.         {
  78.                 retry++;
  79.                 usDelay(1);
  80.         }
  81.         if(retry>=100)
  82.                 return 1;            
  83.         return 0;
  84. }
  85. //从DHT11读取一个位
  86. //返回值:1/0
  87. uint8_t DHT11_Read_Bit(void)                          
  88. {
  89.         uint8_t retry=0;
  90.         while((LPC_GPIO3->PIN & 1 << 25)&&retry<100)//等待变为低电平
  91.         {
  92.                 retry++;
  93.                 usDelay(1);
  94.         }
  95.         retry=0;
  96.         while(!(LPC_GPIO3->PIN & 1 << 25)&&retry<100)//等待变高电平
  97.         {
  98.                 retry++;
  99.                 usDelay(1);
  100.         }
  101.         usDelay(40);//等待40us
  102.         if((LPC_GPIO3->PIN & 1 << 25))return 1;
  103.         else return 0;                  
  104. }
  105. //从DHT11读取一个字节
  106. //返回值:读到的数据
  107. uint8_t DHT11_Read_Byte(void)   
  108. {        
  109.   uint8_t i,dat;
  110.   dat=0;
  111.         for (i=0;i<8;i++)
  112.         {
  113.                         dat<<=1;
  114.             dat|=DHT11_Read_Bit();
  115.   }                                                    
  116.     return dat;
  117. }
  118. //从DHT11读取一次数据
  119. //temp:温度值(范围:0~50°)
  120. //humi:湿度值(范围:20%~90%)
  121. //返回值:0,正常;1,读取失败
  122. uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)   
  123. {        
  124.        
  125.         uint8_t i;
  126.         DHT11_Rst();
  127.         if(DHT11_Check()==0)
  128.         {
  129.                 for(i=0;i<5;i++)//读取40位数据
  130.                 {
  131.                         buf[i]=DHT11_Read_Byte();
  132.                 }
  133.                 buf[5] = '\r';
  134.                 buf[6] = '\n';       
  135.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  136.                 {
  137.                         *humi=buf[0];
  138.                         *temp=buf[2];
  139.                 }
  140.         }
  141.         else return 1;
  142.         //return 0;            
  143. }
  144. //初始化DHT11的IO口 DQ 同时检测DHT11的存在
  145. //返回1:不存在
  146. //返回0:存在             
  147. uint8_t DHT11_Init(void)
  148. {
  149.         LPC_GPIO3->DIR |= 1<<25;  
  150.         DHT11_Rst();
  151.         return DHT11_Check();
  152. }


  153. /*********************************************************************************************************
  154. ** 函数名称 :main
  155. ** 函数描述 :查询方式采集ADC0的电压,短接ADC_IN和P0.23(JP20)、TXD0和P0.2、RXD0和P0.3,
  156. **            由UART0发送采集到的数据,波特率9600。
  157. ** 输入参数 : 无
  158. ** 返回值   : 系统返回值
  159. *********************************************************************************************************/

  160. int main (void)
  161. {   uint32_t i,VEL;
  162.     uint32_t ADCSum = 0;
  163.                 uint8_t kk, temperature, humidity;  
  164.                 uint8_t d1,d2,d3,d4;
  165.     SystemInit();

  166. #if ADC_DEBUG                                                         /* 如果定义了调试则编译串口初始化 */
  167.     UARTInit(0, 9600);

  168.           
  169. #endif

  170.     ADCInit1( ADC_CLK );                                               /* ADC初始化                      */
  171.    
  172.                
  173.                 DHT11_Init();
  174.                 LPC_GPIO3->DIR |= 1<<30;                                            /* 设置P3.30为输出              */
  175.                 LPC_GPIO3->SET |= 1<<30;          //beep
  176.                 LPC_GPIO3->DIR |= 1<<31;//led
  177.                 LPC_GPIO3->SET |= 1<<31;
  178.     LPC_GPIO3->DIR |= 1<<25;//led
  179.                 LPC_GPIO3->SET |= 1<<25;
  180.                
  181.                 LPC_GPIO0->DIR &= ~(1 << 12);                                       /* 设置P0.12为输入              */
  182.         while(1)
  183.     {
  184.                                 ADCInit1( ADC_CLK );
  185.         for(i = 0; i < ADC_NUM; i++)
  186.                                 {
  187.             ADC_Start(0);                                             /* 打开A/D转换                    */
  188.             while(ADC_GetStat(0));                                    /* 等待转换完成                   */
  189.             ADCValue[i]=ADCRead(0);                                   /* 读ADC通道0采集到的值           */
  190.                                 }        
  191.         ADCSum=0;
  192.         for(i = 0; i < ADC_NUM; i++)
  193.                                 {
  194.             ADCSum += ADCValue[i];
  195.         }
  196.         ADCSum /= ADC_NUM;                                            /* 取平均值                       */
  197.         VEL=ADCSum*33*1000/40950/5*3.96+0.4;
  198.                                 d1=VEL/1000;
  199.                                 d2=VEL/100%10;
  200.                                 d3=VEL/10%10;
  201.                                 d4=VEL%10;
  202.                                 UART0Buffer[0] = 'A';
  203.         UART0Buffer[1] = d1+'0';//ConvertDigital( (uint8_t)((ADCSum>>8)&0xF)); // 转换成ASCII码                                  
  204.         UART0Buffer[2] ='.';// ConvertDigital( (uint8_t)((ADCSum>>4)&0xF));
  205.         UART0Buffer[3] = d2+'0';//ConvertDigital( (uint8_t)(ADCSum&0xF));                               
  206.         UART0Buffer[4] = d3+'0';//
  207.         UART0Buffer[5] = d4+'0';//
  208.                                 UART0Buffer[6] ='V';
  209.                                 UART0Buffer[7] ='1';
  210.                                 if(VEL>=2000)
  211.                                 {
  212.                                           BEEPON;
  213.                                                 LPC_GPIO3->CLR = 1ul << 31;
  214.                                                 myDelay(100);
  215.                                                 LPC_GPIO3->SET |= 1<<31;
  216.                                                 myDelay(100);
  217.                                 }
  218.                                 else
  219.                                         {
  220.                                                 BEEPOFF;
  221.                                                 LPC_GPIO3->SET |= 1<<31;       
  222.                                         }
  223.         UARTSend( 0, (uint8_t *)UART0Buffer, 8);                      /* 通过串口0发送转换结果          */
  224.                                 myDelay(200); /* 200ms延时,方便观察            */                                                                                                                
  225. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////                               
  226.                                 ADCInit2( ADC_CLK );
  227.                                 for(i = 0; i < ADC_NUM; i++)
  228.                                 {
  229.             ADC_Start(1);                                             /* 打开A/D转换                    */
  230.             while(ADC_GetStat(1));                                    /* 等待转换完成                   */
  231.             ADCValue[i]=ADCRead(1);                                   /* 读ADC通道1采集到的值           */
  232.         }
  233.         ADCSum=0;
  234.         for(i = 0; i < ADC_NUM; i++)
  235.                                 {
  236.             ADCSum += ADCValue[i];
  237.         }
  238.         ADCSum /= ADC_NUM;                                            /* 取平均值                       */
  239.         VEL=3300-ADCSum*33*1000/40950;
  240.                                 d1=VEL/1000;
  241.                                 d2=VEL/100%10;
  242.                                 d3=VEL/10%10;
  243.                                 d4=VEL%10;
  244.         UART0Buffer[0] = d1+'0';//ConvertDigital( (uint8_t)((ADCSum>>8)&0xF)); // 转换成ASCII码                  
  245.         UART0Buffer[1] ='.';// ConvertDigital( (uint8_t)((ADCSum>>4)&0xF));
  246.         UART0Buffer[2] = d2+'0';//ConvertDigital( (uint8_t)(ADCSum&0xF));                       
  247.         UART0Buffer[3] = d3+'0';//
  248.         UART0Buffer[4] = d4+'0';//
  249.                                 UART0Buffer[5] ='V';
  250.                                 UART0Buffer[6] ='2';
  251.                                 if(VEL>=2000)
  252.                                 {
  253.                                           BEEPON;
  254.                                                 LPC_GPIO3->CLR = 1ul << 31;
  255.                                                 myDelay(100);
  256.                                                 LPC_GPIO3->SET |= 1<<31;
  257.                                                 myDelay(100);
  258.                                 }
  259.                                 else
  260.                                         {
  261.                                                 BEEPOFF;
  262.                                                 LPC_GPIO3->SET |= 1<<31;       
  263.                                         }
  264.         UARTSend( 0, (uint8_t *)UART0Buffer, 7);                      /* 通过串口0发送转换结果          */
  265.                                 myDelay(200);                                                                                                   /* 200ms延时,方便观察            */
  266. ////////////////////////////////////////////////////////////////////////////
  267.                 //DHT11:8BIT湿度8bit湿度小数;8BIT温度8bit温度∈,8bit校验
  268.                                         //        kk = ReadDHT11();
  269.                                  //UART0Buffer[4] = '\r';
  270. //         UART0Buffer[5] = '\n';
  271.                                 DHT11_Read_Data(&temperature,&humidity);
  272.                         //buf[0]+=0x30;
  273.                                 //buf[2]+=0x30;

  274.                                 //uint8_t data[5]={0x21,0x24-0x01};
  275.                                         VEL=temperature*33*1000/256;
  276.                                 d2=VEL/100%10;
  277.                                 d3=VEL/10%10;
  278.                                 d4=VEL%10;
  279.        // UART0Buffer[0] = d1+'0';//ConvertDigital( (uint8_t)((ADCSum>>8)&0xF)); // 转换成ASCII码                  
  280.        // UART0Buffer[1] ='.';// ConvertDigital( (uint8_t)((ADCSum>>4)&0xF));
  281.                                 UART0Buffer[0] = d2+'0';//ConvertDigital( (uint8_t)(ADCSum&0xF));                       
  282.         UART0Buffer[1] = d3+'0';//
  283.                                 UART0Buffer[2] ='.';
  284.         UART0Buffer[3] = d4+'0';//
  285.                                 UART0Buffer[4] ='C';
  286.                                 if(VEL>=300)
  287.                                 {
  288.                                           BEEPON;
  289.                                                 LPC_GPIO3->CLR = 1ul << 31;
  290.                                                 myDelay(100);
  291.                                                 LPC_GPIO3->SET |= 1<<31;
  292.                                                 myDelay(100);
  293.                                 }
  294.                                 else
  295.                                         {
  296.                                                 BEEPOFF;
  297. ……………………

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

所有资料51hei提供下载:
基于LPC1788的多路数据采集系统.rar (465.04 KB, 下载次数: 7)


评分

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

查看全部评分

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

使用道具 举报

沙发
wyhkerry 发表于 2019-3-29 16:51 | 只看该作者
学习了,谢谢;
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛5群 联系QQ:125739409;技术交流QQ群174280738

Powered by 单片机教程网

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