




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、微机与单片机原理及应用课程设计报告题 目:农业大棚智能监控系统 学 号: 110603156 姓 名: 吴佰洲 年 级: 11级自动化 指导教师: 丛玉华 开课学期教室上交时间成绩大三上实B-302目 录一、硬件部分 1、AT89C51芯片 2、74LS373芯片 3、8155芯片 4、ADC0808芯片 5、DS18B20芯片 6、I2C总线7、 系统电路图二、软件部分1、流程图2、程序一、硬件部分 1、AT89C51芯片基本功能:AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memo
2、ry)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。与MCS-51 兼容,含有4K字节可编程闪烁存储器,128*8位内部RAM,32可编程I/O线,两个16位定时器/计数器,5个中断源,可编程串行通道,低功耗的闲置和掉电模式,片内振荡器和时钟电路 。引脚图:引脚功能:1、 VCC:供电电压 GND:接地。2.P0 、P1、P2、P3口。3.RS
3、T:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。4.ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。5、/PSEN:外部程序
4、存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。6、/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。7、XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。2、74LS373芯片基本功能:74ls373是常用的地址锁存器芯片,它实质是一个是带三
5、态缓冲输出的8D触发器,在单片机系统中为了扩展外部存储器,通常需要一块74ls373芯片。引脚图:引脚功能:D0D7 数据输入端OE 三态允许控制端(低电平有效)LE 锁存允许端O0O7 输出端真值表: 对74LS373,当三态门使能信号OE为低电平时,三态门导通,允许Q0Q7输出,OE为高电平时,输出悬空。当74LS373用作锁存器时,应使OE为低电平导通输出,此时锁存使能端C为高电平时,输出Q0Q7 状态与输入端D1D7状态相同;当C发生负跳变时,输入端D0D7 数据锁入Q0Q7。3、8155芯片基本功能:8155是一个具有RAM、I/O和计数器的通用可编程接
6、口多功能芯片。其具有的资源为:256B的静态RAM;两个可编程的8位并行I/O口PA和PB;一个可编程的6位并行I/O口PC;一个可编程14位减计数器TC;8位地址锁存器。引脚图:引脚功能:VCC:+5V电源。RST:复位信号输入端,高电平有效。复位后,3个I/O口均为输入方式。AD0AD7:三态的地址/数据总线。与单片机的低8位地址/数据总线(P0口)相连。单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。RD:读选通信号,控制对8155的读操作,低电平有效。WR:写选通信号,控制对8155的写操作,低电平有效。CE:片选信号线,低电平有效。IO/M :8155的RA
7、M存储器或I/O口选择线。当IO/M =0时,则选择8155的片内RAM,AD0AD7上地址为8155中RAM单元的地址(00HFFH);当IO/M =1时,选择 8155的I/O口,AD0AD7上的地址为8155 I/O口的地址。ALE:地址锁存信号。8155内部设有地址锁存器,在ALE的下降沿将单片机P0口输出的低8位地址信息及 ,IO/ 的状态都锁存到8155内部锁存器。因此,P0口输出的低8位地址信号不需外接锁存器。PA0PA7:8位通用I/O口,其输入、输出的流向可由程序控制。PB0PB7:8位通用I/O口,功能同A口。PC0PC5:有两个作用,既可作为通用的I/O口,也可作为PA口
8、和PB口的控制信号线,这些可通过程序控制。TIMER IN:定时/计数器脉冲输入端。TIMER OUT:定时/计数器输出端。4、ADC0808芯片基本功能:ADC 是CMOS器件,不仅包括一个8位的逐次逼近型的ADC部分,而且还提供一个8通道的模拟多路开关和通道寻址逻辑,因而有理由把它作为简单的“数据采集系统”。利用它可直接输入8个单端的模拟信号分时进行A/D转换,在多点巡回检测和过程控制、运动控制中应用十分广泛。引脚图:引脚功能:IN0IN78路模拟输入D7D0A/D转换后的数据输出端,为三态可控输出,故可直接和微处理器数据线连接。8位排列顺序是D7为最高位,D0为最低位。
9、0;ADDA、ADDB、ADDC模拟通道选择地址信号,ADDA为低位,ADDC为高位。 VR(+)、VR(-)正、负参考电压输入端ALE地址锁存允许信号,高电平有效。当此信号有效时,A、B、C三位地址信号被锁存,译码选通对应模拟通道。在使用时,该信号常和START信号连在一起,以便同时锁存通道地址和启动A/D转换。 STARTA/D转换启动信号,正脉冲有效。加于该端的脉冲的上升沿使逐次逼近寄存器清零,下降沿开始A/D转换。如正在进行转换时又接到新的启动脉冲,则原来的转换进程被中止,重新从头开始转换。 EOC转换结束信号,高电平有效。OE输出允许信号,高电平有效。工
10、作时序:当通道选择地址有效时,ALE信号一出现,地址便马上被锁存,这时转换启动信号紧随ALE之后(或与ALE同时)出现。START的上升沿将逐次逼近寄存器SAR复位,在该上升沿之后的2s加8个时钟周期内(不定),EOC信号将变低电平,以指示转换操作正在进行中,直到转换完成后EOC再变高电平。微处理器收到变为高电平的EOC信号后,便立即送出OE信号,打开三态门,读取转换结果。5、DS18B20芯片基本功能:单线接口:仅需一根口线与MCU 连接 ,无需外围元件,由总线提供电源 ,测温范围为-5575,精度为0.5 ,九位温度读数 。 引脚图:引脚功能: GND:接地Ø VDD:电源电压。
11、 DQ:数据输入输出脚(单线接口,可作寄生供电)。ØDS18B20时序及信号方式 所有的单总线器件要求采用严格的通信协议,以保证数据的完整性。该协议定义 了几种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。所有这些信号,除了应答脉冲以外,都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前,这一点与多数串行通信格式不同(多数为字节的高位在前)。 6、I2C总线基本功能: I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由
12、总线上接收数据的器件则为接收器。 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。 数据传送格式:(1)字节传送与应答每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)(2)数据帧格式在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/),用“0”表示主机发送数据(T
13、),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。a、主机向从机发送数据,数据传送方向在整个传送过程中不变:注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。A表示应答, 表示非应答(高电平)。S表示起始信号,P表示终止信号。b、主机在第一个字节后,立即由从机读数据c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。 7、系统电路图二、软件部分流程图开始KEY1是否按下否是自动模式手
14、动模式手动控制声光报警,通风口以及灌溉系统的开关 KEY2键是否按下否是阈值界面采集界面 显示声光报警否是阈值保存更改阈值 判断温湿度是否超过阈值 程序:#include <reg51.h>#include <absacc.h>#include"i2c.h"unsigned int max1=40; /第一路阈值*100unsigned int max2=20; /第二路阈值*100void At24c02Write(unsigned char ,unsigned char );/#define 2817 XBYTE0x7FFH/8155 各部件地址
15、#define STATE8155 XBYTE0x7FF8#define IOA XBYTE0x7FF9#define IOB XBYTE0x7FFA#define IOC XBYTE0x7FFB#define TIMERH XBYTE0x7FFD#define TIMERL XBYTE0x7FFC/adc0809 各通道地址#define IN0 XBYTE0xFEF8 /11111110 11111000#define IN1 XBYTE0xFEF9 /11111110 11111001#define IN2 XBYTE0xFEFA /11111110 11111010volatile u
16、nsigned char addr=0; /采集通道编号unsigned char dig_data2=0; /保存采集数据unsigned int temp1=0; /将显示第一路,8位二进制数据unsigned int temp2=0; /将显示第二路,8位二进制数据unsigned int value1=0; /8位二进制,转电压值时中间变量,第一路unsigned int value2=0; /8位二进制,转电压值时中间变量,第二路unsigned int temp1_u=0; /计算后电压值*100,第一路unsigned int temp2_u=0; /计算后电压值*100,第二路
17、bit flag=1; /定时器T0,选路标志 bit display_mode=0; /显示模式 阈值和实时采集数据 sbit key1_switch=P10;sbit key2=P11;sbit key3=P12;sbit key4=P15;sbit arm_led=P13;sbit arm_beep=P14;sbit led1=P16;sbit led2=P17;bit flag_arm=1; unsigned char code DIG_CODE17=0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x
18、83, 0xC6, 0xA1, 0x86, 0x8E,0xBF;/共阳代码 /code类型数组void Delay1ms(unsigned int c) ;Delay();Initial();Key_down();Display_mode0();Display_mode1();Arm();Display();main() unsigned char a=0; Initial(); while(1) Key_down();/判断按键情况Display(); /显示数据 Initial() /8155初始化STATE8155=0x03;IOB=0x00;/初始中断EA=1;EX0=1;IT0=1;
19、ET0=1;/初始化定时器T0TMOD=0x01;TH0=(65536-50000)/256; TL0=(65536-50000)%256;TR0=1;Key_down() /判断按键情况 unsigned char a=0; if(key1_switch=0) /显示模式切换 Delay1ms(1); if(key1_switch=0) display_mode=display_mode; while(a<50) && (key1_switch=0) /检测按键松手检测 Delay1ms(1); a+; void Delay1ms(unsigned int c) /误差
20、 0us unsigned char a, b;/-c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了-/ for (;c>0;c-)for (b=38;b>0;b-)for (a=130;a>0;a-); delay() unsigned int a=500; while(a-);Display_mode0() /显示实时采集电压模式 /显示第一路采集的电压值 temp1=dig_data0; value1=temp1*50/256; / 公式: IOB=0x01; /第一位数码管 IOA= 0xFF; /消隐 IOA=DIG_CODE0; Delay()
21、; IOB=0x02; /第二位数码管 IOA= 0xFF; IOA=DIG_CODEvalue1/10; Delay(); IOB=0x04; / 第三位数码管 IOA= 0xFF; IOA=DIG_CODEvalue1%10; Delay(); /无数据显示位 IOB=0x08; /第二位数码管 IOA= 0xFF; IOA=DIG_CODE16; Delay(); IOB=0x10; / 第三位数码管 IOA= 0xFF; IOA=DIG_CODE16; Delay(); /显示第二路采集的电压值 temp2=dig_data1; value2=temp2*99/256; / 公式:va
22、lue/5V=temp2/256 IOB=0x20; / 第六位数码管 IOA= 0xFF; IOA=DIG_CODE0; Delay(); IOB=0x40; / 第七位数码管 IOA= 0xFF; IOA=DIG_CODEvalue2/10; Delay(); IOB=0x80; / 第八位数码管 IOA= 0xFF; IOA=DIG_CODEvalue2%10; Delay(); if( value1>max1) arm_led=1; arm_beep=1; led1=1; else if(value2>max2) arm_led=1; arm_beep=1; led2=1;
23、 else arm_led=0;led1=0; arm_beep=0; led2=0; if(key3=0) led1=led1; while(key3=0) if(key4=0) led2=led2; while(key4=0) Display_mode1() /显示阈值模式 unsigned char a=0; unsigned char t; /显示第一路阈值 IOB=0x01; IOA=DIG_CODE0; Delay(); IOB=0x02; IOA=DIG_CODEmax1/10; Delay(); IOB=0x04; IOA=DIG_CODEmax1%10; Delay(); /
24、无数据显示位 IOB=0x08; /第二位数码管 IOA= 0xFF; IOA=DIG_CODE16; Delay(); IOB=0x10; / 第三位数码管 IOA= 0xFF; IOA=DIG_CODE16; Delay(); /显示第二路阈值 IOB=0x20; IOA=DIG_CODE0; Delay(); IOB=0x40; IOA=DIG_CODEmax2/10; Delay(); IOB=0x80; IOA=DIG_CODEmax2%10; Delay(); Delay1ms(10); if(key2=0) display_mode=display_mode; if(key2=0
25、&&display_mode=0) At24c02Write(1,max2); while(a<50) && (key2=0) /检测按键松手检测 Delay1ms(10); a+; if(key3=0) Delay1ms(10); if(key3=0) max2+; if(max2>500) max2=500; while(a<50) && (key3=0) /检测按键松手检测 Delay1ms(10); a+; if(key4=0) Delay1ms(10); if(key4=0) max2-; if(max2=0) max
26、2=1; while(a<50) && (key4=0) /检测按键松手检测 Delay1ms(10); a+; Arm() arm_led=0; arm_beep=0; if(flag_arm=1) if( value1>max1) arm_led=1; arm_beep=1; led1=1; else if(value2>max2) arm_led=1; arm_beep=1; led2=1; else arm_led=0; arm_beep=0; Display()if(!display_mode) /显示实时采集电压模式Display_mode0();
27、else /显示阈值模式Display_mode1(); void T0_srv(void)interrupt 1 using 1 /定时器T0,每隔50ms来一次中断 TH0=(65536-50000)/256; / 初值重装TL0=(65536-50000)%256; / 初值重装 flag=flag; / 置标志位 if(flag=0)IN0=0; addr=0; /开启第一路转换else IN1=0; addr=1; /开启第二路转换void Int0_srv(void)interrupt 0 using 2switch(addr) case 0: dig_data0=IN0; /读取
28、第一路转换结果 break; case 1: dig_data1=IN1; /读取第二路转换结果 break; default: break;void At24c02Write(unsigned char addr,unsigned char dat)I2C_Start();I2C_SendByte(0xa0, 1);/发送写器件地址I2C_SendByte(addr, 1);/发送要写入内存地址I2C_SendByte(dat, 0);/发送数据I2C_Stop();unsigned char At24c02Read(unsigned char addr)unsigned char num;
29、I2C_Start();I2C_SendByte(0xa0, 1); /发送写器件地址I2C_SendByte(addr, 1); /发送要读取的地址I2C_Start();I2C_SendByte(0xa1, 1); /发送读器件地址num=I2C_ReadByte(); /读取数据I2C_Stop();return num;bit ISendByte(unsigned char sla,unsigned char c) Start_I2c(); /启动总线 SendByte(sla); /发送器件地址 if(ack=0)return(0); SendByte(c); /发送数据 if(ack=0)return(0); Stop_I2c(); /结束总线 return(1);unsigned char IRcv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网红家居装饰灵感创新创业项目商业计划书
- 园艺衍生品制作创新创业项目商业计划书
- 乳制品品质提升创新创业项目商业计划书
- oa系统公文管理办法
- 预制箱梁制作、运输与施工劳务分包合同范本
- 饲料公司职业健康安全告知及事故应急预案合同
- 郑州学校命名管理办法
- 老宅基地使用权买卖合同书:乡村振兴示范村建设
- 个人线上学习管理办法
- 马铃薯全产业链投资合作与市场开发协议
- 培养团队协调能力
- 拓培非格司亭注射液-临床药品应用解读
- 装饰色彩课件
- 中央企业合规管理办法
- (医学课件)急诊科进修汇报
- 1-丁烯安全技术说明书MSDS
- 临床药理学(完整课件)
- 现场签证单模板
- 风机盘管更换施工方案
- 绿化工(四级)理论知识考试复习题库(含答案)
- 宣讲《无障碍环境建设法》PPT
评论
0/150
提交评论