包含程序源碼,電路圖
單片機源程序如下:
- #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;
-
- LPC_GPIO0->DIR &= ~(1 << 12); /* 設置P0.12為輸入 */
- while(1)
- {
- ADCInit1( ADC_CLK );
- for(i = 0; i < ADC_NUM; i++)
- {
- ADC_Start(0); /* 打開A/D轉換 */
- while(ADC_GetStat(0)); /* 等待轉換完成 */
- ADCValue[i]=ADCRead(0); /* 讀ADC通道0采集到的值 */
- }
- ADCSum=0;
- for(i = 0; i < ADC_NUM; i++)
- {
- ADCSum += ADCValue[i];
- }
- ADCSum /= ADC_NUM; /* 取平均值 */
- VEL=ADCSum*33*1000/40950/5*3.96+0.4;
- d1=VEL/1000;
- d2=VEL/100%10;
- d3=VEL/10%10;
- d4=VEL%10;
- UART0Buffer[0] = 'A';
- UART0Buffer[1] = d1+'0';//ConvertDigital( (uint8_t)((ADCSum>>8)&0xF)); // 轉換成ASCII碼
- UART0Buffer[2] ='.';// ConvertDigital( (uint8_t)((ADCSum>>4)&0xF));
- UART0Buffer[3] = d2+'0';//ConvertDigital( (uint8_t)(ADCSum&0xF));
- UART0Buffer[4] = d3+'0';//
- UART0Buffer[5] = d4+'0';//
- UART0Buffer[6] ='V';
- UART0Buffer[7] ='1';
- if(VEL>=2000)
- {
- BEEPON;
- LPC_GPIO3->CLR = 1ul << 31;
- myDelay(100);
- LPC_GPIO3->SET |= 1<<31;
- myDelay(100);
- }
- else
- {
- BEEPOFF;
- LPC_GPIO3->SET |= 1<<31;
- }
- UARTSend( 0, (uint8_t *)UART0Buffer, 8); /* 通過串口0發送轉換結果 */
- myDelay(200); /* 200ms延時,方便觀察 */
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ADCInit2( ADC_CLK );
- for(i = 0; i < ADC_NUM; i++)
- {
- ADC_Start(1); /* 打開A/D轉換 */
- while(ADC_GetStat(1)); /* 等待轉換完成 */
- ADCValue[i]=ADCRead(1); /* 讀ADC通道1采集到的值 */
- }
- ADCSum=0;
- for(i = 0; i < ADC_NUM; i++)
- {
- ADCSum += ADCValue[i];
- }
- ADCSum /= ADC_NUM; /* 取平均值 */
- VEL=3300-ADCSum*33*1000/40950;
- d1=VEL/1000;
- d2=VEL/100%10;
- d3=VEL/10%10;
- d4=VEL%10;
- UART0Buffer[0] = d1+'0';//ConvertDigital( (uint8_t)((ADCSum>>8)&0xF)); // 轉換成ASCII碼
- UART0Buffer[1] ='.';// ConvertDigital( (uint8_t)((ADCSum>>4)&0xF));
- UART0Buffer[2] = d2+'0';//ConvertDigital( (uint8_t)(ADCSum&0xF));
- UART0Buffer[3] = d3+'0';//
- UART0Buffer[4] = d4+'0';//
- UART0Buffer[5] ='V';
- UART0Buffer[6] ='2';
- if(VEL>=2000)
- {
- BEEPON;
- LPC_GPIO3->CLR = 1ul << 31;
- myDelay(100);
- LPC_GPIO3->SET |= 1<<31;
- myDelay(100);
- }
- else
- {
- BEEPOFF;
- LPC_GPIO3->SET |= 1<<31;
- }
- UARTSend( 0, (uint8_t *)UART0Buffer, 7); /* 通過串口0發送轉換結果 */
- myDelay(200); /* 200ms延時,方便觀察 */
- ////////////////////////////////////////////////////////////////////////////
- //DHT11:8BIT濕度8bit濕度小數;8BIT溫度8bit溫度∈,8bit校驗
- // kk = ReadDHT11();
- //UART0Buffer[4] = '\r';
- // UART0Buffer[5] = '\n';
- DHT11_Read_Data(&temperature,&humidity);
- //buf[0]+=0x30;
- //buf[2]+=0x30;
- //uint8_t data[5]={0x21,0x24-0x01};
- VEL=temperature*33*1000/256;
- d2=VEL/100%10;
- d3=VEL/10%10;
- d4=VEL%10;
- // UART0Buffer[0] = d1+'0';//ConvertDigital( (uint8_t)((ADCSum>>8)&0xF)); // 轉換成ASCII碼
- // UART0Buffer[1] ='.';// ConvertDigital( (uint8_t)((ADCSum>>4)&0xF));
- UART0Buffer[0] = d2+'0';//ConvertDigital( (uint8_t)(ADCSum&0xF));
- UART0Buffer[1] = d3+'0';//
- UART0Buffer[2] ='.';
- UART0Buffer[3] = d4+'0';//
- UART0Buffer[4] ='C';
- if(VEL>=300)
- {
- BEEPON;
- LPC_GPIO3->CLR = 1ul << 31;
- myDelay(100);
- LPC_GPIO3->SET |= 1<<31;
- myDelay(100);
- }
- else
- {
- BEEPOFF;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
基于LPC1788的多路數據采集系統.rar
(465.04 KB, 下載次數: 43)
2019-3-21 15:04 上傳
點擊文件名下載附件
|