单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-17 发布时间:
|

包含程序源码,电路图


单片机源程序如下:


 

#include "../LPC177x_8x/LPC177x_8x.h"

#include "../LPC177x_8x/type.h"

#include "../ADC/adc.h"

#define BEEPON            (LPC_GPIO3->CLR = 1ul << 30)                  /* 蜂鸣器工作                   */

#define BEEPOFF           (LPC_GPIO3->SET = 1ul << 30)                  /* 蜂鸣器不工作                 */

#if ADC_DEBUG

#include "../UART/uart.h"

#endif


extern volatile uint32_t ADCValue[ADC_NUM];

extern volatile uint32_t ADCIntDone;


#if ADC_DEBUG

extern volatile uint32_t UART0Count;

extern volatile uint8_t UART0Buffer[BUFSIZE];

#endif



#if ADC_DEBUG

/*********************************************************************************************************

** 函数名称 :ConvertDigital

** 函数功能 :Convert Digital to ASCII

** 输入参数 : 字符

** 返回值   : ASCII字符

*********************************************************************************************************/

static uint8_t ConvertDigital ( uint8_t digit )

{

    static uint8_t hex[] = "0123456789ABCDEF";

    return hex[digit & 0xf];

}

#endif


/*********************************************************************************************************

** 函数名称:myDelay

** 函数描述:软件延时

** 输入参数:ulTime    延时大小

** 返回值  :无

*********************************************************************************************************/

//uint8_t tdata[5]={0x00,0x00,0x00,0x00,0x00};

uint8_t buf[7];

uint8_t sbuf,check;

void myDelay (uint32_t ulTime)

{

    uint32_t i = 0;


    while (ulTime--) 

                {

        for (i = 0; i < 20000; i++);

    }

}

void usDelay (uint32_t ulTime)

{

    uint32_t i = 0;

    while (ulTime--)

                {

        for (i = 0; i < 20; i++);

    }

}

void DHT11_Rst(void)           

{                 

        LPC_GPIO3->DIR |= 1<<25;        //SET OUTPUT

  LPC_GPIO3->CLR = 1ul << 25 ;         //拉低DQ

  myDelay(20);            //拉低至少18ms

  LPC_GPIO3->SET = 1ul << 25;        //DQ=1 

        usDelay(30);             //主机拉高20~40us

}

//等待DHT11的回应

//返回1:未检测到DHT11的存在

//返回0:存在

uint8_t DHT11_Check(void)            

{   

        uint8_t retry=0;

        LPC_GPIO3->DIR &= ~(1 << 25);    //SET INPUT         

  while (!(LPC_GPIO3->PIN & 1 << 25)&&retry<100)//DHT11会拉低40~80us

        {

                retry++;

                usDelay(1);

        } 

        if(retry>=100)

                return 1;

        else retry=0;

  while ((LPC_GPIO3->PIN & 1 << 25)&&retry<100)//DHT11拉低后会再次拉高40~80us

        {

                retry++;

                usDelay(1);

        }

        if(retry>=100)

                return 1;            

        return 0;

}

//从DHT11读取一个位

//返回值:1/0

uint8_t DHT11_Read_Bit(void)                          

{

        uint8_t retry=0;

        while((LPC_GPIO3->PIN & 1 << 25)&&retry<100)//等待变为低电平

        {

                retry++;

                usDelay(1);

        }

        retry=0;

        while(!(LPC_GPIO3->PIN & 1 << 25)&&retry<100)//等待变高电平

        {

                retry++;

                usDelay(1);

        }

        usDelay(40);//等待40us

        if((LPC_GPIO3->PIN & 1 << 25))return 1;

        else return 0;                   

}

//从DHT11读取一个字节

//返回值:读到的数据

uint8_t DHT11_Read_Byte(void)    

{        

  uint8_t i,dat;

  dat=0;

        for (i=0;i<8;i++) 

        {

                        dat<<=1; 

            dat|=DHT11_Read_Bit();

  }                                                    

    return dat;

}

//从DHT11读取一次数据

//temp:温度值(范围:0~50°)

//humi:湿度值(范围:20%~90%)

//返回值:0,正常;1,读取失败

uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)    

{        

        

        uint8_t i;

        DHT11_Rst();

        if(DHT11_Check()==0)

        {

                for(i=0;i<5;i++)//读取40位数据

                {

                        buf[i]=DHT11_Read_Byte();

                }

                buf[5] = 'r';

                buf[6] = 'n';        

                if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])

                {

                        *humi=buf[0];

                        *temp=buf[2];

                }

        }

        else return 1;

        //return 0;            

}

//初始化DHT11的IO口 DQ 同时检测DHT11的存在

//返回1:不存在

//返回0:存在             

uint8_t DHT11_Init(void)

{

        LPC_GPIO3->DIR |= 1<<25;  

        DHT11_Rst();

        return DHT11_Check();

}



/*********************************************************************************************************

** 函数名称 :main

** 函数描述 :查询方式采集ADC0的电压,短接ADC_IN和P0.23(JP20)、TXD0和P0.2、RXD0和P0.3,

**            由UART0发送采集到的数据,波特率9600。

** 输入参数 : 无

** 返回值   : 系统返回值

*********************************************************************************************************/


int main (void)

{   uint32_t i,VEL;

    uint32_t ADCSum = 0;

                uint8_t kk, temperature, humidity;  

                uint8_t d1,d2,d3,d4;

    SystemInit();


#if ADC_DEBUG                                                         /* 如果定义了调试则编译串口初始化 */

    UARTInit(0, 9600);


           

#endif


    ADCInit1( ADC_CLK );                                               /* ADC初始化                      */

    

                

                DHT11_Init();

                LPC_GPIO3->DIR |= 1<<30;                                            /* 设置P3.30为输出              */

                LPC_GPIO3->SET |= 1<<30;          //beep

                LPC_GPIO3->DIR |= 1<<31;//led

                LPC_GPIO3->SET |= 1<<31; 

    LPC_GPIO3->DIR |= 1<<25;//led

                LPC_GPIO3->SET |= 1<<25;



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机基础知识之二