ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:429.91KB ,
资源ID:7502473      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7502473.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(最新传感器proteus虚拟实验.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

最新传感器proteus虚拟实验.docx

1、最新传感器proteus虚拟实验传感器proteus虚拟实验传感器原理与应用实验指导书 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()函数,它是判忙标志

2、的,在实际硬件要把注掉的那种打开/Port Definitions*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()时,会进入死循环, /可能在写该控制字时,该模

3、块没有返回写入完备命令,即DBPort&0x80=0x80 /实际硬件时打开此语句 LcdEn=0; return DBPort; /向LCD写入命令或数据*#define LCD_COMMAND 0 / Command#define LCD_DATA 1 / Data#define LCD_CLEAR_SCREEN 0x01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input) LcdEn=0; LcdRs=style; LcdRw=0; _nop_(); DBPort=input

4、; _nop_();/注意顺序 LcdEn=1; _nop_();/注意顺序 LcdEn=0; _nop_(); LCD_Wait(); /设置显示模式*#define LCD_SHOW 0x04 /显示开#define LCD_HIDE 0x00 /显示关 #define LCD_CURSOR 0x02 /显示光标#define LCD_NO_CURSOR 0x00 /无光标 #define LCD_FLASH 0x01 /光标闪动#define LCD_NO_FLASH 0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode) LC

5、D_Write(LCD_COMMAND, 0x08|DisplayMode); /设置输入模式*#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 / default#define LCD_MOVE 0x01 / 画面可平移#define LCD_NO_MOVE 0x00 /defaultvoid LCD_SetInput(unsigned char InputMode) LCD_Write(LCD_COMMAND, 0x04|InputMode);/初始化LCD*void LCD_Initial() LcdEn=0; LCD_Write(LCD_CO

6、MMAND,0x38); /8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(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)

