传感器proteus虚拟实验_第1页
传感器proteus虚拟实验_第2页
传感器proteus虚拟实验_第3页
传感器proteus虚拟实验_第4页
传感器proteus虚拟实验_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、传感器原理与应用实验指导书Proteus-Vl. 0 版本实验1 :基于DS18B20传感器温度测量实验步骤:(1)在Proteus软件Iffl出电路图(2)用ke订C软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。包括:2个头文件LCD1602.h和DS18B20.h; 1个源文件LCD_18b20.c;代码如下LCD1602.h :include / 用 AT89C51 时就用这个头文件/include /用华邦W78E58B时必须用这个头文件include /注意那个LCD_Wait()函数,它是判忙标志的,在实际硬件要把注掉的那种打开/Dzr+sbit Lcd

2、Rs占q T1. T T1 T1 T1 T1 T T11=P2a0 ;sbit LcdRw=卩2人1;sbit LcdEn=P2A2;sfr DBPort=0x80;/P0二0x80, P1二0x90, P2二OxAO, P3=0xB0.数据端口/部等待unsigned char LCD_Wait(void)LcdRs=0;LcdRw=l; _nop_ ();LcdEn=l; _nop_();/while (DBPort&0x80) ;/ 在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY() 时会进入死循环,/可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x8

3、00x80/实际硬件时打开此语句LcdEn二0;return DBPort;/ 向 LCD*#define LCD_C0MMAND0 / Command#define LCD_DATA1 / Datadefine LCD_CLEAR_SCREEX 0x01/ 清屏define LCD_H0MING0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;DBPort=input;_nop_() ;/ 注意顺岸LcdEn=l;nop() ;/注意顺序LcdEn=0;_nop_ ();LCDJVai

4、t ();void LCD_SetDisplay(unsigned char DisplayMode)/设显示模式define LCD_SH0Wdefine LCD_HIDEdefine LCD_CURSORdefine LCD_N0_CURS0Rdefine LCD_FLASHdefine LCD_NO_FLASHLCD_Write(LCD_COMMAND,0x04/显示开0x00/显示关0x02 /显示光标0x00 /无光标0x01/光标闪动0x00 /光标不闪动0x08 DisplayMode);define LCD AC UP 0x02define LCD_AC_D0WN0x00 /

5、defaultdefine LCD_M0VEdefine LCD_NO_MOVE0x01 /画而可平移0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04 InputMode);/ /I#*/*/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND, 0x38);/8位数据端口 , 2行显示,点阵LCD_SetDisplay(LCD_SH0W|LCD_N0_CURS0R);LCD_Write(LCD_COMMAND, LCD_C

