收藏 分销(赏)

单片机实训.doc

上传人:xrp****65 文档编号:6261735 上传时间:2024-12-03 格式:DOC 页数:33 大小:1.15MB
下载 相关 举报
单片机实训.doc_第1页
第1页 / 共33页
单片机实训.doc_第2页
第2页 / 共33页
单片机实训.doc_第3页
第3页 / 共33页
单片机实训.doc_第4页
第4页 / 共33页
单片机实训.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、单片机模拟温湿度控制系统目录第一章. 设计目的第二章. 设计任务第三章. 设计思路(原理组成框图、资源分配)第四章. 硬件电路原理图和连接图第五章. 程序流程图第六章. 程序清单第一章设计目的温湿敏传感器在工业、农业、气象、医疗以及日常生活等方面都得到了广泛的应用,特别是随着科学技发展,对于湿度的检测和控制越来越受到人们的重视并进行了大量的研制工作。通常,理想的湿敏传感器的特性要求是,适合于在宽温、湿范围内使用,测量精度要高;使用寿命要长,稳定性好;响应速度快,湿滞回差小,重现性好;灵敏度高,线形好,温度系数小;制造工艺简单,易于批量生产,转换电路简单,成本低;抗腐蚀,耐低温和高温特性等。第二

2、章设计任务基本功能:使用DS18B20,CHM-02作为温湿度传感元件,通过AT89S51来实现温湿度采集转换,最后在LCD12864上显示实时温度、湿度,以实现最简温湿度实时监控功能。拓展功能:使用1302芯片实现动态日期时间显示,第三章设计思路1.1温湿度检测仪的功能实现 (1)采集外界温湿度 (2)进行温湿度转换计算 (3)在液晶上动态显示温湿度1.2拓展功能实现(1)动态时钟逻辑编程(2)液晶动态显示时间(3)实现按键操控,可对实时时钟进行加减计算(4)将按键控制结果显示在液晶上1.2.元器件介绍(1)STC51单片机STC89C51系列单片机是宏晶科技推出的新一代超强抗干扰/高速/低

3、功耗的单片机,是MCS-51系列单片机的派生产品;它们在指令系统中、硬件系统和片内资源与标准的8052单片机完全兼容,DIP-40封装系列与8051为pin-to-pin兼容,指令代码是与8051完全兼容的单片机。STC89C51单片机具有增强型12时钟/机器周期、6时钟机器/周期任意选择,工作电压为5.5V-3.4V(5V单片机)/3.8V-2.0V(5V单片机);工作频率范围:0-40MHZ,相当于普通8051的0-80MHZ。实际频率可达48MHZ。用户应用程序空间为4K/8K/13K/16K/20K/32K/64K字节 ;片上集成1280字节/512字节RAM;有32/36个通用I/O

4、口,P1/P2/P3/P4是准双向口;集成ISP(在系统可编程)/IPA(在应用可编程),无需专用的编程器/仿真器,可通过串行口(P3.0/P3.1)直接下载用户程序,8K程序3秒就可以完成一片,具备EEPROM功能,工作温度范围在0-750,共有3个16位定时器/计数器,其中定时器T0还可以当成2个8位定时器使用;封装形式有DIP-40,PLCC-44,PQFP-44等。本文选取的是DIP-40引脚的。(2)1602液晶字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。1602LCD实物图1602LCD主要技术参数:

5、显示容量:162个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.954.35(WH)mm引脚功能说明:第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号

6、,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。(5)CHM-02単湿度传感器(模拟量输出) 1)敏感元件(湿度):高分子湿敏电阻“SS-01”2)供电:5V5%3)耗电电流:5mA max.(2mA avg.)4)工作范围:温度0prefix = st1 ns = urn:schemas-microsoft-com:office:smarttags 60湿度10% - 95%RH5)储存条件:温度0-50湿度60%RH6)湿度变送范围:0100

7、%RH7)湿度准确度:5%RH(在25,输入电压=5V)一致性:3%RH/每批8)输出电压信号:A型0-3V;B型1-3V9)温度系数:0.4%RH/输入电压=5V,3080%RH温度范围1040(基准点25)10)电源电压范围: 4.755.25V (基准点5V,5%)11)温度敏感元件:可选NTC热敏电阻、LM35,TMP3512)温度输出信号:NTC R(25)=100K5%,B值(25/50)=3990K2%NTC具体阻值与B值可按用户指定或推荐LM35,TMP35:0-100输出01V外型尺寸单位:mm尺寸:40229(6)DS18B20 DS18B20数字温度传感器接线方便,封装成

