葛云平 单片机课程设计.docx_第1页
葛云平 单片机课程设计.docx_第2页
葛云平 单片机课程设计.docx_第3页
葛云平 单片机课程设计.docx_第4页
葛云平 单片机课程设计.docx_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机课程设计报告设计课题: 基于单片机的多路数据采集 专业班级: 14电信本学生姓名: 葛云平 学 号:140802013 指导教师: 李秋生 设计时间: 2016.6.11 多路数据采集设计一、设计任务与要求1设计基于单片机的多路数据采集电路;2利用液晶显示器进行显示;二、方案设计与论证本设计是以89C51单片机为控制中心,这种控制芯片具有4KB的快擦写可编程/擦除只读存储器EEPROM、256KB片内RAM、3个16位定时计数器、5个中断源,无需进行系统扩展既可满足任务要求,能较大幅度提高系统的性价比。本设计基于单片机的多路数据,其中的数据可以是电压,电流,温湿度,光度,PM2.5等。基于本人的学习知识,本人选择测量多路电压和温湿度,分别基于ADC0809测量和DHT11测量。其中ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。工作时只需接任意I/O口测量即可。1. 方案一(基于ADC0809芯片的设计)进行多路电压测量时可用ADC0809中规模集成芯片。其中ADC0809最多可测量八通路电压。2通道电压测量:调节电位器模拟出2通道不同电压。由于只有两路电压,因此只需分别接到IN0,IN1即可,其余IN口接地即可。对于ADDA、ADDB、ADDC3位地址输入线则只需接地位线ADDA即可,另外地址线则只需接地即可。 图2.1 方案一2. 方案二(基于DHT11芯片的设计)DHT11data脚接任意I/O口即可。图2.2 方案二通过分析,结合设计电路性能指标、器件的性价比,本设计电路选择方案二。三、单元电路设计与参数计算及原件介绍 1、 DHT11数字传感器:数字温湿度传感DHT11是由广州奥松有限公司生产的一款温湿度一体化的数字传感器。1 主要特性DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。2 应用领域该DHT11可以用于暖通空调、测试及检测设备、汽车、数据记录器、消费品、自动控制、湿度调节器及医疗等应用领域。3 接口说明 建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。图3-2 dht11应用电路3.1.4 电源引脚DHT11的供电电压为35.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。3.1.6 DHT11引脚图图3-4 引脚图3.1.7 注意事项温度影响 气体的相对湿度,在很大程度上依赖于温度。因此在测量湿温时,应尽可能保证湿度传感器在同一温度下工作。如果与释放热量的电子元件共用一个印刷线 路板,在安装时应尽可能将DHT11远离电子元件,并安装在热源下方,同时保持 外壳的良好通风。3.4.1 液晶显示屏简介LCD1602A 是一种工业字符型液晶,能够同时显示16x02 即32个字符。(16列2行)。在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单。在单片机系统中应用晶液显示器作为输出器件有以下几个优点:由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。 液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。 液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。 相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。 (1)引脚说明:第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第714脚:D0D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。(2)1602LCD的RAM地址映射以及标准字库表LCD1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,这些字符图有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母。它的读写操作、屏幕和光标的操作都是通过指令编程来实现的(说明:1为高电平,0为低电平)。指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H 。指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 。S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 。指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示。 C:控制光标的开与关,高电平表示有光标,低电平表示无光标。 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁 。指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标 。指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线。 N:低电平时为单行显示,高电平时双行显示。 F:低电平时显示5X7的点阵字符,高电平时显示5x10的点阵字符 (有些模块是 DL:高电平时为8位总线,低电平时为4位总线)。指令7:字符发生器RAM地址设置 。指令8:DDRAM地址设置 。指令9:读出忙信号和光标地址。 BF为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙,模块就能接收相应的命令或者数据。指令10:写数据 。指令11:读数据 。液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。1602 内部显示地址如图3-6所示: 图3-6 1602内部显示地址例如第二行第一个字符的地址是40H,那么是否直接写入40H 就可以将光标定位在第二行第 一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H) 。在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602 液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下图所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H 中的点阵字符图形显示出来,我们就能看到字母“A”。功能部分电路如图3所示。 图3.1 晶振电路 图3.2 液晶显示电路图3.3 温湿度传感器电路 图3.4 复位电路四、总原理图及元器件清单1总原理图 4.1 总电路五、程序112 /* 名 称:温室参数测量仪表 传感器:DHT11温湿度传感器 BH1750光照度传感器 显示器:1602液晶*/ 20 / 20#include#include#include #define uchar unsigned char#define uint unsigned int#define DataPort P0 /定义LCD1602液晶显示器所占用的数据端口sbit DQ=P17; /DHT11温湿度传感器所使用的端口 sbit SDA=P21; / BH1750光照度传感器数据引脚定义sbit lcden=P37; /LCD1602液晶显示器使能端口sbit lcdrs=P34; /LCD1602液晶显示器数据/命令选择端口sbit lcdrw=P36; /LCD1602液晶显示器读/写选择端口uchar wendu; /温度变量类型uchar shidu; /湿度变量类型float guangqiang; /光照度变量类型/*BH1750初始化定义,详情设置见手册*/#define SlaveAddress 0x46 /定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 /ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3Atypedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF8; /接收数据缓存区 uchar ge=0,shi=0,bai=0,qian=0,wan=0; /按照个、十、百、千、万显示变量int dis_data; /*延时函数,延时一毫秒*/void delay(uint z)uint x,y;for(x=112;x0;x-)for(y=z;y0;y-);/*1602显示操作设置*/void write_cmd(char cmd) /写指令函数lcdrs=0;P0=cmd;delay(1);lcden=1;delay(1);lcden=0;void write_data(uchar dat) /写数据函数lcdrs=1;P0=dat ;delay(1);lcden=1;delay(1);lcden=0;void write_str(uchar *str)/写字符串函数while(*str!=0)write_data(*str+);delay(1); void init_1602() /1602液晶显示器的初始化设置uchar table16=0;uchar table116=0; lcdrw=0;lcden=0;write_cmd(0x38);/显示模式设置write_cmd(0x0c);/显示开关,光标关闭write_cmd(0x06);/显示光标移动设置write_cmd(0x01);/清除屏幕write_cmd(0x80);/数据指针移到第一行第一个位置/*DTH11驱动程序设置部分*/bit init_DHT11() /忙检测bit flag;uchar num;DQ=0;delay(19); / 18msDQ=1;for(num=0;num10;num+); / 20-40us 34.7usfor(num=0;num12;num+);flag=DQ;for(num=0;num11;num+);/DTH响应80usfor(num=0;num24;num+); /DTH拉高80usreturn flag;uchar DHT11_RD_CHAR()uchar byte=0;uchar num;uchar num1;while(DQ=1);for(num1=0;num18;num1+)while(DQ=0);byte=1; /高位在前for(num=0;DQ=1;num+);if(num10)byte|=0x00;else byte|=0x01;return byte;void DHT11_DUSHU()/读温湿度数据uchar num;if(init_DHT11()=0)shidu=DHT11_RD_CHAR()-2; /比正常值高2度左右DHT11_RD_CHAR();wendu=DHT11_RD_CHAR();DHT11_RD_CHAR();DHT11_RD_CHAR();for(num=0;num17;num+); /最后BIT输出后拉低总线59usDQ=1;/*毫秒延时*/void delay_nms(unsigned int k) unsigned int i,j; for(i=0;ik;i+) for(j=0;j121;j+);/*延时5微秒(STC89C52RC12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数*/void Delay5us() _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();/*延时5毫秒(STC89C52RC12M),不同的工作环境,需要调整此函数,当改用1T的MCU时,请调整此延时函数*/void Delay5ms() WORD n=560; while (n-);/*BH1750驱动程序设置部分*/void BH1750_Start() SDA = 1; /拉高数据线 SCL = 1; /拉高时钟线 Delay5us(); /延时 SDA = 0; /产生下降沿 Delay5us(); /延时 SCL = 0; /拉低时钟线/*BH1750停止信号*/void BH1750_Stop() SDA = 0; /拉低数据线 SCL = 1; /拉高时钟线 Delay5us(); /延时 SDA = 1; /产生上升沿 Delay5us(); /延时/*发送应答信号,入口参数:ack (0:ACK 1:NAK)*/void BH1750_SendACK(bit ack) SDA = ack; /写应答信号 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时/*接收应答信号*/bit BH1750_RecvACK() SCL = 1; /拉高时钟线 Delay5us(); /延时 CY = SDA; /读应答信号 SCL = 0; /拉低时钟线 Delay5us(); /延时 return CY;/*向IIC总线发送一个字节数据*/void BH1750_SendByte(BYTE dat) BYTE i; for (i=0; i8; i+) /8位计数器 dat = 1; /移出数据的最高位 SDA = CY; /送数据口 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时 BH1750_RecvACK();/*从IIC总线接收一个字节数据*/BYTE BH1750_RecvByte() BYTE i; BYTE dat = 0; SDA = 1; /使能内部上拉,准备读取数据, for (i=0; i8; i+) /8位计数器 dat = 1; SCL = 1; /拉高时钟线 Delay5us(); /延时 dat |= SDA; /读数据 SCL = 0; /拉低时钟线 Delay5us(); /延时 return dat;/*void Single_Write_BH1750(uchar REG_Address) BH1750_Start(); /起始信号 BH1750_SendByte(SlaveAddress); /发送设备地址+写信号 BH1750_SendByte(REG_Address); /内部寄存器地址,请参考中文pdf22页 /BH1750_SendByte(REG_data); /内部寄存器数据,请参考中文pdf22页 BH1750_Stop(); /发送停止信号/*单字节读取,详情见附带手册*uchar Single_Read_BH1750(uchar REG_Address) uchar REG_data; BH1750_Start(); /起始信号 BH1750_SendByte(SlaveAddress); /发送设备地址+写信号 BH1750_SendByte(REG_Address); /发送存储单元地址,从0开始 BH1750_Start(); /起始信号 BH1750_SendByte(SlaveAddress+1); /发送设备地址+读信号 REG_data=BH1750_RecvByte(); /读出寄存器数据BH1750_SendACK(1); BH1750_Stop(); /停止信号 return REG_data; */连续读出BH1750内部数据void Multiple_Read_BH1750(void) uchar i; BH1750_Start(); /起始信号 BH1750_SendByte(SlaveAddress+1); /发送设备地址+读信号 for (i=0; i3; i+) /连续读取6个地址数据,存储中BUF BUFi = BH1750_RecvByte(); /BUF0存储0x32地址中的数据 if (i = 3) BH1750_SendACK(1); /最后一个数据需要回NOACK else BH1750_SendACK(0); /回应ACK BH1750_Stop(); /停止信号 Delay5ms();/初始化BH1750,根据需要请参考pdf进行修改*void Init_BH1750() Single_Write_BH1750(0x01); void conversion(uint temp_data) / 数据转换出 个,十,百,千,万 /wan=temp_data/10000; /如果需要显示万以上数字,不用屏蔽此行程序 temp_data=temp_data%10000; /取余运算qian=temp_data/1000; temp_data=temp_data%1000; /取余运算 bai=temp_data/100; temp_data=temp_data%100; /取余运算 shi=temp_data/10; temp_data=temp_data%10; /取余运算 ge=temp_data; void LightIntensity()/计算光强数据 Single_Write_BH1750(0x01); / power on Single_Write_BH1750(0x10); / H- resolution mode delay_nms(180); /延时180ms Multiple_Read_BH1750(); /连续读出数据,存储在BUF中 dis_data=BUF0; dis_data=(dis_data8)+BUF1;/合成数据 guangqiang=(float)dis_data/1.2; conversion(guangqiang); /计算数据void wenshi_disp() DHT11_DUSHU(); /读出温湿度 write_cmd(0x80); write_str( Light= ); /write_data(wan+48); /如果需要显示万以上数字,不用屏蔽此行程序 write_data(qian+48); / +48的作用是实现十进制和ASCII码之间的转换,目的是使1602液晶正常显示十进制数 write_data(bai+48); write_data(shi+48); write_data(ge+48); write_str( lx); write_cmd(0x80+0x40);/在第二行显示 write_str(TEM=); write_data(wendu/10%10+48); / +48的作用是实现十进制和ASCII码之间的转换,目的是使1602液晶正常显示十进制数 write_data(wendu%10+48); write_data(0xdf); write_data(C); write_cmd(0x89+0x40); write_str(HUM=); write_data(shidu/10%10+48); write_data(shidu%10+48); write_str(%);/*主函数*/main() delay_nms(200); /延时200msinit_1602();Init_BH1750(); /初始化BH1750while(1) wenshi_disp(); 2元件清单(1) DHT11 1片;(2)AT89C52 1片;(3)LCD1602 1片;(4)晶体振荡器 1片(8)电阻、电容、导线等 若干;五、安装与调试1.电路安装 图5.1 焊接正面 图5.2 焊接背面六、性能测试与分析1.功能电路测试与分析(1)测试步骤 性能完好。(2)测试数据数据正确七、结论8051单片机是常用于控制的芯片,在智能仪器仪表、工业检测控制、机电一体化等方面取得了令人瞩目的成果,用其作为温湿度控制系统的实力也很多。使用8051单片机能够实现温湿度全程的自动控制,而且8051单片机易于学习掌握,性价比高。使用8051型单片机设计温湿度控制系统,可以即时精确的反应温室内的温度以及适度的变化。完成诸如升温到特定的温度、降温到特定的温度。在温度上下限范围内保持恒温等多种控制方式,在湿度控制方面也是如此。将此系统应用到温室当中无疑为植被生长提供了更加适宜的环境。对于大棚种植和花圃、花卉栽培,必须在某些特定环境安装温湿度装置对其进行监控。本系统可以及时、精确的反映室内的温度以及湿度的变化,能够满足温湿度的控制要求。八、总结 本系统以单片机为核心部件的控制系统,利用软件编程,最终基本上实现了各项要求。虽然系统还存在一些不足,比如温湿度测量不够精确,特别是湿度,波动较大。尝试了各种改进方法。仍然不太理想。不过大体能反映出设计的目的和要求。与预期的结果相差不多。经过近两周的奋斗,从确定题目,到后来查找资料,理论学习,实验编程调试,这一切都使我的理论知识和动手能力有了很大的提高。了解了单片机的硬件结构和软件编程方法,对单片机的工作方式有了很大的认知。同时,对一些外围设备比如传感器、液晶屏、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论