6、LEAR_SCREEN);/开启显示,无光/清屏LCD_SetInput(LCD_AC_UP LCD_N0_M0VE);LCDJVrite (LCD_CONIAXD, 0x38);void GotoXY(unsigned char x, unsigned char y)/AC递增,画而不动 辻(y=0)LCD_Write(LCD_COMMAND, 0x80 x);if(y=l)LCD_Write(LCD_C0MMAND, 0x80 (x0x40);void Print(unsigned char *str)(while(*str !=,0)LCD_Write(LCD_DATA, *str);s

7、tr+;)void LCD_Pri nt(u nsigned char x, unsigned char y, unsigned char * str)GotoXY(x,y);Print (str);ttinclude / 用 AT89C51 时就用这个头文件 /ttinclude / 用华邦W78E58B时必须用这个头文件 sbit DQ = P3A4;/ 定义 DQ 引脚为 P3.4/*dsl8b20 延迟子函数(晶振 12MHz )*/*DS18B20对时间要求很严,但只能长不能短在11.0592M下也行,因为时间长些*/ DS18b20.hvoid delay_18B20(unsign

8、ed int i)while(i-); void Init_DS18B20(void)/*dsl8b20初女台化函数 *严/*(unsigned char x=0;DQ = 1;/DQ 复位delay_18B20(8) ;/ 稍做延时DQ = 0;/单片机将DQ拉低delay_18B20(80) ; / 精确延时 大于 480usdelay_18B20(14);X二DQ; /稍做延时后如果x=0则初始化成功X二1则初始化失败 delay_18B20(20);/*dsl8b20读一个字节 */unsigned char ReadOneChar(void) unsigned char i=0;un

9、signed char dat = 0;for (i=8;i0;i)DQ = 0; /给脉冲信号dat=l;DQ = 1; / 给脉冲信号 if (DQ) dat | =0x80; delay_18B20 (4);return(dat);广峰* *dsl8b20写个字节 *严卜void WriteOneChar(unsigned char dat)unsigned char i=0;for (i=8; i0; i-一)DQ 二 0;DQ = dat&OxOl; delay_18B20(5);DQ = 1;dat=l;产产材和榊材读取dsl8b2Q当前温度*/unsigned char Read

10、Temperature(char TH,char TL,unsigned char RS) unsigned char tt2;Init_DS18B20();WriteOneChar(OxCC); /跳过读序号列号的操作WriteOneChar(0x4E);/ /写入写暂存器命令,修改TH和TL和分辩率配置寄存WriteOneChar(TH);WriteOneChar (TL);WriteOneChar(RS);delay_18B20(80);Init_DS18B20();WriteOneChar(OxCC);WriteOneChar(0x44);delay_18B20(80);Init_DS

11、18B20();WriteOneChar(OxCC);WriteOneChar(OxBE);delay_18B20(80);tt0=ReadOneChar();ttl=ReadOneChar ();return (tt);/先写TH,再写TL,最后写配置寄存器/写入想设定的温度报警上限/写入想设定的温度报警下限/写配置寄存器,格式为0 R1 R0 1,1 1 1 1/R1R0-00分辨率娄9位,R1R0二11分辨率为12位/ this message is wery important/跳过读序号列号的操作/启动温度转换/ this message is wery important/跳过读序

12、号列号的操作/读取温度寄存器等(共可读9个寄存器)前两个就是温/读取温度值低位/读取温度值高位LCD 18b20.cinclude /用AT89C51时就用这个头文件/include /用华邦W78E58B时必须用这个头文件include #include include ffinclude #includestring hinclude /液晶显不头文件ftinclude LCD1602h/sbit DQ = P3a4;/定义DQ引脚为P3.4/用来存放温度值,测温程序就是通过这个数unsigned char t2,*pt;纟日上i主函数通信的unsigned charTempBuffer

13、1 9 = 0x2b, 0x31, 0x32, 0x32, 0x2e, 0x30, 0x30, 0x43,,0 ;/显示实时温度,上电时显示+125. 00Cunsigned charTempBufferO17 = 0x54, 0x48, 0x3a, 0x2b,0x31,0x32, 0x35, 0x20,0x54, 0x4c, 0x3a, 0x2b, 0x31, 0x32, 0x34, 0x43, 0;/显示温度上下限,上电时显示TH:+125 TL:+124Cunsigned charcode dotcode 4 = 0, 25, 50, 75;/*因显示分辨率为0.25,但小数运算比较麻烦

14、,故采用查表的方法* 再将表值分离岀十位和个位后送到十分位和百 分位void covertO( unsigned char TH, unsigned char TL)/将温度上下限转换为LCD显示的数据if(TH0x7F)TempBufferO3=0x2d;THTH;TH+;else TempBufferO!3=0x2b;/判断正负,如果为负温,将其转化为其绝 对值/0x2d 为一”的 ASCII 码/0x2B 为 + 的 ASCII 码if(TL0x7f)TempBufferOIll=0x2d;TL=TL+1;else TempBuffer011=0x2b;/0x2d 为”一的 ASCII

15、码/0x2B 为 + 的 ASCII 码TempBufferO4二TH/100+0x30;if( TempBufferO4=0x30) TempBufferO4=Oxfe; /分离出TH的百十个 位百位数消隐/分离出十位/分离出个位TempBufferO12=TL/100+0x30;/分离出TL的百十个位辻(TempBufferO 12 =0x30) TempBufferO I12J=0xfe; /百位数消隐TempBufferO13=(TL%100)/10+0x30;/分离出十位TempBufferO14=(TL%100)%10+0x30;/分离出个位void covert 1 (void)

16、 /将温度转换为LCD显不的数据unsigned char x=0x00,y=0x00;tO=*pt;pt+;tl=*pt;if(tl0x07) /判断正负温度(TempBufferl0=0x2d;/0x2d 为-的 ASCII 码/*下面几句把负数的补码*/*换算成绝对值*/x=t0+l;t0=x;*/TempBufferO5=(TH%100)/10+0x30;TempBufferO6二(TH%100)%10+0x30;百位数消隐/分离出十位/分离出个位/取有效的两位小数/左移两位,以便查表/查表换算成实际的小 数else TempBufferl0=0x2b; /Oxfe 为变 + 的 AS

17、CII 码tl=4;/将高字节左移4位tl=tl&0x70;/取出高字节的3个有效数字位x=t0;/将t0暂存到X,因为取小数部分还要用到它x=4;/右移4位/和前面两句就是取出t0的高四位x二x&OxOf;tl=tl |x;/将高低字节的有效值的整数部分拼成一个字节TempBufferll=tl/100+0x30;/+0x30 为变 0为 ASCII 码辻(TempBuffer 1 1J =0x30) TempBufferl l=Oxfe; /TempBufferl2=(t叮%100)/10+0x30;TempBufferl3=(t1%100)%10+0x30; t0=tOj&OxOc;t0

18、=2;x二t0;y二dotcodex;TempBufferl5=y/10+0x30;TempBufferl6=y%10+0x30;/分离岀百分位void delay(unsigned char i)while(i一一);main()(unsigned char TH二110, TLTO; /下一步扩展时可能通过这两个变量,调节上下限/测温函数返回这个数组的头地址while (1)9pt=ReadTemperature(TH, TL, 0x3f) : / 上限温度-22,下限-24,分辨率 10 位,也就是0. 25C读取温度,温度值存放在一个两个字节的数组中delay(100);covertl

19、 ();covertO(TH, TL);LCD_Initial() ; /第一个参数列号,第二个为行号,为0表示第一行/为1表示第二行,第三个参数为显示数据的首地址LCD_Print(0, 0,T empBufferO);LCD_Print(0,1,T empBufferl);实验2 :基于MPX4U5传感器温度测量实验步骤:(1)在Proteus软件Iffl出电路图(2)用keil C软件写岀C程序,并生成.hex文件,导入到单片机当中,进行仿真, 观察结果。压力测试仪系统描述;输 入15115kPA压力信号输出00hffh数字信号(adc0832 )在LCD上显示实际的压力值,如果超限则报

20、警作者:单位:日 2008. 3. 7xlxkIz VZkIx xJz kIzkIx xlx Jx kIxkIx kI Zx kI %lx %/x xlx Jx kIx kIz%jz kIx sZz kI kIx Xz kIx彳、*厂彳、*卜叫0 .卜彳、I、彳、*卜叫、*卜1、.卜彳、/卜*1、.卜/卜1、*1彳、#卜1、.卜彳、/卜1、.卜彳、#卜1、.卜彳、卜1、*卜彳、#卜1、*卜1、/卜1、.卜1、卜1、.卜1、卜1、*卜include #include intrinsh#define uint unsignedint #define uchar unsigned char/ADC0

21、832的引脚sbit ADCS =P2a0;/ADC0832 chip seclectsbit ADDI 二P3A7;/ADC0832 k insbit ADDO 二P3A7;/ADC0832 k outsbit ADCLK 二P3A6;/ADC0832 clock signal/位扫描char/共阳unsigned chardispbitcode 8 = Oxf7, Oxfb, Oxfd, Oxfe, Oxef, Oxdf, Oxbf, 0x7f;unsigned dispcode 11 = 0xC0, 0xF9, 0xA4, OxBO, 0x99, 0x92, 0x82, 0xF8, 0x

22、80, 0x90, Oxff;数码管字段 码unsigned char dispbuf4;uint temp;uchar getdata; /获取ADC转换回来的值void delay_lms(void) /12mhz delay 1.01msunsigned char x, y;x=3;while(x-)y 二 40;while(y-);void display (void) /数码管显不函数char k;for (k=0;k J 7/AD转换,返回结果/采集并返回unsigned int Adc0832(unsigned char channel)uchar i=0;uchar j;uint dat二0;uchar ndat=0;if(channel=0)channel=2;if (channel=l)channel=3;ADDI=1;_nop_();_nop_();_nop_();ADCLK=1;/拉高CLK端_nop_ ();_nop_ ();ADCLK二0;/拉低CLK端,形成下降沿1_nop_ ();_nop_ ();ADCLK=1;/拉高CLK端ADDI=channel&Oxl;_nop_ ();_nop_ ();ADCLK=O; /拉低CLK端,形成下降沿2_nop_ ();_nop_ ();ADCLK=1; /

温馨提示

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

评论

0/150

提交评论