8、后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢 封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。(7)1302DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并

9、可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。第四章.硬件电路原理图和连接图1硬件电路的主要模块 第五章.温湿度计设计框图 加水脱水51单片机液晶管(显示工作状态和时间和转速)CHM-02,18B20,1302按键启动图一 总体设计框图图二 STC89C51单片机元件图开始结束液晶显示,时间,温度,湿度初始化实时时钟采集湿度采集温度采集图八 主程序流程图第六章.程序清单1、主程序#inc

10、lude#include#includemab.hsbit s1=P30;/功能键sbit s2=P31;/增加键sbit s3=P32;/减小键sbit s4=P33;/闹钟查看键 #define AddWr 0x90 /写数据地址 #define AddRd 0x91 /读数据地址 sbit Sda=P12; /定义总线连接端口 sbit Scl=P11;sbit beep=P10;/蜂鸣器#define Data8 P0 /数据端口#define uchar unsigned char bit ADFlag; /定义AD采样标志位bit flag1=0,flag_ri;/定义两个位变量u

11、char count,s1num,flag,t0_num=0,num,ADtemp;/其它变量定义char miao,shi,fen,year,month,day,week=1,amiao=0,afen=0,ashi=0,nmiao,nshi,nfen;unsigned char TempData8;unsigned char TemppH,TemppL;uchar disp_buf8 =0x00; /定义显示缓冲区uchar time_buf7 =0,0,0x12,0,0,0,0;/DS1302时间缓冲区,存放秒、分、时、日、月、星期、年sbit SCK=P36;sbit SDA=P34;s

12、bit RST=P35;uint tempp;uchar flag_gett,count,num8,minute,second;uchar str6;/*复位脚*/#define RST_CLRRST=0/*电平置低*/#define RST_SETRST=1/*电平置高*/*双向数据*/#define IO_CLRSDA=0/*电平置低*/#define IO_SETSDA=1/*电平置高*/#define IO_RSDA/*电平读取*/*时钟信号*/#define SCK_CLRSCK=0/*时钟信号*/#define SCK_SETSCK=1/*电平置高*/#define ds1302_

13、sec_add0x80/秒数据地址#define ds1302_min_add0x82/分数据地址#define ds1302_hr_add0x84/时数据地址#define ds1302_date_add0x86/日数据地址#define ds1302_month_add0x88/月数据地址#define ds1302_day_add0x8a/星期数据地址#define ds1302_year_add0x8c/年数据地址#define ds1302_control_add0x8e/控制数据地址#define ds1302_charger_add0x90 #define ds1302_clkb

14、urst_add0xbe/*/* 函数声明 */*/void Init_Timer1(void) TMOD |= 0x10; TH1=0xff; /* Init value */ TL1=0x00; /PT1=1; /* 优先级 */ EA=1; /* interupt enable */ ET1=1; /* enable timer1 interrupt */ TR1=1; void Start(void) Sda=1; _nop_(); Scl=1; _nop_(); Sda=0; _nop_(); Scl=0; void Stop(void) Sda=0; _nop_(); Scl=1;

15、 _nop_(); Sda=1; _nop_(); Scl=0; void Ack(void) Sda=0;_nop_();Scl=1;_nop_();Scl=0;_nop_();void NoAck(void) Sda=1; _nop_(); Scl=1; _nop_(); Scl=0; _nop_(); void Send(unsigned char Data) unsigned char BitCounter=8; unsigned char temp; do temp=Data; Scl=0; _nop_(); if(temp&0x80)=0x80) Sda=1; else Sda=0

16、;Scl=1;temp=Data1;Data=temp;BitCounter-; while(BitCounter); Scl=0; unsigned char Read(void) unsigned char temp=0; unsigned char temp1=0; unsigned char BitCounter=8; Sda=1; do Scl=0; _nop_(); Scl=1; _nop_(); if(Sda) temp=temp|0x01; else temp=temp&0xfe; if(BitCounter-1) temp1=temp1; temp=temp1; BitCou

17、nter-; while(BitCounter);return(temp); void DAC(unsigned char Data) Start(); Send(AddWr); /写入芯片地址 Ack(); Send(0x40); /写入控制位,使能DAC输出 Ack(); Send(Data); /写数据 Ack(); Stop(); unsigned char ReadADC(unsigned char Chl) unsigned char Data; Start(); /写入芯片地址 Send(AddWr); Ack(); Send(0x40|Chl);/写入选择的通道,本程序只用单端