7、LCD_Write(LCD_COMMAND,0x80|(x-0x40);void Print(unsigned char *str) while(*str!=0) LCD_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/

8、*ds18b20延迟子函数(晶振12MHz )*/ /*DS18B20对时间要求很严,但只能长不能短*在11.0592M下也行,因为时间长些*/void delay_18B20(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; /稍做

9、延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);/*ds18b20读一个字节*/ unsigned char ReadOneChar(void) 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 cha

10、r i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat=1; /*读取ds18b20当前温度*/unsigned char *ReadTemperature(char TH,char TL,unsigned char RS) unsigned char tt2; Init_DS18B20(); WriteOneChar(0xCC); / 跳过读序号列号的操作 WriteOneChar(0x4E); / /写入写暂存器命令,修改TH和TL和分辩率配置寄存器 /先写TH,再写TL,最后写配置寄存器 Wr

11、iteOneChar(TH); /写入想设定的温度报警上限 WriteOneChar(TL); /写入想设定的温度报警下限 WriteOneChar(RS); /写配置寄存器,格式为0 R1 R0 1,1 1 1 1 /R1R0=00分辨率娄9位,R1R0=11分辨率为12位 delay_18B20(80); / this message is wery important Init_DS18B20(); WriteOneChar(0xCC); / 跳过读序号列号的操作 WriteOneChar(0x44); / 启动温度转换 delay_18B20(80); / this message i

12、s wery important Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(80); tt0=ReadOneChar(); /读取温度值低位 tt1=ReadOneChar(); /读取温度值高位 return(tt);LCD_18b20.c#include /用AT89C51时就用这个头文件/#include /用华邦W78E58B时必须用这个头文件#include #include #include #include

13、#include #include #include LCD1602.h /液晶显示头文件/sbit DQ = P34; /定义DQ引脚为P3.4unsigned char t2,*pt; /用来存放温度值,测温程序就是通过这个数组与主函数通信的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,0x

14、2b,0x31,0x32,0x34,0x43,0; /显示温度上下限,上电时显示TH:+125 TL:+124C unsigned char code dotcode4=0,25,50,75;/*因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*再将表值分离出十位和个位后送到十分位和百分位*/void covert0( unsigned char TH, unsigned char TL) /将温度上下限转换为LCD显示的数据 if(TH0x7F) /判断正负,如果为负温,将其转化为其绝对值 TempBuffer03=0x2d; /0x2d为-的ASCII码 TH=TH; TH+;

15、 else TempBuffer03=0x2b; /0x2B为+的ASCII码 if(TL0x7f) TempBuffer011=0x2d; /0x2d为-的ASCII码 TL=TL+1; else TempBuffer011=0x2b; /0x2B为+的ASCII码 TempBuffer04=TH/100+0x30; /分离出TH的百十个位 if( TempBuffer04=0x30) TempBuffer04=0xfe; /百位数消隐 TempBuffer05=(TH%100)/10+0x30; /分离出十位 TempBuffer06=(TH%100)%10+0x30; /分离出个位 Te

16、mpBuffer012=TL/100+0x30; /分离出TL的百十个位 if( TempBuffer012=0x30) TempBuffer012=0xfe; /百位数消隐 TempBuffer013=(TL%100)/10+0x30; /分离出十位 TempBuffer014=(TL%100)%10+0x30; /分离出个位void covert1(void) /将温度转换为LCD显示的数据 unsigned char x=0x00,y=0x00; t0=*pt; pt+; t1=*pt; if(t10x07) /判断正负温度 TempBuffer10=0x2d; /0x2d为-的ASCI

17、I码 t1=t1; /*下面几句把负数的补码*/ t0=t0; /* 换算成绝对值*/ x=t0+1; /*/ t0=x; /*/ if(x255) /*/ t1+; /*/ else TempBuffer10=0x2b; /0xfe为变+的ASCII码 t1=4; /右移4位 x=x&0x0f; /和前面两句就是取出t0的高四位 t1=t1|x; /将高低字节的有效值的整数部分拼成一个字节 TempBuffer11=t1/100+0x30; /+0x30 为变 09 ASCII码 if( TempBuffer11=0x30) TempBuffer11=0xfe; /百位数消隐 TempBuf

18、fer12=(t1%100)/10+0x30; /分离出十位 TempBuffer13=(t1%100)%10+0x30; /分离出个位 t0=t0&0x0c; /取有效的两位小数 t0=2; /左移两位,以便查表 x=t0; y=dotcodex; /查表换算成实际的小数 TempBuffer15=y/10+0x30; /分离出十分位 TempBuffer16=y%10+0x30; /分离出百分位 void delay(unsigned char i) while(i-);main() unsigned char TH=110,TL=-20; /下一步扩展时可能通过这两个变量,调节上下限 /

19、测温函数返回这个数组的头地址 while(1) pt=ReadTemperature(TH,TL,0x3f); /上限温度-22,下限-24,分辨率10位,也就是0.25C /读取温度,温度值存放在一个两个字节的数组中, delay(100); covert1(); covert0(TH,TL); LCD_Initial(); /第一个参数列号,第二个为行号,为0表示第一行 /为1表示第二行,第三个参数为显示数据的首地址 LCD_Print(0,0,TempBuffer0); LCD_Print(0,1,TempBuffer1); 实验2:基于MPX4115传感器温度测量实验 步骤:(1)在P

20、roteus软件画出电路图 (2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。 压力测试仪系统描述;输入 15-115kPA压力信号 输出 00h-ffh数字信号(adc0832) 在LCD上显示实际的压力值,如果超限则报警线性区间标度变换公式: y=(115-15)/(243-13)*X+15kpa 作者:单位:日期:2008.3.7*/#include #include intrins.h#define uint unsigned int#define uchar unsigned char/ADC0832的引脚sbit ADCS =P20;

21、/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; /位扫描unsigned char dispcode11=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff; /共阳数码管字段码unsigned char dispbu

22、f4;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; _nop_(); _nop_(); ADCLK=0;/拉低CLK端,形成下降沿3 ADDI=1;/控制命令结束 _nop_(); _nop_(); dat=0; for(i=0;i8;i+) dat|=ADDO;/收数据 ADCL

23、K=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; 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; f

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1