广工微机原理课程报告Word格式.docx
- 文档编号:21573784
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:20
- 大小:406.79KB
广工微机原理课程报告Word格式.docx
《广工微机原理课程报告Word格式.docx》由会员分享,可在线阅读,更多相关《广工微机原理课程报告Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
课程难点:
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<
reg51.h>
#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:
减设置
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计数中断
}
voidinit_timer()
TMOD=0x51;
//定时器0初值定时50000us
//定时器1清零
//T0开始计时
//T1开始计数
voiddelay1ms(uintms)//延时1毫秒
uinti,j;
for(i=0;
i<
ms;
i++)
for(j=0;
j<
110;
j++);
voidwr_com(ucharcom)//1602写指令
{
delay1ms
(1);
RS=0;
RW=0;
EN=0;
P1=com;
EN=1;
voidwr_dat(uchardat)//1602写数据
RS=1;
P1=dat;
voidlcd_init()//1602初始化设置
wr_com(0x38);
delay1ms
(1);
//设置16*2显示,5*7点阵,8位数据接口;
并延时
wr_com(0x08);
//设置关显示,光标不显示,光标不闪烁;
wr_com(0x01);
//设置显示清屏;
wr_com(0x06);
//设置显示光标移动位置;
wr_com(0x0c);
//设置显示开及光标设置;
voiddisplay(uchar*p)//显示子程序
while(*p!
='
\0'
)
wr_dat(*p);
p++;
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;
if(DQ)
dat|=0x80;
delay_18B20(10);
return(dat);
voidds1820wr(ucharwdata)//DS18B20写数据
DQ=wdata&
0x01;
DQ=1;
wdata>
voidread_temp()//读取温度值并转换
uchara,b;
ds1820rst();
ds1820wr(0xcc);
//跳过读序列号
ds1820wr(0x44);
//启动温度转换
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<
hhhh)//判断温度设定值是正是负
flagtsheding='
-'
;
disdata1[4]=(~tsheding+1)/10+0x30;
disdata1[5]=(~tsheding+1)%10+0x30;
else
'
disdata1[4]=tsheding/10+0x30;
disdata1[5]=tsheding%10+0x30;
if(tflag==0)
flagdat=0x20;
//正温度不显示符号
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);
)'
/*voidds1820disp2()//湿度值显示
f=tem1*256+tem0;
f=f*20;
if((6033<
=f)&
&
(f<
=7351))
if((7224<
f)&
=7351))
{temp0=0;
temp1=(7351-f)*10/127;
if((7100<
=7224))
{temp0=1;
temp1=(7224-f)*10/124;
}
if((6976<
=7100))
{temp0=2;
temp1=(7100-f)*10/124;
if((6853<
=6976))
{temp0=3;
temp1=(6976-f)*10/123;
if((6728<
=6853))
{temp0=4;
temp1=(6853-f)*10/125;
if((6600<
=6728))
{temp0=5;
temp1=(6728-f)*10/128;
if((6486<
=6600))
{temp0=6;
temp1=(6600-f)*10/132;
if((6330<
=6486))
{temp0=7;
temp1=(6468-f)*10/138;
if((6186<
=6300))
{temp0=8;
temp1=(6330-f)*10/144;
=6186))
{temp0=9;
temp1=(6186-f)*10/153;
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_com(0xcb);
//显示设定湿度值
wr_com(0xcc);
wr_dat(disdata2[2]);
wr_com(0xcd);
wr_dat(disdata2[3]);
wr_com(0xce);
wr_com(0xcf);
}*/
/********************主程序***********************************/
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();
//显示温度
//ds1820disp2();
//显示湿度
beef=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 课程 报告