18、输入,差分部分需要自行添加 /Chl的值分别为0、1、2、3,分别代表1-4通道 Ack(); Start(); Send(AddRd); /读入地址 Ack(); Data=Read(); /读数据 Scl=0; NoAck(); Stop(); return Data; /返回值 /*/*/*/void write_sfm(uchar add,char date)/1602液晶刷新时分秒函数4为时,7为分,10为秒char shi,ge;shi=date/10;ge=date%10;WriteCommand(0x80+0x40+add);WriteData(0x30+shi);WriteD

19、ata(0x30+ge);void write_nyr(uchar add,char date)/1602液晶刷新年月日函数3为年,6为分,9为秒char shi,ge;shi=date/10;ge=date%10;WriteCommand(0x80+add);WriteData(0x30+shi);WriteData(0x30+ge);void write_week(char we)/写液晶星期显示函数WriteCommand(0x80+13);switch(we)case 1:WriteData(M);DelayMs(5);WriteData(O);DelayMs(5);WriteData

20、(N);break;case 2:WriteData(T);DelayMs(5);WriteData(U);DelayMs(5);WriteData(E);break;case 3:WriteData(W);DelayMs(5);WriteData(E);DelayMs(5);WriteData(D);break;case 4:WriteData(T);DelayMs(5);WriteData(H);DelayMs(5);WriteData(U);break;case 5:WriteData(F);DelayMs(5);WriteData(R);DelayMs(5);WriteData(I);

21、break;case 6:WriteData(S);DelayMs(5);WriteData(A);DelayMs(5);WriteData(T);break;case 7:WriteData(S);DelayMs(5);WriteData(U);DelayMs(5);WriteData(N);break;void di() /蜂鸣器报警声音beep=0;DelayMs(50);beep=1;void write_ds(unsigned char addr, unsigned char da)unsigned char i,tmp,d;tmp=da/10;d=da%10;d=d+tmp*16;

