传感器proteus虚拟实验

上传人:无*** 文档编号:64722816 上传时间:2022-03-22 格式:DOC 页数:20 大小:731.50KB
收藏 版权申诉 举报 下载
传感器proteus虚拟实验_第1页
第1页 / 共20页
传感器proteus虚拟实验_第2页
第2页 / 共20页
传感器proteus虚拟实验_第3页
第3页 / 共20页
资源描述:

《传感器proteus虚拟实验》由会员分享,可在线阅读,更多相关《传感器proteus虚拟实验(20页珍藏版)》请在装配图网上搜索。

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 Definition

2、s*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 /实际硬件时打开此语句L

3、cdEn=0;return DBPort;/向LCD写入命令或数据*#define LCD_MAND0 / mand#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_();LCD_Wait

4、();/设置显示模式*#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_MAND, 0x08|DisplayMode);/设置输入模式*#define LCD_AC_UP0x02#define

5、LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 画面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_MAND, 0x04|InputMode);/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_MAND,0x38); /8位数据端口,2行显示,5*7点阵LCD_Write(LCD_MAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CUR

6、SOR); /开启显示, 无光标LCD_Write(LCD_MAND,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_MAND,0x80|x);if(y=1)LCD_Write(LCD_MAND,0x80|(x-0x40);void Print(unsigned char *str)while(*str!=0)LCD_Write(LCD_DATA,*str);str+;

7、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_18B20(unsigned int i)while(i-);/

8、*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(void)unsigned char i=0;unsigned

9、 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当前温度*/unsigned char *ReadTemp

10、erature(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,1 1 1 1/R1R0=00分辨率娄9位,R1R0=11

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个寄存器) 前两个就是温度delay_18B20(80);tt0=ReadOne

12、Char(); /读取温度值低位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;/用来存放温度值,测温程序就是通过这个数组与主函数通信的unsigned char TempBuffe

13、r19=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为+的ASCII码 TempBuffer04=TH/100+

15、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;/分离出十位 TempBuffer014=(TL%100)%10+0x30

16、; /分离出个位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;/右移4位 x=x&0x0f;/和前面两句就是取出t0的高四位

17、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;/查表换算成实际的小数 TempBuffer15=y/10+0x30;/分离出十分位Temp

18、Buffer16=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);LCD_Initial();/第一个参数列号,第二个为行号,为

19、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-15)/(243-13)*X+15kpa 作者:单位:日期:2

20、008.3.7*/#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,0xef,0xdf,0xbf,0x7f;

21、 /位扫描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 k; for(k=0;k1)&0x1;

22、_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;/形成一次时钟脉冲 _nop_(); _nop_(); j=j7

23、; 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+15kpapress=(10.0/23

24、.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文件,导入到单片机当中,进行仿真,观察结果。#in

25、clude /头文件#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 ack ;/全局应答变量/float te

26、mp_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;/ 电机 sbit speek =P22;

27、/ 声音 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 Sensibus and gives an

28、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=1; /释放数据总线 temp_h=v

29、al; 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) /写一个字节 返回应答信号 unsigned char

30、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 _nop_(); SCK=1; /第一个脉冲

31、_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(); /启动/测量温度或者是温度,返回校验值 text_a(unsigned char m

32、l) 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_rest() ;/复位 text_a(TEM

33、P_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

34、=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; gwei=1; swei=1;bwei=1; qwei=1; P1=dispc

35、odeabcd/100; qwei=0; delay(40); qwei=1; abcd=abcd%100 ; P1=dispcodeabcd/10; bwei=0; delay(40);bwei=1; if(setbz_hsetbz_l) if(setbz_h) abcd=setzhi_h; if(setbz_l) abcd=setzhi_l;P1=dispcodeabcd/10; swei=0; delay(40); swei=1; P1=dispcodeabcd%10; gwei=0; delay(40); gwei=1; else abcd=xianzhi_t; P1=dispcode

36、abcd/100; swei=0; delay(40); swei=1; abcd=abcd%100; P1=dispcodeabcd/10; gwei=0; delay(40); gwei=1; doing() char xianzhi_mi; xianzhi_mi=xianzhi_t/10; if(xianzhi_misetzhi_l) motor=0;hot=0;speek=0;if(xianzhi_misetzhi_h) motor=1;hot=0;speek=1; if(xianzhi_misetzhi_l) motor=0;hot=1;speek=1; key() if(set&s

37、etkey) setkey=0; if(setbz_l) setbz_l=0;setbz_h=0; else if(!setbz_h) setbz_h=1;else setbz_h=0;setbz_l=1; if(!set) setkey=1; if(setup=0) if(setbz_h=1) if (setzhi_h=99) setzhi_h+; if(setbz_l=1) if (setzhi_lsetzhi_h)&(setzhi_lsetzhi_l)&(setzhi_h=1) setzhi_h-;if(setbz_l=1) if (setzhi_l=1) setzhi_l-; /系统初始化/csh() P0=0XFF; P1=1; P2=0; P3=0XFF;main() setzhi_h=22;/设置高温 setzhi_l=20;/设置低温 csh();/系统初始化 while(1) text_jishuan_temp11();/测温湿度 /xianshi();/显示 doing();/处理 key();/键处理 / xianshi();/显示 20 / 20

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!