




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、传感器原理与应用实验指导书Proteus-V1.0版本实验1:基于DS18B20传感器温度测量实验 步骤:(1)在Proteus软件画出电路图 (2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。包括:2个头文件LCD1602.h和DS18B20.h; 1个源文件LCD_18b20.c;代码如下LCD1602.h:#include /用AT89C51时就用这个头文件/#include /用华邦W78E58B时必须用这个头文件#include /注意那个LCD_Wait()函数,它是判忙标志的,在实际硬件要把注掉的那种打开/Port Definitio
2、ns*sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn = P22;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/内部等待函数*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();/while(DBPort&0x80);/在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环, /可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80=0x80 /实际硬件时打开此语
3、句LcdEn=0;return DBPort;/向LCD写入命令或数据*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意顺序LcdEn=1;_nop_();/注意顺序LcdEn=0;_nop_();
4、LCD_Wait();/设置显示模式*#define LCD_SHOW0x04 /显示开#define LCD_HIDE0x00 /显示关 #define LCD_CURSOR0x02 /显示光标#define LCD_NO_CURSOR0x00 /无光标 #define LCD_FLASH0x01 /光标闪动#define LCD_NO_FLASH0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|DisplayMode);/设置输入模式*#define LCD_AC_UP0
5、x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 画面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay
6、(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动/*void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);void Print(unsigned char *str)while(*str!=0)L
7、CD_Write(LCD_DATA,*str);str+;void LCD_Print(unsigned char x, unsigned char y, unsigned char *str) GotoXY(x,y); Print(str);DS18b20.h#include /用AT89C51时就用这个头文件/#include /用华邦W78E58B时必须用这个头文件sbit DQ = P34;/定义DQ引脚为P3.4/*ds18b20延迟子函数(晶振12MHz )*/ /*DS18B20对时间要求很严,但只能长不能短*在11.0592M下也行,因为时间长些*/void delay_18B
8、20(unsigned int i)while(i-);/*ds18b20初始化函数*/void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);/*ds18b20读一个字节*/ unsigned char ReadOneChar(vo
9、id)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); return(dat);/*ds18b20写一个字节*/ void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat=1; /*读取ds18b20
10、当前温度*/unsigned char *ReadTemperature(char TH,char TL,unsigned char RS)unsigned char tt2;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x4E); / /写入写暂存器命令,修改TH和TL和分辩率配置寄存器/先写TH,再写TL,最后写配置寄存器WriteOneChar(TH);/写入想设定的温度报警上限WriteOneChar(TL);/写入想设定的温度报警下限WriteOneChar(RS);/写配置寄存器,格式为0 R1 R0 1,
11、1 1 1 1/R1R0=00分辨率娄9位,R1R0=11分辨率为12位delay_18B20(80); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(80); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是
12、温度delay_18B20(80);tt0=ReadOneChar(); /读取温度值低位tt1=ReadOneChar(); /读取温度值高位return(tt);LCD_18b20.c#include /用AT89C51时就用这个头文件/#include /用华邦W78E58B时必须用这个头文件#include #include #include #include #include #include #include LCD1602.h/液晶显示头文件/sbit DQ = P34;/定义DQ引脚为P3.4unsigned char t2,*pt;/用来存放温度值,测温程序就是通过这个数组与
13、主函数通信的unsigned char TempBuffer19=0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,0;/显示实时温度,上电时显示+125.00Cunsigned char TempBuffer017=0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,0;/显示温度上下限,上电时显示TH:+125 TL:+124Cunsigned char code dotcode4=0,25,50,75;/*因显示分辨率为0.25,但小数运算比较麻烦,故
14、采用查表的方法*再将表值分离出十位和个位后送到十分位和百分位*/void covert0( unsigned char TH, unsigned char TL)/将温度上下限转换为LCD显示的数据 if(TH0x7F) /判断正负,如果为负温,将其转化为其绝对值 TempBuffer03=0x2d; /0x2d为-的ASCII码TH=TH;TH+; else TempBuffer03=0x2b;/0x2B为+的ASCII码 if(TL0x7f) TempBuffer011=0x2d; /0x2d为-的ASCII码 TL=TL+1; else TempBuffer011=0x2b;/0x2B为
15、+的ASCII码 TempBuffer04=TH/100+0x30; /分离出TH的百十个位 if( TempBuffer04=0x30) TempBuffer04=0xfe; /百位数消隐 TempBuffer05=(TH%100)/10+0x30;/分离出十位 TempBuffer06=(TH%100)%10+0x30; /分离出个位 TempBuffer012=TL/100+0x30; /分离出TL的百十个位 if( TempBuffer012=0x30) TempBuffer012=0xfe; /百位数消隐 TempBuffer013=(TL%100)/10+0x30;/分离出十位 T
16、empBuffer014=(TL%100)%10+0x30; /分离出个位void covert1(void)/将温度转换为LCD显示的数据 unsigned char x=0x00,y=0x00; t0=*pt; pt+; t1=*pt; if(t10x07) /判断正负温度 TempBuffer10=0x2d; /0x2d为-的ASCII码t1=t1; /*下面几句把负数的补码*/t0=t0; /* 换算成绝对值*/x=t0+1; /*/t0=x; /*/if(x255) /*/t1+; /*/ else TempBuffer10=0x2b;/0xfe为变+的ASCII码 t1=4;/右移
17、4位 x=x&0x0f;/和前面两句就是取出t0的高四位 t1=t1|x;/将高低字节的有效值的整数部分拼成一个字节 TempBuffer11=t1/100+0x30; /+0x30 为变 09 ASCII码 if( TempBuffer11=0x30) TempBuffer11=0xfe; /百位数消隐 TempBuffer12=(t1%100)/10+0x30;/分离出十位 TempBuffer13=(t1%100)%10+0x30; /分离出个位 t0=t0&0x0c;/取有效的两位小数 t0=2;/左移两位,以便查表 x=t0; y=dotcodex;/查表换算成实际的小数 TempB
18、uffer15=y/10+0x30;/分离出十分位 TempBuffer16=y%10+0x30;/分离出百分位void delay(unsigned char i)while(i-);main() unsigned char TH=110,TL=-20; /下一步扩展时可能通过这两个变量,调节上下限 /测温函数返回这个数组的头地址 while(1) pt=ReadTemperature(TH,TL,0x3f); /上限温度-22,下限-24,分辨率10位,也就是0.25C /读取温度,温度值存放在一个两个字节的数组中,delay(100); covert1();covert0(TH,TL);
19、LCD_Initial();/第一个参数列号,第二个为行号,为0表示第一行/为1表示第二行,第三个参数为显示数据的首地址LCD_Print(0,0,TempBuffer0);LCD_Print(0,1,TempBuffer1); 实验2:基于MPX4115传感器温度测量实验 步骤:(1)在Proteus软件画出电路图 (2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。 压力测试仪系统描述;输入 15-115kPA压力信号 输出 00h-ffh数字信号(adc0832) 在LCD上显示实际的压力值,如果超限则报警线性区间标度变换公式: y=(115-
20、15)/(243-13)*X+15kpa 作者:单位:*/#include #include intrins.h#define uint unsigned int#define uchar unsigned char/ADC0832的引脚sbit ADCS =P20; /ADC0832 chip seclectsbit ADDI =P37; /ADC0832 k insbit ADDO =P37; /ADC0832 k outsbit ADCLK =P36; /ADC0832 clock signalunsigned char dispbitcode8=0xf7,0xfb,0xfd,0xfe,
21、0xef,0xdf,0xbf,0x7f; /位扫描unsigned char dispcode11=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff; /共阳数码管字段码unsigned char dispbuf4;uint temp;uchar getdata; /获取ADC转换回来的值void delay_1ms(void) /12mhz delay 1.01ms unsigned char x,y; x=3; while(x-) y=40; while(y-); void display(void) /数码管显示函数 char
22、k; for(k=0;k1)&0x1; _nop_(); _nop_(); ADCLK=0;/拉低CLK端,形成下降沿3 ADDI=1;/控制命令结束 _nop_(); _nop_(); dat=0; for(i=0;i8;i+) dat|=ADDO;/收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;/形成一次时钟脉冲 _nop_(); _nop_(); dat=1; if(i=7)dat|=ADDO; for(i=0;i8;i+) j=0; j=j|ADDO;/收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;/形成一次时钟脉冲 _n
23、op_(); _nop_(); j=j7; ndat=ndat|j; if(i=1; ADCS=1;/拉低CS端 ADCLK=0;/拉低CLK端 ADDO=1;/拉高数据端,回到初始状态 dat=8; dat|=ndat; return(dat); /return ad kvoid main(void) while(1) unsigned int temp; float press; getdata=Adc0832(0); if(14getdata243) /当压力值介于15kpa到115kpa之间时,遵循线性变换 int vary=getdata;/y=(115-15)/(243-13)*X
24、+15kpapress=(10.0/23.0)*vary)+9.3;/测试时补偿值为9.3temp=(int)(press*10); /放大10倍,便于后面的计算dispbuf3=temp/1000; /取压力值百位dispbuf2=(temp%1000)/100; /取压力值十位dispbuf1=(temp%1000)%100)/10; /取压力值个位dispbuf0=(temp%1000)%100)%10;/取压力值十分位display(); 试验三:基于SHT11温湿度传感器测量实验步骤:(1)在Proteus软件画出电路图 (2)用keil C 软件写出C程序,并生成.hex文件,导入
25、到单片机当中,进行仿真,观察结果。#include /头文件#include #include /#include /Keil library /*#define uchar unsigned char /定义一下方便使用#define uint unsigned int /定义一下方便使用#define ulong unsigned long /定义一下方便使用#define TEMP_ML 0x03 /000 0001 1 温度命令#define HUMI_ML 0x05 /000 0010 1 温度命令unsigned char error ;/全局错误变量unsigned char a
26、ck ;/全局应答变量/float temp_zi ;/全局应答变量/float humi_zi ;/全局应答变量unsigned char temp_h ;/全局应答变量unsigned char temp_LL ;/全局应答变量unsigned int xianzhi_t=0;/温度显值unsigned int xianzhi_h=0;/湿度显值uchar setzhi_h,setzhi_l;bit setbz_h,setbz_l,setkey; sbit DATA =P26;/数据 sbit SCK=P27;/时钟 sbit hot =P20;/ 加热 sbit motor =P21;/
27、 电机 sbit speek =P22;/ 声音 sbit set =P00;/ 设置 sbit setup =P01;/ 设置+ sbit setdown =P02;/ 设置- sbitgwei =P34;/个位 sbitswei =P33;/十位 sbitbwei =P32;/百位 sbitqwei =P31;/千位unsigned char code dispcode=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;/共阳/*基本驱动程char read() /读一个字节 返回应答信号/ reads a byte form the Se
28、nsibus and gives an acknowledge in case of ack=1 unsigned char i,val=0; temp_LL=0; temp_h=0; DATA=1; /释放数据总线 for (i=0x80;i0;i/=2) /位移8位 SCK=1; /上升沿读入 if (DATA) val=(val | i); /确定值 SCK=0; DATA=0; /读应答信号,有应答为1,为应答为0 通过CPU下拉为应答 SCK=1; /第9个脉冲 _nop_(); _nop_(); _nop_(); /pulswith approx. 5 us SCK=0; DATA
29、=1; /释放数据总线 temp_h=val; val=0; /低8位/ DATA=1; /释放数据总线 for (i=0x80;i0;i/=2) /位移8位 SCK=1; /上升沿读入 if (DATA) val=(val | i); /确定值 SCK=0; DATA=1;/0; /不需要应答 通过CPU下拉为应答 SCK=1; /第9个脉冲 _nop_(); _nop_(); _nop_(); /pulswith approx. 5 us SCK=0; DATA=1; /释放数据总线 temp_LL=val; char write(unsigned char value) /写一个字节 返
30、回应答信号 unsigned char i ; ack=0; for (i=0x80;i0;i/=2) /释放数据总线 if (i & value) DATA=1; /写入值 else DATA=0; SCK=1; /上升沿写入 _nop_(); _nop_(); _nop_(); /延时 SCK=0; DATA=1; /释放数据总线 SCK=1; /第9个脉冲 if (DATA=1) ack=1; /读应答信号 SCK=0; return ack; /error=1 表示没有应答void start_sht11(void) /启动 DATA=1; SCK=0; /数据为1,SCK=0 _no
31、p_(); SCK=1; /第一个脉冲 _nop_(); DATA=0; /数据跌落 _nop_ (); SCK=0; /完成一个脉冲 _nop_(); _nop_(); _nop_(); SCK=1; /再一个脉冲 _nop_(); DATA=1; /数据变为1 _nop_(); SCK=0; /完成该脉冲 void sht_rest(void) /复位 unsigned char i; DATA=1; SCK=0; /数据为1 时钟为0 for(i=0;i9;i+) /9 个脉冲为 复位 SCK=1; SCK=0; start_sht11(); /启动/测量温度或者是温度,返回校验值 te
32、xt_a(unsigned char ml) unsigned int i; start_sht11(); /启动 write(ml);/写入测温度 if (ack=1) sht_rest() ;/复位 write(ml);/写入测温度 /判断是否处于忙/ DATA=1;/释放数据总线 /for (i=0;i65535;i+) if(DATA=0) break; for (i=0;i55535;i+) if(DATA=0) break;else xianshi(); read();/读温度 /温湿度处理/ text_jishuan_temp11() error=0; ack=0; sht_re
33、st() ;/复位 text_a(TEMP_ML); text_jishuan_temp(); key(); text_a(HUMI_ML); text_jishuan_humi(); /计算温度/ text_jishuan_temp() float aa=0,bb=0,temp_zi;int abcd=0; aa=(float)temp_h*256+(float)temp_LL; temp_zi=0.01*aa-40; if (temp_zi0) temp_zi=0; temp_zi=temp_zi*10; xianzhi_t=(int)temp_zi;/给显示值 /计算湿度/ text_jishuan_humi() float aa=0,bb=0,humi_zi;int abcd=0; aa=(float)temp_h*256+(float)temp_LL; bb=aa*aa*2.8/1000000; aa=0.0405*aa; aa=aa-4-bb; humi_zi=aa; humi_zi=humi_zi*10; xianzhi_h=(int)humi_zi; /延时/delay(int i) while(-i); /显示处理/xianshi() int abcd=0; int i; for (i=0;i1;i+) abcd=xianzhi_h;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 模具行业法律法规与标准考核试卷
- 玻璃涂层技术考核试卷
- 电气安装工程的监理与验收程序规范标准考核试卷
- 相机购买指南与消费建议考核试卷
- 玻璃太阳能集热器考核试卷
- 景区旅游市场秩序维护考核试卷
- 玩具设计中的故事性与品牌塑造考核试卷
- 成人高等教育计算机图形学与虚拟现实考核试卷
- 粮油企业绿色采购与供应链管理考核试卷
- 宁夏财经职业技术学院《地质资源与地质工程进展与创新》2023-2024学年第二学期期末试卷
- 店铺装修施工方案
- 2025火灾报警产品强制性产品认证实施细则
- 中考数学《数与式》专题训练(含答案)
- 新生儿呼吸窘迫综合征的护理查房
- 体外诊断试剂培训课件
- 《ICC概述》课件:揭秘国际刑事法院的职能与运作
- 《建筑装饰工程施工图设计》学习领域课程标准
- DB33T 1214-2020 建筑装饰装修工程施工质量验收检查用表标准
- 消化内科诊疗指南及操作规范
- 液体配制安全
- 《电动航空器电推进系统技术规范》
评论
0/150
提交评论