22、RST_SET;/*启动DS1302总线*/*写入目标地址:addr*/addr = addr & 0xFE;/*最低位置零*/for (i = 0; i 1;/*写入数据:d*/ for (i = 0; i 1;RST_CLR;/*停止DS1302总线*/uchar read_ds(unsigned char addr)unsigned char i;unsigned char tmp;uchar ds_date,ds_dat;RST_SET;/*启动DS1302总线*/*写入目标地址:addr*/addr = addr | 0x01;/*最低位置高*/for (i = 0; i 1;/*输

23、出数据:temp*/for (i = 0; i 1;if (IO_R) ds_date |= 0x80;else ds_date &= 0x7F;SCK_SET;SCK_CLR;RST_CLR;/*停止DS1302总线*/tmp=ds_date/16;ds_dat=ds_date%16;ds_dat=ds_dat+tmp*10;return ds_dat;void init1302()RST_CLR;/*RST脚置低*/SCK_CLR;/*SCK脚置低*/void alarmint()write_ds(ds1302_control_add,0x00);/关闭写保护 write_ds(ds130

24、2_sec_add,0x80);/暂停 write_ds(ds1302_charger_add,0xa9);/涓流充电 write_ds(0xc0,0);write_ds(0xc2,0);write_ds(0xc4,0);write_ds(ds1302_control_add,0x80);/打开写保护 void read_alarm()/读取12C887闹钟值amiao=read_ds(0xc0);afen=read_ds(0xc2);ashi=read_ds(0xc4);void keyscan()if(flag_ri=1)/这里用来取消闹钟报警,任一键取消报警if(s1=0)|(s2=0)

25、|(s3=0)|(s4=0)DelayMs(5);if(s1=0)|(s2=0)|(s3=0)|(s4=0)while(!(s1&s2&s3&s4); di();flag_ri=0;/清除报警标志 if(s1=0)/检测S1DelayMs(5);if(s1=0)s1num+;/记录按下次数if(flag1=1)if(s1num=4)s1num=1;flag=1;while(!s1);di();switch(s1num)/光标闪烁点定位case 1: WriteCommand(0x80+0x40+10); WriteCommand(0x0f);break;case 2: WriteCommand

26、(0x80+0x40+7);break;case 3: WriteCommand(0x80+0x40+4);break;case 4: WriteCommand(0x80+13);break;case 5: WriteCommand(0x80+9);break;case 6: WriteCommand(0x80+6);break;case 7: WriteCommand(0x80+3);break;case 8: s1num=0;WriteCommand(0x0c);flag=0;write_ds(ds1302_control_add,0x00);/关闭写保护 write_ds(ds1302_

27、sec_add,0x80);/暂停 write_ds(ds1302_charger_add,0xa9);/涓流充电 write_ds(0x80,miao);write_ds(0x82,fen);write_ds(0x84,shi);write_ds(0x8a,week);write_ds(0x86,day);write_ds(0x88,month);write_ds(0x8c,year);write_ds(ds1302_control_add,0x80);/打开写保护 break;if(s1num!=0)/只有当S1按下后,才检测S2和S3if(s2=0)DelayMs(1);if(s2=0)

28、while(!s2);di();switch(s1num)/根据功能键次数调节相应数值case 1:miao+;if(miao=60)miao=0;write_sfm(10,miao);WriteCommand(0x80+0x40+10); break;case 2:fen+;if(fen=60)fen=0;write_sfm(7,fen);WriteCommand(0x80+0x40+7); break;case 3:shi+;if(shi=24)shi=0;write_sfm(4,shi);WriteCommand(0x80+0x40+4); break;case 4:week+;if(w

29、eek=8)week=1;write_week(week);WriteCommand(0x80+13);break;case 5:day+;if(day=32)day=1;write_nyr(9,day);WriteCommand(0x80+9);break;case 6:month+;if(month=13)month=1;write_nyr(6,month);WriteCommand(0x80+6);break;case 7:year+;if(year=100)year=0;write_nyr(3,year);WriteCommand(0x80+3);break;if(s3=0)Delay

30、Ms(1);if(s3=0)while(!s3);di();switch(s1num)/根据功能键次数调节相应数值case 1:miao-;if(miao=-1)miao=59;write_sfm(10,miao);WriteCommand(0x80+0x40+10);break; case 2:fen-;if(fen=-1)fen=59;write_sfm(7,fen);WriteCommand(0x80+0x40+7);break;case 3:shi-;if(shi=-1)shi=23;write_sfm(4,shi);WriteCommand(0x80+0x40+4);break;ca

31、se 4:week-;if(week=0)week=7;write_week(week);WriteCommand(0x80+13);break;case 5:day-;if(day=0)day=31;write_nyr(9,day);WriteCommand(0x80+9);break;case 6:month-;if(month=0)month=12;write_nyr(6,month);WriteCommand(0x80+6);break;case 7:year-;if(year=-1)year=99;write_nyr(3,year);WriteCommand(0x80+3);brea

32、k;if(s4=0)/检测S4DelayMs(5);if(s4=0)flag1=flag1;while(!s4);di();/alarmint();if(flag1=0)/退出闹钟设置时保存数值flag=0;WriteCommand(0x80+0x40);WriteData( );WriteData( );WriteCommand(0x0c);write_ds(ds1302_control_add,0x00);/关闭写保护 write_ds(ds1302_charger_add,0xa9);/涓流充电 write_ds(0xc0,miao);write_ds(0xc2,fen);write_d

33、s(0xc4,shi);write_ds(ds1302_control_add,0x80);/打开写保护 s1num=0;else/进入闹钟设置read_alarm();/读取原始数据miao=amiao;/重新赋值用以按键调节fen=afen;shi=ashi;WriteCommand(0x80+0x40);WriteData(R);/显示标志WriteData(i);WriteCommand(0x80+0x40+3);write_sfm(4,ashi);/送液晶显示闹钟时间write_sfm(7,afen);write_sfm(10,amiao);void alarm()nshi=read

34、_ds(0x84);nfen=read_ds(0x82);nmiao=read_ds(0x80);read_alarm();if(amiao=nmiao & ashi=nshi & afen=nfen)flag_ri=1;void main()/主函数init2();init1302(); InitLcd(); Init_Timer1();while(1) wendu();keyscan();/按键扫描alarm();if(s2=0& s1num=0) while(ADFlag) /定时采集输入模拟量 if(s3=0) ADFlag=0; return; ADtemp=ReadADC(0); TempData0=(ReadADC(0)-54)/100;/处理0通道湿度显示 TempData1=(ReadADC(0)-54)%100)/10; TempData2=(ReadADC(0

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 环境建筑 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服