传感器proteus虚拟实验教学内容
传感器proteus虚拟实验

《传感器原理与应用》实验指导书版本实验1:基于DS18B20传感器温度测量实验步骤:(1)在Proteus软件画出电路图(2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。
包括:2个头文件和; 1个源文件;代码如下:#include <>据端口ex文件,导入到单片机当中,进行仿真,观察结果。
压力测试仪系统描述;输入 15--115kPA压力信号输出 00h--ffh数字信号(adc0832)在LCD上显示实际的压力值,如果超限则报警线性区间标度变换公式: y=(115-15)/(243-13)*X+15kpa作者:单位:日期: <>#include ""#define uint unsigned int#define uchar unsigned charex文件,导入到单片机当中,进行仿真,观察结果。
#include <> 5 usSCK=0;DATA=1; 5 usSCK=0;DATA=1; //释放数据总线temp_LL=val;}char write(unsigned char value) //写一个字节返回应答信号{unsigned char i ;ack=0;for (i=0x80;i>0;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; //第一个脉冲_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;i<9;i++) //9 个脉冲为复位 { SCK=1;SCK=0;}start_sht11(); //启动}//测量温度或者是温度,返回校验值text_a(unsigned char ml){unsigned int i;start_sht11(); //启动write(ml);//写入测温度if (ack==1){sht_rest() ;//复位write(ml);//写入测温度}//判断是否处于忙// DATA=1;//释放数据总线//for (i=0;i<65535;i++) if(DATA==0) break;for (i=0;i<55535;i++){ if(DATA==0) break;else {xianshi();} } read();//读温度}/////////温湿度处理//////text_jishuan_temp11(){error=0;ack=0;sht_rest() ;//复位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=*aa-40;if (temp_zi<0){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*1000000;aa=*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;i<1;i++) {abcd=xianzhi_h;gwei=1;swei=1;bwei=1;qwei=1;P1=dispcode[abcd/100]; qwei=0;delay(40);qwei=1;abcd=abcd%100 ;P1=dispcode[abcd/10]; bwei=0;delay(40);bwei=1;if(setbz_h^setbz_l){if(setbz_h) abcd=setzhi_h; if(setbz_l) abcd=setzhi_l;P1=dispcode[abcd/10];swei=0;delay(40);swei=1;P1=dispcode[abcd%10];gwei=0;delay(40);gwei=1;}else{abcd=xianzhi_t;P1=dispcode[abcd/100];swei=0;delay(40);swei=1;abcd=abcd%100 ;P1=dispcode[abcd/10];gwei=0;delay(40);gwei=1;}}}doing(){char xianzhi_mi;xianzhi_mi=xianzhi_t/10;if((xianzhi_mi<setzhi_h)&(xianzhi_t>setzhi_l)) { motor=0;hot=0;speek=0;} if(xianzhi_mi>setzhi_h) { motor=1;hot=0;speek=1;}if(xianzhi_mi<setzhi_l) { motor=0;hot=1;speek=1;}}key(){if(set&setkey){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_l<setzhi_h)&(setzhi_l<=99)) setzhi_l++;}}if(setdown==0){if(setbz_h==1){ if ((setzhi_h>setzhi_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();//显示 }}。
基于Proteus仿真技术在传感器教学中的应用

基于Proteus仿真技术在传感器教学中的应用作为物联网产业核心之一的传感器技术,在近年来得到了快速发展,逐渐应用到我们生活的各个领域。
在传感器的教学中,仿真技术是一项非常重要的技术手段,可以极大地提高学生的学习效率和实践能力。
Proteus是一款功能强大的电子设计自动化软件,可以模拟各种电子电路以及单片机的运行情况。
在传感器的教学中,借助Proteus仿真技术可以构建各种传感器电路,并模拟实际应用过程,使学生更好地理解传感器的原理与应用。
1.构建传感器实验电路在Proteus中,可以从库中选择各种传感器元件,如温度传感器、湿度传感器、气体传感器等,构建相应的实验电路。
结合实际传感器的原理,完成对应用场景的模拟实验。
2.模拟传感器输出数据利用Proteus模拟传感器输出数据的过程,可以让学生更好地了解传感器输出信号的类型、数值、变化规律等。
这对于学生能够根据传感器输出信号完成数据解析、处理与应用有很大的帮助。
3.仿真传感器应用场景通过Proteus可以构建一些典型的传感器应用场景,如自动灯光控制、智能门锁等。
让学生通过实际操作,模拟出这些场景的工作过程,这样可以让学生对传感器的应用有更加深入、细致的理解。
1.易于操作Proteus的操作方式简单易学,学生学习Proteus并进行仿真操作时,不会陷入真实操作中遇到的各种困难。
可以有效缩短学习时间,提高学习效果。
2.模拟电路稳定性在实际电路中,电路会受到很多影响,如电源波动、噪声等等。
而在Proteus中,可以非常方便地模拟这些干扰因素,从而使学生了解到电路的稳定性与鲁棒性。
3.可实现快速迭代在实际电路设计与实现中,反复调试所需的时间与成本比较大。
而在Proteus中,能够快速地针对电路进行修改与调试,避免了在实际电路中的一些失误与错误。
综上,Proteus仿真技术在传感器教学中的应用对于学生的学习效率和实践能力都有很大的提高,应该在传感器教学中得到更广泛的应用。
proteus仿真课程设计

proteus仿真课程设计一、教学目标本课程的教学目标是让学生掌握Proteus仿真软件的基本操作,能够进行简单的电路设计和仿真实验。
具体包括以下三个方面:1.知识目标:使学生了解Proteus软件的基本功能和操作界面,理解电路仿真原理,掌握电路图的绘制和元件的选取与放置。
2.技能目标:培养学生能够运用Proteus软件进行电路设计和仿真实验,能够分析并解决实验过程中遇到的问题,提高学生的动手能力和创新思维。
3.情感态度价值观目标:培养学生对电子技术和仿真实验的兴趣,增强学生的团队合作意识,培养学生的科学探究精神。
二、教学内容教学内容主要包括Proteus软件的基本操作、电路图的绘制、元件的选取与放置、电路仿真原理及实验操作等。
具体安排如下:1.Proteus软件的基本操作:介绍软件的启动与退出、界面布局、工具栏功能等。
2.电路图的绘制:讲解电路图的基本元素、绘制方法以及常用电路符号。
3.元件的选取与放置:介绍元件库的分类、元件的选取与放置方法、元件参数的设置等。
4.电路仿真原理:讲解仿真实验的基本原理、仿真步骤以及结果分析。
5.实验操作:安排一系列具有代表性的实验,使学生在实践中掌握Proteus软件的使用。
三、教学方法为了提高教学效果,本课程将采用以下教学方法:1.讲授法:讲解Proteus软件的基本操作、电路图的绘制、元件的选取与放置等理论知识。
2.案例分析法:通过分析具体案例,使学生掌握电路仿真原理及实验操作。
3.实验法:安排一系列实验,让学生动手操作,培养学生的实际操作能力。
4.小组讨论法:鼓励学生分组讨论实验过程中遇到的问题,培养学生的团队合作精神。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《Proteus仿真教程》2.参考书:《电子电路设计与仿真》3.多媒体资料:教学PPT、实验演示视频等。
4.实验设备:计算机、Proteus软件、电子元件等。
传感器proteus虚拟实验

《传感器原理与应用》实验指导书版本实验1:基于DS18B20传感器温度测量实验步骤:(1)在Proteus软件画出电路图(2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。
包括:2个头文件和; 1个源文件;代码如下:#include <>据端口ex文件,导入到单片机当中,进行仿真,观察结果。
压力测试仪系统描述;输入 15--115kPA压力信号输出 00h--ffh数字信号(adc0832)在LCD上显示实际的压力值,如果超限则报警线性区间标度变换公式: y=(115-15)/(243-13)*X+15kpa作者:单位:日期: <>#include ""#define uint unsigned int#define uchar unsigned char//ADC0832的引脚sbit ADCS =P2^0; //ADC0832 chip seclectsbit ADDI =P3^7; //ADC0832 k insbit ADDO =P3^7; //ADC0832 k outsbit ADCLK =P3^6; //ADC0832 clock signalunsigned char dispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f}; //位扫描unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //共阳数码管字段码unsigned char dispbuf[4];uint temp;uchar getdata; //获取ADC转换回来的值void delay_1ms(void) //12mhz delay{unsigned char x,y;x=3;while(x--){y=40;while(y--);}}void display(void) //数码管显示函数{char k;for(k=0;k<4;k++){P1 = dispbitcode[k];P0 = dispcode[dispbuf[k]];if(k==1) //加上数码管的dp小数点P0&=0x7f;delay_1ms();}}/************读ADC0832函数************///采集并返回unsigned int Adc0832(unsigned char channel) //AD转换,返回结果{uchar i=0;uchar j;uint dat=0;uchar ndat=0;if(channel==0)channel=2;if(channel==1)channel=3;ADDI=1;_nop_();_nop_();ADCS=0;//拉低CS端_nop_();_nop_();ADCLK=1;//拉高CLK端_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿1 _nop_();_nop_();ADCLK=1;//拉高CLK端ADDI=channel&0x1;_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿2 _nop_();_nop_();ADCLK=1;//拉高CLK端ADDI=(channel>>1)&0x1;_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束_nop_();_nop_();dat=0;for(i=0;i<8;i++){dat|=ADDO;//收数据ADCLK=1;_nop_();_nop_();ADCLK=0;//形成一次时钟脉冲_nop_();_nop_();dat<<=1;if(i==7)dat|=ADDO;}for(i=0;i<8;i++){j=0;j=j|ADDO;//收数据ADCLK=1;_nop_();_nop_();ADCLK=0;//形成一次时钟脉冲_nop_();_nop_();j=j<<7;ndat=ndat|j;if(i<7)ndat>>=1;}ADCS=1;//拉低CS端ADCLK=0;//拉低CLK端ADDO=1;//拉高数据端,回到初始状态dat<<=8;dat|=ndat;return(dat); //return ad k}void main(void){while(1){ unsigned int temp;float press;getdata=Adc0832(0);if(14<getdata<243) //当压力值介于15kpa到115kpa 之间时,遵循线性变换{int vary=getdata;//y=(115-15)/(243-13)*X+15kpapress=(*vary)+; //测试时补偿值为temp=(int)(press*10); //放大10倍,便于后面的计算dispbuf[3]=temp/1000; //取压力值百位dispbuf[2]=(temp%1000)/100; //取压力值十位dispbuf[1]=((temp%1000)%100)/10; //取压力值个位dispbuf[0]=((temp%1000)%100)%10; //取压力值十分位display();}}}。
传感器实训课程设计

传感器实训课程设计一、课程目标知识目标:1. 让学生理解传感器的基本原理,掌握不同类型传感器的功能、特点及应用场景。
2. 使学生掌握传感器实训操作流程,了解传感器在实际工程项目中的应用。
3. 帮助学生了解传感器技术在智能控制系统中的重要性,理解传感器与物联网技术的关系。
技能目标:1. 培养学生动手操作传感器的能力,能够独立完成传感器实训任务。
2. 培养学生分析传感器数据、处理传感器故障的能力,提高问题解决能力。
3. 培养学生团队协作能力,能够在小组项目中共同完成任务。
情感态度价值观目标:1. 激发学生对传感器技术的兴趣,提高学习积极性,培养科技创新意识。
2. 培养学生严谨的科学态度,养成良好的实验操作习惯。
3. 增强学生的环保意识,认识到传感器在节能减排方面的作用,培养学生的社会责任感。
课程性质:本课程为实践性课程,注重培养学生的动手能力和实际操作技能。
学生特点:学生具备一定的物理知识和电子技术基础,对传感器技术有一定了解,但实际操作经验不足。
教学要求:结合学生特点,课程设计应注重理论与实践相结合,充分调动学生的积极性,提高学生的实践操作能力。
在教学过程中,关注学生的个体差异,鼓励学生互相学习、共同进步。
通过课程学习,使学生达到上述课程目标,为后续相关课程和实际工作打下坚实基础。
二、教学内容本课程教学内容主要包括以下几部分:1. 传感器原理及分类:介绍传感器的基本原理,如光电效应、磁电效应等;讲解不同类型传感器,如温度传感器、湿度传感器、压力传感器等的工作原理和应用场景。
2. 传感器实训操作:详细讲解实训操作流程,包括传感器选型、安装、调试及数据采集等环节。
3. 传感器应用案例分析:结合教材案例,分析传感器在智能家居、工业自动化、环境监测等领域的应用。
4. 传感器与物联网技术:介绍传感器技术与物联网的关系,探讨传感器在物联网系统中的作用。
5. 传感器故障处理与数据分析:教授学生如何分析传感器数据,处理常见故障,提高传感器使用效果。
传感器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 <at89x51.h>//用A T89C51时就用这个头文件//#include <reg52.h>//用华邦W78E58B时必须用这个头文件#include <intrins.h>//注意那个LCD_Wait()函数,它是判"忙"标志的,在实际硬件要把注掉的那种打开//Port Definitions**********************************************************sbit LcdRs = P2^0;sbit LcdRw = P2^1;sbit LcdEn = P2^2;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//实际硬件时打开此语句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; _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){LCD_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_COMMAND,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)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 <at89x51.h>//用A T89C51时就用这个头文件//#include <reg52.h>//用华邦W78E58B时必须用这个头文件sbit DQ = P3^4; //定义DQ引脚为P3.4/***********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); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;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; i>0; 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 tt[2];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分辨率为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);tt[0]=ReadOneChar(); //读取温度值低位tt[1]=ReadOneChar(); //读取温度值高位return(tt);}LCD_18b20.c#include <at89x51.h>//用A T89C51时就用这个头文件//#include <reg52.h>//用华邦W78E58B时必须用这个头文件#include <absacc.h>#include <ctype.h>#include <math.h>#include <stdio.h>#include <string.h>#include <DS18B20.h>#include "LCD1602.h" ////液晶显示头文件//sbit DQ = P3^4; //定义DQ引脚为P3.4unsigned char t[2],*pt; //用来存放温度值,测温程序就是通过这个数组与主函unsigned char TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'};//显示实时温度,上电时显示+125.00Cunsigned char TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'};//显示温度上下限,上电时显示TH:+125 TL:+124Cunsigned char code dotcode[4]={0,25,50,75};/***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******再将表值分离出十位和个位后送到十分位和百分位********************/void covert0( unsigned char TH, unsigned char TL) //将温度上下限转换为LCD显示的数据{if(TH>0x7F) //判断正负,如果为负温,将其转化为其绝对值{TempBuffer0[3]=0x2d; //0x2d为"-"的ASCII码TH=~TH;TH++;}else TempBuffer0[3]=0x2b; //0x2B为"+"的ASCII码if(TL>0x7f){TempBuffer0[11]=0x2d; //0x2d为"-"的ASCII码TL=~TL+1;}else TempBuffer0[11]=0x2b; //0x2B为"+"的ASCII码TempBuffer0[4]=TH/100+0x30; //分离出TH的百十个位if( TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe; //百位数消隐TempBuffer0[5]=(TH%100)/10+0x30; //分离出十位TempBuffer0[6]=(TH%100)%10+0x30; //分离出个位TempBuffer0[12]=TL/100+0x30; //分离出TL的百十个位if( TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe; //百位数消隐TempBuffer0[13]=(TL%100)/10+0x30; //分离出十位TempBuffer0[14]=(TL%100)%10+0x30; //分离出个位}void covert1(void) //将温度转换为LCD显示的数据{unsigned char x=0x00,y=0x00;t[0]=*pt;t[1]=*pt;if(t[1]>0x07) //判断正负温度{TempBuffer1[0]=0x2d; //0x2d为"-"的ASCII码t[1]=~t[1]; /*下面几句把负数的补码*/t[0]=~t[0]; /* 换算成绝对值*********/x=t[0]+1; /***********************/t[0]=x; /***********************/if(x>255) /**********************/t[1]++; /*********************/}else TempBuffer1[0]=0x2b; //0xfe为变"+"的ASCII码t[1]<<=4; //将高字节左移4位t[1]=t[1]&0x70; //取出高字节的3个有效数字位x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它x>>=4; //右移4位x=x&0x0f; //和前面两句就是取出t[0]的高四位t[1]=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节TempBuffer1[1]=t[1]/100+0x30; //+0x30 为变0~9 ASCII码if( TempBuffer1[1]==0x30) TempBuffer1[1]=0xfe; //百位数消隐TempBuffer1[2]=(t[1]%100)/10+0x30; //分离出十位TempBuffer1[3]=(t[1]%100)%10+0x30; //分离出个位t[0]=t[0]&0x0c; //取有效的两位小数t[0]>>=2; //左移两位,以便查表x=t[0];y=dotcode[x]; //查表换算成实际的小数TempBuffer1[5]=y/10+0x30; //分离出十分位TempBuffer1[6]=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(); //第一个参数列号,第二个为行号,为0表示第一行//为1表示第二行,第三个参数为显示数据的首地址LCD_Print(0,0,TempBuffer0);LCD_Print(0,1,TempBuffer1);}}实验2:基于MPX4115传感器温度测量实验步骤:(1)在Proteus软件画出电路图(2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。
基于Proteus仿真技术在传感器教学中的应用

基于Proteus仿真技术在传感器教学中的应用近年来,随着物联网、工业互联网等领域的蓬勃发展,传感器技术成为信息采集、环境监测、智能控制等重要应用的基础。
在传感器教学中,学生需要通过理论课程的学习和实践操作的训练,了解传感器的基本原理和特点,掌握传感器的工作方式和信号处理方法,提高设计制作和应用调试的能力。
而基于Proteus仿真技术的传感器教学应用,可以为学生提供一个虚拟的实验平台,帮助学生更好地理解传感器的工作原理和应用方法,提高实践操作的效率和成功率。
首先,基于Proteus仿真技术的传感器教学应用,可以模拟真实的环境和设备,让学生在虚拟的实验场景中操作。
比如,对于温度传感器的应用,可以通过在Proteus中添加温度传感器模块、温度计和电路板等组成一个完整的测温电路,然后设置不同温度值的输入信号,模拟温度变化对传感器输出信号的影响。
学生可以通过仿真软件动态观察、控制温度变化和测量结果,直观了解温度传感器的精度、响应速度等性能指标。
其次,基于Proteus仿真技术的传感器教学应用,可以灵活调整实验参数和参数范围,帮助学生深入理解传感器的工作原理和性能规律。
比如,对于光敏电阻传感器的实验,可以通过调整光源强度、波长、角度和距离等参数,观察电阻值的变化和响应速度,探究光敏电阻的灵敏度、直线性、抗干扰等特性。
通过分析实验数据,学生可以从实验中收获深入的知识和经验,帮助他们更好地设计和调试传感器应用系统。
最后,基于Proteus仿真技术的传感器教学应用,具有操作简便、安全可靠、低成本等优点。
传感器仿真软件可以在不受时间、空间和设备限制的情况下进行实验,不仅可以降低实验成本和风险,还可以让学生自主探究、创新设计,开放思维,拓展技能。
另外,仿真软件的操作界面友好,操作步骤逻辑清晰,易于学生学习和掌握。
总之,基于Proteus仿真技术的传感器教学应用是一种理论和实践相结合的有效手段,可以为传感器教学提供一个拓展和深化的空间。
传感器proteus虚拟实验教学内容

传感器proteus虚拟实验教学内容传感器p r o t e u s虚拟实验《传感器原理与应用》实验指导书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()函数,它是判"忙"标志的,在实际硬件要把注掉的那种打开//PortDefinitions*************************************************** ******* sbit LcdRs = P2^0;sbit LcdRw = P2^1;sbit LcdEn = P2^2;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//实际硬件时打开此语句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; _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){LCD_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_COMMAND,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)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 = P3^4; //定义DQ引脚为P3.4/***********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); //精确延时大于 480usDQ = 1; //拉高总线delay_18B20(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;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; i>0; 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 tt[2];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分辨率为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);tt[0]=ReadOneChar(); //读取温度值低位tt[1]=ReadOneChar(); //读取温度值高位return(tt);}LCD_18b20.c#include //用AT89C51时就用这个头文件//#include //用华邦W78E58B时必须用这个头文件#include#include#include#include#include#include#include "LCD1602.h" ////液晶显示头文件//sbit DQ = P3^4; //定义DQ引脚为P3.4unsigned char t[2],*pt; //用来存放温度值,测温程序就是通过这个数组与主函数通信的unsigned char TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'};//显示实时温度,上电时显示+125.00Cunsigned char TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'};//显示温度上下限,上电时显示TH:+125 TL:+124Cunsigned char code dotcode[4]={0,25,50,75};/***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******再将表值分离出十位和个位后送到十分位和百分位********************/void covert0( unsigned char TH, unsigned char TL) //将温度上下限转换为LCD显示的数据{if(TH>0x7F) //判断正负,如果为负温,将其转化为其绝对值{TempBuffer0[3]=0x2d; //0x2d为"-"的ASCII码TH=~TH;TH++;}else TempBuffer0[3]=0x2b; //0x2B为"+"的ASCII码if(TL>0x7f){TempBuffer0[11]=0x2d; //0x2d为"-"的ASCII码TL=~TL+1;}else TempBuffer0[11]=0x2b; //0x2B为"+"的ASCII码TempBuffer0[4]=TH/100+0x30; //分离出TH的百十个位if( TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe; //百位数消隐TempBuffer0[5]=(TH%100)/10+0x30; //分离出十位TempBuffer0[6]=(TH%100)%10+0x30; //分离出个位TempBuffer0[12]=TL/100+0x30; //分离出TL的百十个位if( TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe; //百位数消隐TempBuffer0[13]=(TL%100)/10+0x30; //分离出十位TempBuffer0[14]=(TL%100)%10+0x30; //分离出个位} void covert1(void) //将温度转换为LCD显示的数据{unsigned char x=0x00,y=0x00;t[0]=*pt;pt++;t[1]=*pt;if(t[1]>0x07) //判断正负温度{TempBuffer1[0]=0x2d; //0x2d为"-"的ASCII码t[1]=~t[1]; /*下面几句把负数的补码*/t[0]=~t[0]; /* 换算成绝对值*********/x=t[0]+1; /***********************/t[0]=x; /***********************/if(x>255) /**********************/t[1]++; /*********************/}else TempBuffer1[0]=0x2b; //0xfe为变"+"的ASCII码t[1]<<=4; //将高字节左移4位t[1]=t[1]&0x70; //取出高字节的3个有效数字位x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它x>>=4; //右移4位x=x&0x0f; //和前面两句就是取出t[0]的高四位t[1]=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节TempBuffer1[1]=t[1]/100+0x30; //+0x30 为变 0~9 ASCII码if( TempBuffer1[1]==0x30) TempBuffer1[1]=0xfe; //百位数消隐TempBuffer1[2]=(t[1]%100)/10+0x30; //分离出十位TempBuffer1[3]=(t[1]%100)%10+0x30; //分离出个位t[0]=t[0]&0x0c; //取有效的两位小数t[0]>>=2; //左移两位,以便查表x=t[0];y=dotcode[x]; //查表换算成实际的小数TempBuffer1[5]=y/10+0x30; //分离出十分位TempBuffer1[6]=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(); //第一个参数列号,第二个为行号,为0表示第一行//为1表示第二行,第三个参数为显示数据的首地址LCD_Print(0,0,TempBuffer0);LCD_Print(0,1,TempBuffer1);}}实验2:基于MPX4115传感器温度测量实验步骤:(1)在Proteus软件画出电路图(2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
传感器p r o t e u s虚拟实验《传感器原理与应用》实验指导书Proteus-V1.0版本实验1:基于DS18B20传感器温度测量实验步骤:(1)在Proteus软件画出电路图(2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。
包括:2个头文件LCD1602.h和DS18B20.h; 1个源文件LCD_18b20.c;代码如下LCD1602.h:#include <at89x51.h>//用AT89C51时就用这个头文件//#include <reg52.h>//用华邦W78E58B时必须用这个头文件#include <intrins.h>//注意那个LCD_Wait()函数,它是判"忙"标志的,在实际硬件要把注掉的那种打开//PortDefinitions********************************************************** sbit LcdRs = P2^0;sbit LcdRw = P2^1;sbit LcdEn = P2^2;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//实际硬件时打开此语句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; _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){LCD_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_COMMAND,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)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 <at89x51.h>//用AT89C51时就用这个头文件//#include <reg52.h>//用华邦W78E58B时必须用这个头文件sbit DQ = P3^4; //定义DQ引脚为P3.4/***********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); //精确延时大于 480usDQ = 1; //拉高总线delay_18B20(14);x=DQ; //稍做延时后如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;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; i>0; 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 tt[2];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分辨率为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);tt[0]=ReadOneChar(); //读取温度值低位tt[1]=ReadOneChar(); //读取温度值高位return(tt);}LCD_18b20.c#include <at89x51.h>//用AT89C51时就用这个头文件//#include <reg52.h>//用华邦W78E58B时必须用这个头文件#include <absacc.h>#include <ctype.h>#include <math.h>#include <stdio.h>#include <string.h>#include <DS18B20.h>#include "LCD1602.h" ////液晶显示头文件//sbit DQ = P3^4; //定义DQ引脚为P3.4unsigned char t[2],*pt; //用来存放温度值,测温程序就是通过这个数组与主函数通信的unsigned char TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'};//显示实时温度,上电时显示+125.00Cunsigned char TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20, 0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'};//显示温度上下限,上电时显示TH:+125 TL:+124Cunsigned char code dotcode[4]={0,25,50,75};/***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******再将表值分离出十位和个位后送到十分位和百分位********************/void covert0( unsigned char TH, unsigned char TL) //将温度上下限转换为LCD显示的数据{if(TH>0x7F) //判断正负,如果为负温,将其转化为其绝对值{TempBuffer0[3]=0x2d; //0x2d为"-"的ASCII码TH=~TH;TH++;}else TempBuffer0[3]=0x2b; //0x2B为"+"的ASCII码if(TL>0x7f){TempBuffer0[11]=0x2d; //0x2d为"-"的ASCII码TL=~TL+1;}else TempBuffer0[11]=0x2b; //0x2B为"+"的ASCII码TempBuffer0[4]=TH/100+0x30; //分离出TH的百十个位 if( TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe; //百位数消隐TempBuffer0[5]=(TH%100)/10+0x30; //分离出十位 TempBuffer0[6]=(TH%100)%10+0x30; //分离出个位 TempBuffer0[12]=TL/100+0x30; //分离出TL的百十个位 if( TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe; //百位数消隐TempBuffer0[13]=(TL%100)/10+0x30; //分离出十位 TempBuffer0[14]=(TL%100)%10+0x30; //分离出个位}void covert1(void) //将温度转换为LCD显示的数据{unsigned char x=0x00,y=0x00;t[0]=*pt;pt++;t[1]=*pt;if(t[1]>0x07) //判断正负温度{TempBuffer1[0]=0x2d; //0x2d为"-"的ASCII码t[1]=~t[1]; /*下面几句把负数的补码*/t[0]=~t[0]; /* 换算成绝对值*********/x=t[0]+1; /***********************/t[0]=x; /***********************/if(x>255) /**********************/t[1]++; /*********************/}else TempBuffer1[0]=0x2b; //0xfe为变"+"的ASCII码t[1]<<=4; //将高字节左移4位t[1]=t[1]&0x70; //取出高字节的3个有效数字位x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它x>>=4; //右移4位x=x&0x0f; //和前面两句就是取出t[0]的高四位t[1]=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节TempBuffer1[1]=t[1]/100+0x30; //+0x30 为变 0~9 ASCII码if( TempBuffer1[1]==0x30) TempBuffer1[1]=0xfe; //百位数消隐TempBuffer1[2]=(t[1]%100)/10+0x30; //分离出十位TempBuffer1[3]=(t[1]%100)%10+0x30; //分离出个位t[0]=t[0]&0x0c; //取有效的两位小数t[0]>>=2; //左移两位,以便查表x=t[0];y=dotcode[x]; //查表换算成实际的小数TempBuffer1[5]=y/10+0x30; //分离出十分位TempBuffer1[6]=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(); //第一个参数列号,第二个为行号,为0表示第一行//为1表示第二行,第三个参数为显示数据的首地址LCD_Print(0,0,TempBuffer0);LCD_Print(0,1,TempBuffer1);}}实验2:基于MPX4115传感器温度测量实验步骤:(1)在Proteus软件画出电路图(2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。