广工微机原理课程报告.docx
- 文档编号:8437544
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:20
- 大小:406.79KB
广工微机原理课程报告.docx
《广工微机原理课程报告.docx》由会员分享,可在线阅读,更多相关《广工微机原理课程报告.docx(20页珍藏版)》请在冰豆网上搜索。
广工微机原理课程报告
(基于PBL的课程报告)
微机原理及应用C
一、项目的背景及意义:
防潮、防霉是仓库日常管理工作的重要内容,直接影响到储备物资的使用寿命和工作可靠性。
为保证日常工作的顺利进行,首要问题是加强仓库内温度与湿度的监测工作。
但传统的方法是用湿度表、毛发湿度表、双金属式测量计和湿度试纸等测试器材,通过人工进行检测,对不符合温度和湿度要求的库房进行通风、去湿和降温等工作。
这种人工测试方法费时费力、效率低,且测试的温度及湿度误差大,随机性大。
基于以上存在的问题,我们决定设计一种集温湿度测量、显示、报警于一体的高精度的测量仪器,用于仓储管理,减轻仓储的人力物力支出。
该测量仪器,成本低,方便好用,能够很好地进入市场。
本次课程设计主要基于AT89C51单片机,开发环境温度及湿度检测及控制系统。
该系统采用AT89C51单片机作为控制器,DS18B20作为温度传感器,HS1101作为湿度传感器。
系统主要功能如下:
1)对温度、湿度进行测量;
2)温度及湿度的显示;
3)设定预期温度与湿度值并显示。
4)高低温报警
关键词:
AT89C51,温度及湿度检测,LCD显示,温度报警。
二、系统设计总体方案:
本系统采用AT89C51单片机作为微处理器,DS18B20作为温度传感器对温度进行检测,HS1101作为湿度传感器与NE555组成湿度测量模块,使用LCD1602对测得的温度及湿度值进行显示,使用按键对温度及湿度的设定值进行修改。
1 温度检测范围:
-20℃-+70℃
2 测量精度:
0.5℃
3 湿度检测范围:
10%-100%RH
4 检测精度:
1%RH
5 显示方式:
1602液晶
6 报警方式:
蜂鸣器报警、LED灯警示
系统主要有温度测量模块、湿度测量模块、显示模块、按键模块、蜂鸣器报警模块、高低温报警指示灯模块,其原理框图如下图所示:
整体程序流程图:
整体电路图:
本系统采用AT89C51单片机作为微处理器,DS18B20作为温度传感器对温度进行检测,HS1101作为湿度传感器与NE555组成湿度测量模块,使用LCD1602对测得的温度及湿度值进行显示,使用按键对温度及湿度的设定值进行修改。
部分电路图:
实现功能:
DS18B20实时检测环境温度,将信息显示于1602上,当环境的温度高于70℃时,蜂鸣器报警,高温报警灯闪烁;当温度低于-20℃时,蜂鸣器报警,低温报警灯闪烁。
通过按键K4,显示设置的高低极限温度值,按下K1,进入低温调节界面,每按一次,温度降低1℃,按下K2,每按一次,温度升高1℃。
按下K3,进入高温调节界面,升降温步骤同上。
课程难点:
1、如何正确地选用湿度传感器并用其实时检测湿度:
湿度传感器HS1101:
全互换性、在标准环境下不需校正、长时间饱和下快速脱湿、可以自动化焊接,包括波峰焊或水浸、高可靠性与长时间稳定性、固态聚合物结构、可用于线性电压或频率输出、反应时间快速。
基于以上优点,选用HS1101湿度传感器测量湿度。
HS1101电容传感器,在电路构成中等效于一个电容器件,其电容量随着所测空气湿度的增大而增大。
涉及如何将电容的变化量准确地转变为计算机易于接受的信号时,常用两种方法:
一是将HS1101置于运放与阻容组成的桥式振荡电路中,所产生的正弦波电压信号经整流、直流放大、再A/D转换为数字信号;另一种是将HS1101置于555振荡电路中,将电容值的变化转为与之呈反比的电压频率信号,可直接被计算机所采集。
在此设计中,我们采用第二种方法,实现数据的采集。
此电路为典型的555非稳态电路。
HS1101/HS1100作为电容变量接在555的TRIG与THRES两引脚上,引脚7用作电阻R7的短路。
等量电容HS1101/HS1100通过R6与R7充电到门限电压(约0.67Vcc),通过R6放电到触发电平(约0.33Vcc),然后R7通过引脚7短路到地。
传感器由不同的电阻R7与R6充放电,555电路的非平衡电阻R5是做内部温度补偿,目的是为了引入温度效应,使它与HS1101/HS1100的温度效应相匹配。
R5必须象所有的R-C时钟电阻的要求一样,1%的精度,最大的温度效应应该小于100ppm。
2、如何正确地选用温度传感器并用其实时检测湿度:
温度传感器的种类众多,在应用于高精度、高可靠性的场合时DALLAS(达拉斯)公司生产的DS18B20温度传感器当仁不让。
超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B20更受欢迎。
在此设计中,我们采用DS18B20作为温度传感器。
全数字温度转换及输出、先进的单总线数据通信、最高12位分辨率,精度可达土0.5摄氏度、12位分辨率时的最大工作周期为750毫秒、可选择寄生工作方式、检测温度范围为–55°C~+125°C(–67°F~+257°F)、内置EEPROM,限温报警功能、64位光刻ROM,内置产品序列号,方便多机挂接、多样封装形式,适应不同硬件系统。
DS18B20只需要接到控制器(单片机)的一个I/O口上,如要采用寄生工作方式,只要将VDD电源引脚与单总线并联即可。
每一次通信之前必须进行复位,复位的时间、等待时间、回应时间应严格按时序编程。
DS18B20读写时间隙:
DS18B20的数据读写是通过时间隙处理位和命令字来确认信息交换的。
写时间隙:
写时间隙分为写“0”和写“1”,时序如图7。
在写数据时间隙的前15uS总线需要是被控制器拉置低电平,而后则将是芯片对总线数据的采样时间,采样时间在15~60uS,采样时间内如果控制器将总线拉高则表示写“1”,如果控制器将总线拉低则表示写“0”。
每一位的发送都应该有一个至少15uS的低电平起始位,随后的数据“0”或“1”应该在45uS内完成。
整个位的发送时间应该保持在60~120uS,否则不能保证通信的正常。
读时间隙:
读时间隙时控制时的采样时间应该更加的精确才行,读时间隙时也是必须先由主机产生至少1uS的低电平,表示读时间的起始。
随后在总线被释放后的15uS中DS18B20会发送内部数据位,这时控制如果发现总线为高电平表示读出“1”,如果总线为低电平则表示读出数据“0”。
每一位的读取之前都由控制器加一个起始信号。
注意:
如图8所示,必须在读间隙开始的15uS内读取数据位才可以保证通信的正确。
在通信时是以8位“0”或“1”为一个字节,字节的读或写是从高位开始的,即A7到A0.字节的读写顺序也是如图2自上而下的。
对于数字传感器DS18B20,为了实现其功能,需要严格按照其技术手册中提供的时序图编程,否则,有可能由于响应时间太短而无法正常工作。
三、总结:
小组此次此次选择的是比较普通的温湿度测量,主要应用于仓库的温湿度检测和控制,在设计的系统方案中,设置了按键可以调节报警的温湿度阈值,便于该设计应用于不同的仓库,顾客可以根据自己仓储的物品,调节合适的温湿度,起到预防报警的作用。
在报警形式的设置上,我们同时应用了蜂鸣器和LED灯报警,使检测到的温湿度情况能够快速的显现出来。
这虽然只是一个比较简单的设计,但在实际的设计仿真过程中还是出现了很多问题,例如程序编译成功,但烧录到芯片中,显示不了预期的效果,这是我们只能先检查硬件电路的设计是否合理,再进一步烧录程序,一步一步地慢慢调试,一步一步地找问题,解决问题,这过程却是收获很大,感觉知识知识理论上了,如果能够真正地应用的话,那才是真正地掌握了。
总而言之,此次课程作业,收获良多。
程序清单:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^3;//DS18B20与单片机连接口
sbitRS=P2^0;//LCD1602控制端与单片机的连接
sbitRW=P2^1;
sbitEN=P2^2;
sbitK1=P1^0;//按键接口
sbitK2=P1^1;
sbitK3=P1^3;
sbitK4=P1^4;
sbitK5=P1^7;
sbitbeef=P3^7;
ucharcodestr1[]={"CurrentTemp:
"};
ucharcodestr2[]={"TEMP:
"};
uchardatadisdata1[6];
uchardatadisdata2[4];
uinttvalue;//温度值
uchartflag;//温度正负标志
uinttem0,tem1;
uinttemp0,temp1;
uintf=0;
inthhhh=0;
inttsheding=-20;//设置温度值
//inthsheding=70;//设置湿度值
voidzhongd0()interrupt0//外部中断0:
加设置
{
if(K1==1)
{
tsheding++;//温度值加1
}
/*if(K2==1)
{
hsheding++;//湿度值加1
}*/
}
voidzhongd1()interrupt2//外部中断1:
减设置
{
if(K1==1)
{
tsheding--;//温度值减1
}
/*if(K2==1)
{
hsheding--;//湿度值减1
}*/
}
voidtimer0()interrupt1//T0定时中断
{
TR0=0;
TR1=0;
TL0=0xB0;//重装值,定时50000us
TH0=0x3C;
tem0=TL1;//读数
tem1=TH1;
TL1=0x00;//计数器1清零
TH1=0x00;
TR0=1;
TR1=1;
}
voidtimer1()interrupt3//T1计数中断
{
TR0=0;
TR1=0;
TL0=0xB0;//重装值,定时50000us
TH0=0x3C;
TL1=0x00;//计数器1清零
TH1=0x00;
TR0=1;
TR1=1;
}
voidinit_timer()
{
TMOD=0x51;
TL0=0xB0;//定时器0初值定时50000us
TH0=0x3C;
TL1=0x00;//定时器1清零
TH1=0x00;
TR0=1;//T0开始计时
TR1=1;//T1开始计数
}
voiddelay1ms(uintms)//延时1毫秒
{
uinti,j;
for(i=0;i for(j=0;j<110;j++); } voidwr_com(ucharcom)//1602写指令 { delay1ms (1); RS=0; RW=0; EN=0; P1=com; delay1ms (1); EN=1; delay1ms (1); EN=0; } voidwr_dat(uchardat)//1602写数据 { delay1ms (1); RS=1; RW=0; EN=0; P1=dat; delay1ms (1); EN=1; delay1ms (1); EN=0; } voidlcd_init()//1602初始化设置 { wr_com(0x38);delay1ms (1);//设置16*2显示,5*7点阵,8位数据接口;并延时 wr_com(0x08);delay1ms (1);//设置关显示,光标不显示,光标不闪烁;并延时 wr_com(0x01);delay1ms (1);//设置显示清屏;并延时 wr_com(0x06);delay1ms (1);//设置显示光标移动位置;并延时 wr_com(0x0c);delay1ms (1);//设置显示开及光标设置;并延时 } voiddisplay(uchar*p)//显示子程序 { while(*p! ='\0') { wr_dat(*p); p++; delay1ms (1); } } init_play()//1602初始化显示 { lcd_init(); wr_com(0x80); display(str1); wr_com(0xc0); display(str2); } /**************************ds1820程序*************************/ voiddelay_18B20(uinti)//延时1微秒 { while(i--); } voidds1820rst()//DS18B20复位 { ucharx=0; DQ=1;//DQ置位 delay_18B20(4);//延时 DQ=0;//DQ拉低 delay_18B20(100);//精确延时大于480us DQ=1;//拉高 delay_18B20(40); } uchards1820rd()//DS18B20读数据 { uchari=0; uchardat=0; for(i=8;i>0;i--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } voidds1820wr(ucharwdata)//DS18B20写数据 { uchari=0; for(i=8;i>0;i--) { DQ=0; DQ=wdata&0x01; delay_18B20(10); DQ=1; wdata>>=1; } } voidread_temp()//读取温度值并转换 { uchara,b; ds1820rst(); ds1820wr(0xcc);//跳过读序列号 ds1820wr(0x44);//启动温度转换 ds1820rst(); ds1820wr(0xcc);//跳过读序列号 ds1820wr(0xbe);//读取温度 a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) { tflag=0; } else { tvalue=~tvalue+1; tflag=1; } tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 } /*******************************************************************/ voidds1820disp1()//温度值显示 { ucharflagdat; ucharflagtsheding; disdata1[0]=tvalue/1000+0x30;//百位数 disdata1[1]=tvalue%1000/100+0x30;//十位数 disdata1[2]=tvalue%100/10+0x30;//个位数 disdata1[3]=tvalue%10+0x30;//小数位 if(tsheding { flagtsheding='-'; disdata1[4]=(~tsheding+1)/10+0x30; disdata1[5]=(~tsheding+1)%10+0x30; } else { flagtsheding=''; disdata1[4]=tsheding/10+0x30; disdata1[5]=tsheding%10+0x30; } if(tflag==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号: - if(disdata1[0]==0x30) { disdata1[0]=0x20;//如果百位为0,不显示 if(disdata1[1]==0x30) { disdata1[1]=0x20;//如果百位为0,十位为0也不显示 } } wr_com(0x85); wr_dat(flagdat);//显示符号位 wr_com(0x86); wr_dat(disdata1[0]);//显示百位 wr_com(0x87); wr_dat(disdata1[1]);//显示十位 wr_com(0x88); wr_dat(disdata1[2]);//显示个位 wr_com(0x89); wr_dat(0x2e);//显示小数点 wr_com(0x8a); wr_dat(disdata1[3]);//显示小数位 wr_com(0x8b);//显示设定温度值 wr_dat('('); wr_com(0x8c); wr_dat(flagtsheding); wr_com(0x8d); wr_dat(disdata1[4]); wr_com(0x8e); wr_dat(disdata1[5]); wr_com(0x8f); wr_dat(')'); } /*******************************************************************/ /*voidds1820disp2()//湿度值显示 { f=tem1*256+tem0; f=f*20; if((6033<=f)&&(f<=7351)) { if((7224 {temp0=0;temp1=(7351-f)*10/127;} if((7100 {temp0=1;temp1=(7224-f)*10/124;} if((6976 {temp0=2;temp1=(7100-f)*10/124;} if((6853 {temp0=3;temp1=(6976-f)*10/123;} if((6728 {temp0=4;temp1=(6853-f)*10/125;} if((6600 {temp0=5;temp1=(6728-f)*10/128;} if((6486 {temp0=6;temp1=(6600-f)*10/132;} if((6330 {temp0=7;temp1=(6468-f)*10/138;} if((6186 {temp0=8;temp1=(6330-f)*10/144;} if((6033 {temp0=9;temp1=(6186-f)*10/153;} } else { temp0=0;temp1=0; } disdata2[0]=temp0+0x30; disdata2[1]=temp1+0x30; disdata2[2]=hsheding/10+0x30; disdata2[3]=hsheding%10+0x30; wr_com(0xc8);//显示所测湿度值 wr_dat(disdata2[0]); wr_com(0xc9); wr_dat(disdata2[1]); wr_com(0xca); wr_dat('%'); wr_com(0xcb);//显示设定湿度值 wr_dat('('); wr_com(0xcc); wr_dat(disdata2[2]); wr_com(0xcd); wr_dat(disdata2[3]); wr_com(0xce); wr_dat('%'); wr_com(0xcf); wr_dat(')'); }*/ /********************主程序***********************************/ voidmain() { K1=0; K2=0; K3=0; K4=0; init_play();//1602初始化显示 delay1ms(50); EA=1;//开中断 EX0=1;//允许外部中断0中断 EX1=1;//允许外部中断1中断 ET0=1;//允许定时器0中断 ET1=1;//允许计数器1中断 IT0=1; IT1=1; init_timer();//定时/计数器初始化设置 while (1) { read_temp();//读取温度 ds1820disp1();//显示温度 delay1ms(50); //ds1820disp2();//显示湿度 beef=1; delay1ms(50); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 课程 报告