包含程序源码,电路图
单片机源程序如下:
- #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)
|