DS18B20温度传感器测温通过数码管显示(上传)
18B20温度传感器数码管显示
南京航空航天大学金城学院课题任务报告题目一个单片机实现温度传感网络并用数码管显示的设计系部自动化系专业自动化学生姓名XXX 学号XXXXXX 指导教师XX 职称XX 毕设地点南京XXXX大学2013年12月14日课题任务书学生姓名XXX 学号XXXXXXX 系部自动化系题目一个单片机实现温度传感网络并用数码管显示的设计题目来源其他题目性质系统设计类别设计个人单篇内容解释:DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化,低功耗,高性能,抗干扰能力强,易配微处理器等优点,可直接将温度转化成数字信号处理器处理。
测量的温度范围是—55~125℃,测温误差0.5℃。
可编程分辨率9~12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃和0.0625℃。
相较热电偶传感器而言可实现高精度测温。
对热电偶温度传感器来说该项目实现的过程为:靠光敏电阻检测光照的大小,光的改变最终改变电阻的大小,给电阻外加一个电压,就改变了电压的大小,再用PCF8951AD转换器件检测电压的变化并转换为数字信号,再传到单片机上作一定的处理后去控制相应的数码管显示出当时的温度。
而对DS18B20来说过程则简单的多了,热电偶电阻传感器一直到单片机之前的部分都可以用一个DS18B20来代替了,真正的实现了数字化。
单片机后面的部分则两者是一样的!DS18B20与热电阻温度传感器相比价格上,来说要贵出很多!所以在温度的测量精度要求不是很高的话可以选择热电阻温度传感器,实验者应则情而定。
本实验由于就要用到一个DS18B20故此选用DS18B20!对于本次实验的的开发板,DS18B20测得温度数字信号后通过“一线总线”由J10或J48指针用单根杜邦线传输到单片机的P1.3口,P0口接到J3排针,P2.2和P2.3分别接到J2的锁存器。
由单片机内部微处理器处理后发到数码管作出相应的显示!实验步骤:实验之前先看本次实验的开发板(裸板)的样图。
DS18B20的传感器数码管显示的设计原理及程序
以下是原理图:以下是原理图的程序设计:#include <reg52.h>#include<math.h>#define uchar unsigned charsbit DQ=P1^6;unsigned char tempL=0;unsigned char tempH=0;unsigned int tempa;uchar display_data[4]={0};uchar flag_fu=0; //温度正负值标志位float temperature; //温度值void DS18_delay(int useconds)//延时函数{int s;for (s=0; s<useconds;s++);}unsigned char Init_DS18B20(void){unsigned char x=0;DQ=0; //发送复位脉冲DS18_delay(29); //延时(>480ms)DQ=1; //拉高数据线DS18_delay(3); //等待(15~60ms) 等待存在脉冲x=DQ; //获得存在信号(用于判断是否有器件)DS18_delay(25); // 等待时间隙结束return(x); //返回存在信号,0 = 器件存在, 1 = 无器件}ReadOneChar(void)//读一个字节{unsigned char i=0;unsigned char dat=0;for (i=8;i>0;i--){DQ=1;DS18_delay(1);DQ=0;dat>>=1;//复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值) DQ=1;if(DQ)dat|=0x80;DS18_delay(4);}return(dat);}WriteOneChar(unsigned char dat){unsigned char i=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;DS18_delay(5);DQ=1;dat>>=1;}DS18_delay(4);}unsigned int ReadTemperature(void){Init_DS18B20();WriteOneChar(0xcc);WriteOneChar(0x44);DS18_delay(125);Init_DS18B20();WriteOneChar(0xcc);WriteOneChar(0xbe);tempL=ReadOneChar();tempH=ReadOneChar();tempa=((tempH*256)+tempL);if(tempa&0x8000){tempa=~tempa;tempa+=1;flag_fu=1;}else{flag_fu=0;}//温度转换,把高低位做相应的运算转化为实际温度temperature=tempa*0.625*8;DS18_delay(200);return temperature ;}void display(){unsigned char code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x7f,0xff};P3=0x01;P2=dis[display_data[0]];DS18_delay(10);P3=0x02;P2=dis[display_data[1]];DS18_delay(10);P3=0x04;P2=dis[display_data[2]]+0x80;DS18_delay(10);P3=0x08;P2=dis[display_data[3]];DS18_delay(10);}void main(){unsigned int temp;uchar i;while(1){temp=ReadTemperature();if(flag_fu==0){ if(temp>=1000){display_data[0]=temp/1000;display_data[1]=(temp/100)%10;display_data[2]=(temp/10)%10;display_data[3]=temp%10;}else if(temp>=100){display_data[0]=12;display_data[1]=temp/100;display_data[2]=(temp%100)/10;display_data[3]=temp%10;}else{ display_data[0]=12;display_data[1]=12;display_data[2]=temp/10;display_data[3]=temp%10;}}else{ if(abs(temp)>100){display_data[0]=10;display_data[1]=abs(temp)/100;display_data[2]=(abs(temp)%100)/10;display_data[3]=abs(temp)%10;}else{display_data[0]=12;display_data[1]=10;display_data[2]=abs(temp)/10;display_data[3]=abs(temp)%10;}}for(i=0;i<250;i++)display();}}。
DS18B20的工作原理
DS18B20的工作原理DS18B20是一种数字温度传感器,具有高精度和数字输出的特点。
它采用一线通信协议,可以直接与微控制器通信,广泛应用于温度监测领域。
本文将详细介绍DS18B20的工作原理。
一、温度测量原理1.1 DS18B20采用数字式温度传感器芯片,内部集成了温度传感器和ADC转换器,能够直接输出数字信号。
1.2 DS18B20的温度传感器采用特殊的材料,随温度的变化而改变其电阻值,通过ADC转换器将电阻值转换为数字信号。
1.3 DS18B20的数字输出信号经过微处理器处理后,可以直接显示温度数值或者通过串口通信传输到其他设备。
二、通信协议2.1 DS18B20采用一线通信协议,只需一根数据线即可与微控制器通信,简化了连接方式。
2.2 通信协议中包括初始化、发送命令、读取数据等步骤,确保数据的准确传输。
2.3 通过一线通信协议,DS18B20可以实现多个传感器的串联连接,方便实现多点温度监测。
三、精度和分辨率3.1 DS18B20具有高精度的温度测量能力,温度测量误差仅为±0.5℃。
3.2 DS18B20的分辨率可调节,最高可达12位,能够满足不同应用场景的需求。
3.3 高精度和可调节的分辨率使得DS18B20在工业控制、医疗设备等领域得到广泛应用。
四、工作电压和功耗4.1 DS18B20的工作电压范围广泛,可在3V至5.5V之间工作,适用于不同的电源供应环境。
4.2 DS18B20的功耗较低,工作电流仅为1mA左右,可以节省能源。
4.3 低功耗和广泛的工作电压范围使得DS18B20适用于电池供电或者低功耗设备。
五、应用领域5.1 DS18B20广泛应用于温度监测系统、气象站、医疗设备等领域。
5.2 DS18B20的高精度和数字输出特点使得其在工业控制、实验室研究等领域得到广泛应用。
5.3 DS18B20的一线通信协议和低功耗特点使得其在移动设备、智能家居等领域具有广阔的应用前景。
ds18b20数码管显示温度
#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit w1=P2^4;sbit w2=P2^5;sbit w3=P2^6;sbit w4=P2^7;sbit DQ=P3^7;uint temp;float f_temp; //温度值variable of temperaturebit flag;uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef };//uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0x4f,0x79,0x24,0x70,0x19,0x12,0x02,0x78,0x00,0x10};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command {uint i;DQ = 0; //单片机拉低总线i=70;while(i>0)i--;DQ = 1; //释放总线,即拉高了总线i=4;while(i>0)i--;}bit Read_One_bit() //读取一个字节的数据read a byte date//读数据时,数据以字节的最低有效位先从总线移出{uint i;bit dat;DQ=0;i++;DQ=1;i++;i++;dat=DQ;i=3;while(i>0)i--;return (dat);}uchar Read_One_Byte(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=Read_One_bit();dat=(j<<7)|(dat>>1);}return (dat);}void Write_One_Byte(uchar dat){uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){DQ=0;i++;i++;DQ=1;i=5;while(i>0)i--;}else{DQ=0;i=5;while(i>0)i--;DQ=1;i++;i++;}}}void tmpchange(void){uchar f;Init_Ds18b20();f=70;while(f>0)f--;delay(1);Write_One_Byte(0xcc); //忽略ROM指令Write_One_Byte(0x44); //温度转换指令}uint Get_Tmp() //获取温度get the temperature{uchar a,b,f;Init_Ds18b20(); //初始化f=70;while(f>0)f--;Write_One_Byte(0xcc); //忽略ROM指令Write_One_Byte(0xbe); //温度转换指令a = Read_One_Byte(); //读取到的第一个字节为温度LSBb = Read_One_Byte(); //读取到的第一个字节为温度MSBtemp = b; //先把高八位有效数据赋于temptemp <<= 8; //把以上8位数据从temp低八位移到高八位temp = temp|a; //两字节合成一个整型变量f_temp = temp*0.0625; //temp = f_temp*10+0.5; //放大十倍f_temp=f_temp+0.5; // //同时进行一个四舍五入操作。
C51单片机DS18B20-数码管显示-温度传感器
DQ = 0; //MCU拉低
nops(); //调用_nop_()延时函数要多一些时间,延时1.085+0.235 = 1.32us,数据手册规定大于1us
DQ = dat&0x01;//从低位到高位发送 ,要在15us之前将数据送到总线上
#include <reg52.h>
#include <intrins.h>
#include "def.h"
#define nops(); {_nop_(),_nop_();}
code uchar num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
void WriteByte(uchar dat)//写0或写1共用此函数
{
uchar i;
for(i=0;i<8;i++)// 00000 001,分别写1位的时序
{ // 0000 0000
DQ = 1; //起始状态总线为高
}
/*****************************读一个字节*******************************/
uchar ReadByet()
{
uchar i;
uchar dat = 0;
for(i=0;i<8;i++) //分别读1位的时序
{
DQ = 1; //起始
dat |= 0x01<<i;//最先发送过来的是低位数据
}
delay10us(6); //延时60us,其中包括发送两个时间之间所需的时间间隔
ds18b20测温度数码管显示
#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char//-------函数声明-------void init();void disp();void delay(uint x);void delayms(uint x);uchar rst_ds18b20();void write_byte(uchar com);uchar read_byte();void read_temperature();void calculate_temperature();uchar code table[] = {0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0xA7,0xFF,0xEF,0xC0,0x00}; uchar code bitsel[] = {0x7f,0xbf,0xdf,0xef};uchar smg[4];sbit DQ=P1^0;sbit led=P1^5;uchar ready;bit ds18b20_is_ok;uchar temperature_value[2];//-----------主函数-----------void main(){init();while(1){if(ready == 0){led = 0;}read_temperature();if(ds18b20_is_ok == 1){calculate_temperature();// rst_ds18b20();}}}//-------------初始化--------------void init(){rst_ds18b20();TMOD = 0x01;TH0 = (65536-5000)/256;TL0 = (65536-5000)%256;EA = 1;ET0 = 1;TR0 = 1;}//-------------显示函数-------------void disp(){uchar i;if(i == 1){P0 = table[smg[i]];}else{P0 = table[smg[i]] & 0x7f;}P2 = bitsel[i];i++;if( i == 4 ){i = 0;}}//------------定时计数器0中断------------ void timer0() interrupt 1{TH0 = (65536-5000)/256;TL0 = (65536-5000)%256;disp();}//--------------延时大约1ms---------------- void delayms(uint x)uchar i;while(x--){for(i=0;i<120;i++);}}//-----------------大约延时9us---------------------- void delay(uint x){while(--x);}//----------------DS18B20复位------------------- uchar rst_ds18b20(){DQ=0;delay(60);DQ=1;delay(8);ready=DQ;delay(30);DQ=1;return ready;}//------------------写一字节--------------------- void write_byte(uchar com){uchar i;for(i=0;i<8;i++){DQ=0;DQ=com&0x01;delay(5);DQ=1;com>>=1;}delay(5);}//----------------读一字节------------------------- uchar read_byte()uchar i,value=0;for(i=0;i<8;i++){value>>=1;DQ=0;DQ=1;delay(1);if(DQ==1){value|=0x80;}delay(6);}return value;}//-------------------读暂存器-----------------------void read_temperature(){if(ready==0){rst_ds18b20();write_byte(0xcc);write_byte(0x44);delayms(750);rst_ds18b20();write_byte(0xcc);write_byte(0xbe);temperature_value[0]=read_byte();temperature_value[1]=read_byte();rst_ds18b20();ds18b20_is_ok=1;}else{ds18b20_is_ok=0;}}//-------------------------计算温度值-------------------------- void calculate_temperature(){uint temperature;uchar flag;temperature=temperature_value[1]*256+temperature_value[0];if(temperature_value[1]>0xf8){temperature=~temperature+1;flag=10;}else{flag = 11;}temperature=temperature*0.625;smg[0] = temperature%10;smg[1] = temperature/10%10;smg[2] = temperature/100%10;smg[3] = flag;}。
18b20测温数码管显示实验--精确到小数点后4位
18b20测温数码管显示实验--精确到小数点后4位//滑国虎于09.9.20完成////DS18B20的读写程序,数据脚P1.5 ////温度传感器18B20程序,采用器件默认的12位转化 ////最大转化时间750微秒,显示温度-55到+125度,显示精度 // //为0.1度,显示采用4位LED共阳显示测温值 ////P0口为段码输入,P27~P21为位选 ///***************************************************/#include "reg51.h"#include "intrins.h" //_nop_();延时函数用 #define Disdata P0 //段码输出口 #define discan P2 //扫描口 #define uchar unsigned char #define uint unsigned intsbit DQ=P1^5; //温度输入口 sbit DIN=P0^7; //LED小数点控制 uint h;uint temp;//uchar codedis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x bf};//共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮""-"uchar code scan_con[7]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd}; //列扫描控制字uchar data temp_data[2]={0x00,0x00}; //读出温度暂放 uchar data display[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用/*****************11us延时函数*************************///void delay(uint t) //11us{for (;t>0;t--);}///****************DS18B20复位函数************************/ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;delay(50); //550 usDQ=1;delay(6); //66 uspresence=DQ; //presence=0 复位成功,继续下一步}delay(45); //延时500 uspresence=~DQ;}DQ=1; //拉高电平 }/****************DS18B20写命令函数************************/ //向1-WIRE 总线上写1个字节void write_byte(uchar val){uchar i;for(i=8;i>0;i--){DQ=1;_nop_();_nop_(); //从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 usDQ=val&0x01; //最低位移出delay(6); //66 usval=val/2; //右移1位}DQ=1;delay(1);}/****************DS18B20读1字节函数************************/ //从总线上取1个字节uchar read_byte(void){uchar i;uchar value=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 usDQ=1;_nop_();_nop_();_nop_();_nop_(); //4 usif(DQ)value|=0x80;delay(6); //66 us}DQ=1;return(value);}/****************显示扫描函数***************************/ scan(){char k;for(k=0;k<7;k++) //4位LED扫描控制{Disdata=dis_7[display[k]]; //数据显示 P0if (k==2){DIN=0;} //小数点显示 P0.7discan=scan_con[k]; //位选 P2delay(150);discan=0xff;}}/****************读出温度函数************************/ //read_temp(){ow_reset(); //总线复位delay(200);write_byte(0xcc); //发命令write_byte(0x44); //发转换命令ow_reset();delay(1);write_byte(0xcc); //发命令write_byte(0xbe);temp_data[0]=read_byte(); //读温度值的低字节temp_data[1]=read_byte(); //读温度值的高字节temp=temp_data[1];temp=temp&0x0f; //去掉符号位temp=temp<<8; //temp为16位temp=temp|temp_data[0]; // 两字节合成一个整型变量。
DS18B20温度检测仪表(数码管显示)doc资料
目录第1章绪论 (1)1.1 选题目的 (1)1.2 设计要求 (1)第2章电路结构及工作原理 (2)2.1 电路方框图 (2)2.1.1 电路图 (2)2.1.2 系统流程 (3)2.2芯片介绍 (5)2.2.1 DS18B20 (5)2.2.1.1 DS18B20的工作原理 (5)2.2.1.2 DS18B20的使用方法 (6)2.2.2 AT89C51 (8)2.2.2.1 AT89C51简介 (8)第3章整机工作原理 (10)第4章系统调试与分析 (12)4.1 系统的调试 (12)4.2系统的分析 (12)结论 (13)收获和体会 (14)致谢 (15)参考文献 (16)附录一元件清单 (17)课程设计任务书年月日第1章绪论1.1 选题目的随着人们生活水平的不断提高,单片机技术已经普及到我们生活,工作,科研等各个领域。
单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本文利用单片机结合传感器技术开发设计,把传感器理论与单片机实际应用有机结合,详细地讲述了利用温度传感器DS18B20测量环境温度,设置上下报警温度,当温度不在设置范围内是,可以报警。
同时51单片机在现代电子产品中广泛应用以及其技术已经非常成熟,DS18B20可以直接读出被测温度值,而且采用一线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。
1.2 设计要求(1)设计题目和设计指标测量温度范围为0-100℃。
并通过数码管显示(2)设计功能利用DS18B20实现温度采集,并用数码管显示第2章 电路结构及工作原理2.1 电路方框图图2-1 电路方框图2.1.1 电路图2.1.2 系统流程图2-3 读DS18B20的子程序图2-4 读转换温度子程序2.2芯片介绍2.2.1 DS18B202.2.1.1 DS18B20的工作原理当DS18B20接收到温度转换命令后,开始启动转换。
ds18b20工作原理
ds18b20工作原理DS18B20是一种数字温度传感器,它可以通过一根数据线进行温度的采集和传输。
DS18B20工作原理的核心是利用温度对半导体材料电阻的影响来实现温度的测量。
接下来,我们将详细介绍DS18B20的工作原理。
首先,DS18B20内部包含了一个温度传感器芯片,该芯片采用了数字信号输出的方式。
在DS18B20内部,有一个模拟-数字转换器(ADC),它可以将模拟信号转换为数字信号。
当DS18B20受到温度的影响时,芯片内部的电阻会发生变化,进而改变了电压信号的大小。
ADC会将这个模拟信号转换为数字信号,然后通过数据线输出给外部设备。
其次,DS18B20采用了一种叫做“单总线”(One Wire)的通信协议。
这意味着DS18B20只需要一根数据线就可以完成温度的采集和传输。
在通信过程中,DS18B20会将温度数据以数字信号的形式发送给外部设备。
外部设备可以通过读取数据线上的数字信号来获取温度信息。
此外,DS18B20还具有一些特殊的功能,比如温度的精度调节、温度报警功能等。
通过这些功能,DS18B20可以满足不同场景下的温度监测需求。
总的来说,DS18B20的工作原理是基于半导体材料电阻随温度变化的特性,利用ADC将模拟信号转换为数字信号,并通过单总线通信协议将温度数据传输给外部设备。
同时,DS18B20还具有一些特殊的功能,可以满足不同场景下的温度监测需求。
在实际应用中,DS18B20被广泛应用于各种温度监测系统中,比如智能家居、工业自动化等领域。
由于其简单、稳定、精准的特点,DS18B20在温度监测领域具有很高的性价比,受到了广泛的认可和应用。
综上所述,DS18B20是一种基于半导体材料电阻特性的数字温度传感器,其工作原理是通过ADC将模拟信号转换为数字信号,并通过单总线通信协议将温度数据传输给外部设备。
在实际应用中,DS18B20具有简单、稳定、精准的特点,被广泛应用于各种温度监测系统中。
用DS18B20测量室温并在数码管上显示
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
}
}
if(temper & BIT9)
{
dN[4] += 2;
dN[5] += 3;
if(dN[4] >= 10)
{
dN[4] -= 10;
码管位选变量
uchar cnt = 2;
void Disp_Numb(uint temper);
/****************主函数****************/
void main(void)
{
uchar i;
WDTCTL=WDTPW+WDTHOLD;
/*************************************************
程序功能:用DS18B20测量室温并在数码管上显示。
-------------------------------------------------
测试说明:观察显示温度数值。
*************************************************/
功 能:看门狗定时器中断服务函数,进行数码
管动态扫描
参 数:无
返回值 :无
********************************************/
#pragma vector = WDT_VECTOR
ds18b20的显示程序,数码管显示
开机时对DS18B20进行检测,如果DS18B20检测不正常,蜂鸣器报警,关闭显示。
采用6位数码管显示-用4位数码管显示温度值,2位数码管显示符号。
数码管显示格式:100.8 °C如果温度值高位为0,将不显示出来。
#includesbit DQ = P3^3; //定义DS18B20端口DQsbit BEEP=P3^7 ;unsigned char presence ;unsigned char code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0xff};unsigned char data temp_data[2] = {0x00,0x00};unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00};unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};void beep();sbit DIN = P0^7; //小数点bit flash=0; //显示开关标记/**********************************************************/void Delay(unsigned int num)//延时函数{while( --num );}/**********************************************************/Init_DS18B20(void)//初始化ds1820{DQ = 1; //DQ复位Delay(8); //稍做延时DQ = 0; //单片机将DQ拉低Delay(90); //精确延时大于 480usDQ = 1; //拉高总线Delay(8);presence = DQ; //如果=0则初始化成功 =1则初始化失败Delay(100);DQ = 1;return(presence); //返回信号,0=presence,1= no presence}/**********************************************************/ 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(4);}return (dat);}/**********************************************************/ WriteOneChar(unsigned char dat)//写一个字节{unsigned char i = 0;for (i = 8; i > 0; i--){DQ = 0;DQ = dat&0x01;Delay(5);DQ = 1;dat>>=1;}}/*********************************************************/Read_Temperature(void)//读取温度{Init_DS18B20();if(presence==1){ beep();flash=1;} //DS18B20不正常,蜂鸣器报警else{flash=0;WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器temp_data[0] = ReadOneChar(); //温度低8位temp_data[1] = ReadOneChar(); //温度高8位}}/*********************************************************/ Disp_Temperature()//显示温度{unsigned char n=0;display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]; //查表得小数位的值display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); display[3]=display[4]/100;display[1]=display[4]%100;display[2]=display[1]/10;display[1]=display[1]%10;if(!display[3]) //高位为0,不显示{display[3]=0x0a;if(!display[2]) //次高位为0,不显示display[2]=0x0a;}P0 = 0xc6; //显示 CP2 = 0x7f;P0 = 0x9c; //显示°P2 = 0xbf;Delay(300);P0 =LEDData[display[0]] ; //显示小数位P2 = 0xdf;Delay(300);P0 =LEDData[display[1]]; //显示个位DIN = 0;P2 = 0xef;Delay(300);P0 =LEDData[display[2]]; //显示十位P2 = 0xf7;Delay(300);P0 =LEDData[display[3]]; //显示十位P2 = 0xfb;Delay(300);P2 = 0xff; //关闭显示}/*********************************************************/ void beep(){unsigned char i;for (i=0;i<100;i++){Delay(60);BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器}/*********************************************************/ void main(void){while(1){Read_Temperature();{Disp_Temperature();}else P2 = 0xff ; //DS18B20不正常,关闭显示}}。
DS18B20的工作原理
DS18B20的工作原理DS18B20是一种数字温度传感器,采用单总线接口进行通信。
它可以精确测量环境温度,并将温度值以数字形式传输给微控制器或其他设备。
DS18B20是一种广泛应用于工业自动化、家用电器、医疗设备等领域的温度传感器。
DS18B20的工作原理如下:1. 温度测量原理:DS18B20采用了基于半导体的温度测量原理。
它内部集成了温度传感器和模数转换器(ADC),可以将环境温度转换为数字信号。
DS18B20使用的是温度依赖的电阻器件,称为温度传感器。
当温度升高时,温度传感器的电阻值会发生变化,DS18B20利用这种变化来测量温度。
2. 单总线通信:DS18B20采用了单总线通信协议,即通过单根数据线进行数据传输。
这种通信方式简化了连接和控制的复杂性,只需使用一个引脚即可实现数据的传输和控制。
在单总线通信中,DS18B20作为从设备,由主控制器发出指令,DS18B20接收指令并返回温度数据。
3. 工作原理:DS18B20的工作原理可以分为三个步骤:初始化、温度转换和读取温度。
3.1 初始化:在通信开始前,主控制器需要发送初始化指令来识别和准备DS18B20。
初始化指令包括发送复位脉冲和读取DS18B20的存在脉冲。
复位脉冲使DS18B20进入准备接收指令的状态,存在脉冲用于检测DS18B20是否存在于总线上。
3.2 温度转换:初始化完成后,主控制器发送温度转换指令给DS18B20。
温度转换指令包括启动温度转换和等待转换完成。
DS18B20接收到指令后,开始测量环境温度,并将结果存储在内部寄存器中。
温度转换时间取决于DS18B20的分辨率设置,一般为750ms到12秒不等。
3.3 读取温度:温度转换完成后,主控制器发送读取温度指令给DS18B20。
DS18B20将温度值以数字形式传输给主控制器。
主控制器接收到温度数据后,可以进行进一步的处理和显示。
4. 分辨率设置:DS18B20支持多种温度分辨率设置,包括9位、10位、11位和12位。
DS18B20温度传感器测温通过数码管显示(上传)
DS18B20温度传感器测温通过数码管显示(详尽版)/*-----------------------------------------------名称:DS18B20温度传感器数码管显示编写:JR日期:2017.12修改:无内容:利用DS18B20温度传感器测量温度-40~+100℃,通过数码管显示单片机开发板使用“金容电子(https:///item.htm?id=544540401703)”开发的JR51单片机开发板。
------------------------------------------------*/#include<reg52.h>#include<stdio.h>#include<intrins.h>#include"delayus.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P2^2; //温度传感器信号线sbit dula=P2^6; //数码管段选线sbit wela=P2^7; //数码管位选线sbit beep=P2^3; //数码管位选线uint temper;uchar a1,a2,a3,a4,a5,n;uint aaa,num;uint warn_l=3000; //低温-40℃报警,测试温度乘以100uint warn_h=10000; //高温100℃报警,测试温度乘以100float ttt;void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5);const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//不带小数点0-9编码const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点0-9编码uchar data temp_data[2]={0x00,0x00}; //读出温度暂放void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*******************************************************************18B20复位初始化函数1、将数据线拉高到12、延时2us(该时间要求不是很严格,但是要尽可能短一点)3、将数据线拉低到04、延时750us(该时间范围可以在480~960us)5、将数据线拉高到16、延时等待(70us),如果初始化成功则在15~60us内产生一个由18B20返回的低电平0,据该状态可以确定它的存在。
DS18B20-温度传感器
系统方案框图
• 系统方案框图
DS18B20与单片机接口电路设计
知识回顾 Knowledge Review
祝您成功!
• 方案采用STC89C52八位单片机实现。单片机 软件编程的自由度大,可通过编程实现各种 各样的算术算法和逻辑控制。而且体积小, 硬件实现简单,安装方便。既可以单独对多 DS18B20控制工作,还可以与PC机通信.运用 主从分布式思想,由一台上位机(PC机), 下位机(单片机)多点温度数据采集,组成 两级分布式多点温度测量的巡回检测系统,实 现远程控制。另外STC89C52在工业控制上也 有着广泛的应用,编程技术及外围功能电路 的配合使用都很成熟。
• DS18B20内部结构及功能
• DS18B20采用3脚PR—35封装或8脚SOIC封 装,其内部结构主要包括:寄生电源,温度 传感器,64位ROM和单总线接口,存放中间 数据的高速暂存器RAM,用于存储用户设定 温度上下限值的TH和TL触发器,存储与控制 逻辑,8位循环冗余校验码(CRC)发生器 等7部分。
DS18B20内部结构图
DS18B20的测温原理
• 低温度系数振荡器的振荡频率受温度影响很 小,用于产生固定频率的脉冲信号送给减法 计数器1;高温度系数振荡器随温度变化其 振荡频率明显改变,所产生的信号作为减法 计数器2的脉冲输入。当计数门打开 时,DS18B20就对低温度系数振荡器产生的 时钟脉冲进行计数,进而完成温度测量。
• 下位机采用的是STC89C52单片机基于数字 温度传感器DS18B20的系统。由于 STC89C52可以带多个DSB1820,因此可以 非常容易实现多点测量.轻松的组建传感器
网络,并且单片机可以同时进行数码显示 与键盘控制,也可以通过RS232串口与上 位机(PC机)进行数据通讯,达到全方位 立体监控的效果。
DS18B20温度传感器和数码管显示例程
//DS18B20温度传感器和数码管显示//编程时间:连线表: CPU=stc89C52 SysClock=12MHz// LEDLE= 控制位高电平有效 LEDSEG=P2 KEYBOARD=P3 LEDWEI=,LED高到底//**********************************************************//DS18B20//**********************************************************//连线表: CPU=stc89C52 SysClock=12MHz *//单总线: TMDAT=////**********************************************************#include <>#define uchar unsigned char#define uint unsigned intuchar discount=0;//显示扫描位计数uchar last=0;//最终温度值uchar itcount=0x13;//定时器延时计数uchar seg[4];//数码管显示暂存uchar tem[2];//读取温度暂存uchar flag=0;//温度正负标志位/********************LED引脚定义********************/sfr LEDSEG=0x80;//P2sfr LEDWEI=0xA0;//P3/********************DS18B20引脚定义********************/sbit TMDAT=P1^0; //温度传感器数据位/********************DS18B20函数定义*******************/void dmsec(uint count);//延时(count)毫秒void tmreset(void); //产生复位信号void tmpre(void); //检测器件应答信号bit tmrbit(void); //从总线读一个bituchar tmrbyte(void); //从总线读一个字节void mwbyte(uchar dat);//向总线写一个字节void tmstart(void); //启动一次温度转换uchar tmrtemp(void); //读取温度数据/********************LED函数定义*******************/uchar * uchartodectoseg(uchar unm);//字符转换为十进制然后转换为数码管段表void disp(uchar *seg);//显示函数void delay_ms(uint t); //延时函数/************************************************/uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0xc6};/*************数码表*******0 1 2 3 4 5 6 7 8 9 无显示 C**************/ /************************************************/uchar * uchartodectoseg(uchar unm){uchar x00,xx,x0,x,n;x00=unm/100;//取百位xx=unm%100;//取余x0=xx/10;//取十位x=xx%10;//取余即取个位n=0;seg[n]=table[x00];n++;seg[n]=table[x0];n++;seg[n]=table[x];n++;seg[n]=table[11];//最后一位显示摄氏度符号Cif(flag==1)seg[0]=0x40;//显示负号‘-’if(seg[0]==table[0])seg[0]=table[10]; //如果百位为零则不显示if((seg[0]==table[0])&(seg[1]==table[0]))seg[1]=table[10];//如果百位为零且十位为零则十位不显示return seg;}/***************************************************/ /******DELAY***************************/void delay_ms(uint t){uint m,n;for(m=0;m<t;m++){for(n=0;n<950;n++);}}/******************************************//*********************显示LEDSEG*****************************/void disp(uchar *seg){uchar wei[]={0x08,0x04,0x02,0x01};//位扫描码//LEDSEG=seg[10];LEDWEI =wei[discount];LEDSEG = seg[discount];delay_ms(1);discount++;if(discount==4){ delay_ms(1);discount=0;//LEDSEG=seg[10];LEDWEI=wei[discount];LEDSEG=seg[discount];}//检测是否扫描完,扫描完的话则重新置初值}/*********************************************************//*****************DS18B20函数体定义****************/void dmsec(uint count) {uint i;while(count--){for(i=0;i<125;i++){} }}void tmreset(void){uint i;TMDAT=0;i=103;while(i>0) i--;TMDAT=1;i=4;while(i>0) i--;}void tmpre(void){uint i;while(TMDAT);while(~TMDAT);i=4;while(i>0) i--;}bit tmrbit(void){uint i;bit dat;TMDAT=0;i++;TMDAT=1;i++;i++;dat=TMDAT;i=8;while(i>0) i--;return(dat);}uchar tmrbyte(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){ j=tmrbit();dat=(j<<7)|(dat>>1); }return(dat);}void tmwbyte(uchar dat) {uint i;uchar j;bit testb;for(j=1;j<=8;j++){ testb=dat & 0x01; dat=dat>>1;if(testb){ TMDAT=0;i++; i++;TMDAT=1;i=8;while(i>0) i--; }else{ TMDAT=0;i=8;while(i>0) i--; TMDAT=1;i++; i++;}}}void tmstart(void){tmreset();tmpre();dmsec(1);tmwbyte(0xcc);tmwbyte(0x44);}uchar tmrtemp(void){uchar y1,y2,y3;tmreset();tmpre();dmsec(1);tmwbyte(0xcc);tmwbyte(0xbe);tem[0]=tmrbyte();tem[1]=tmrbyte();if(tem[1]>127){tem[1]=(255-tem[1]);tem[0]=(255-tem[0]);flag=1;} //负温度求补码y1=tem[0]>>4;y2=tem[1]<<4;y3=y1|y2;return(y3);}/*********************************************************/void main(){TMOD=0X01;TL0=0XB0;TH0=0X3C;EA=1;ET0=1;TR0=1;dmsec(1);tmstart();while(1){uchartodectoseg(last);disp(seg);}}void time0() interrupt 1{TL0=0XB0;TH0=0X3C;//定时50msitcount--;if(itcount==0){last=tmrtemp();dmsec(1);tmstart();itcount=0x13;}}。
DS-18B20 数字温度传感器的工作原理
DS-18B20 数字温度传感器的工作原理DS-18B20数字温度传感器是一款运用广泛的数字温度传感器,主要应用于电子设备、工业自动化、气象仪器等领域。
该传感器采用精密的数字信号转换技术,能够提供高精度、高分辨率、低功耗的温度测量功能,因此得到了广泛的应用。
传感器的工作原理DS-18B20数字温度传感器采用的是单总线接口通信方式,通过数据总线来传输信息。
该传感器内部包含了一个精密的温度感应单元和一个数字转换部分,可将感应到的温度信号转换成数字信号。
传感器采用封装方式,并通过三根引脚连接到电路板上,其中VCC和GND是供电引脚,DQ是数据引脚。
当传感器被连接到系统中后,它会自动进行初始化,同时会向系统发送一个信号,以表明它的存在。
此时系统会给传感器发送一条读取温度的指令,传感器会将温度数据转换为数字信号并通过数据总线发送给系统。
系统接收到数字信号后,会进行处理并将其显示出来。
传感器的特点1. 高精度:DS-18B20数字温度传感器采用先进的传感技术,具有高精度的温度测量能力,允许用户在一定范围内进行精确的温度测量。
2. 单总线接口:传感器采用单总线接口通信方式,使得传感器的连接变得更加方便和简单,同时能够有效减少电路板上的布线。
3. 拉终端:传感器采用拉终端设计,可以有效地抵制信号干扰,提高了传感器的信号稳定性。
4. 容错性强:传感器具有较强的容错能力,在数据总线受到浪涌等干扰时,仍然能够正常工作。
5. 工作电流低:传感器采用低功耗设计,在工作过程中,能够将功耗降到最低限度,从而在节省能源的同时减轻热量输出。
1. 家电电子:DS-18B20数字温度传感器可用于家用电器中,如空调、冰箱、洗衣机等,实现精确的温度控制和监测。
2. 工业控制:传感器可应用于各种工业自动化设备中,实现温度测量和控制,保证产品的质量。
3. 汽车电子:传感器可应用于汽车电子中,如电动汽车电池组的温度监测,以及检测发动机温度等,确保汽车安全运行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS18B20温度传感器测温通过数码管显示(详尽版)/*-----------------------------------------------名称:DS18B20温度传感器数码管显示编写:JR日期:2017.12修改:无内容:利用DS18B20温度传感器测量温度-40~+100℃,通过数码管显示单片机开发板使用“金容电子(https:///item.htm?id=544540401703)”开发的JR51单片机开发板。
------------------------------------------------*/#include<reg52.h>#include<stdio.h>#include<intrins.h>#include"delayus.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P2^2; //温度传感器信号线sbit dula=P2^6; //数码管段选线sbit wela=P2^7; //数码管位选线sbit beep=P2^3; //数码管位选线uint temper;uchar a1,a2,a3,a4,a5,n;uint aaa,num;uint warn_l=3000; //低温-40℃报警,测试温度乘以100uint warn_h=10000; //高温100℃报警,测试温度乘以100float ttt;void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5);const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//不带小数点0-9编码const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点0-9编码uchar data temp_data[2]={0x00,0x00}; //读出温度暂放void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*******************************************************************18B20复位初始化函数1、将数据线拉高到12、延时2us(该时间要求不是很严格,但是要尽可能短一点)3、将数据线拉低到04、延时750us(该时间范围可以在480~960us)5、将数据线拉高到16、延时等待(70us),如果初始化成功则在15~60us内产生一个由18B20返回的低电平0,据该状态可以确定它的存在。
但是应注意,不能无限的等待,不然会使程序进入死循环,所以要进行超时判断。
7、若CPU读到数据线上的低电平0后,还要进行延时,其延时时间从发出高电平算起(第5步的时间算起最少要480us)。
8、将数据线再次拉高到1后结束**********************************************************************/void dsreset(){uchar st=1;DQ=1; //拉高数据线_nop_();_nop_();while(st){DQ=0; //控制器向DS18B20发低电平脉冲delayus(81); //延时750us左右DQ=1; ////控制器拉高总线delay70us(); //延时70usif(DQ==1)st=1;elsest=0;delayus(54); //延时500us等待}}/*******************************************************************向DS18B20写一个字节函数1、将数据线置低电平02、延时15us3、按从低位到高位的顺序发送数据(一次只发送一位)4、延时45us5、将数据线拉高到16、重复1~5步骤,直到发送完整个字节7、最后将数据线拉高到1**********************************************************************/void tempwritebyte(uchar date){uchar i,temp;DQ=1; //因为写之前需要置0,所以先置为高电平_nop_();_nop_();for(i=8;i>0;i--) //一位一位的写{temp=date&0x01; //取数据最低位DQ=0;delay20us(); //延时20usif(temp==1) //判断数据为1还是0DQ=1; //如果为1则发送1,即DQ=1;如果是0则保持,因为之前DQ已经置为0,所以不用判断。
delay45us();DQ=1;date=date>>1;}}/*******************************************************************读1个字节数据函数1、将数据线拉高到12、延时2us3、将数据线拉低到04、延时6us5、将数据线拉高到16、延时4us7、读数据线的状态得到一个状态位,并进行数据处理。
8、延时30us9、重复1~7步骤,直到读取完一个字节(一个字节共8位需要循环8次)。
**********************************************************************/uchar tempread() //uchar为带返回值的函数,void不带{uchar i,date;static bit j; //定义静态变量位for(i=8;i>0;i--){date=date>>1; //读出的数据最低位在最前面,这样刚好一个字节在date里DQ=1; //将数据线拉高到1_nop_();_nop_(); //延时2usDQ=0; //将数据线拉低到0_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//延时6usDQ=1; ////将数据线拉高到1_nop_();_nop_();_nop_();_nop_();//延时4usj=DQ;if(j==1)date=date|0x80;//1000 0000delay30us();}return(date);}void get_tem(){dsreset(); //复位tempwritebyte(0xCC); //跳过ROMtempwritebyte(0x44); //温度转换dsreset(); //每次操作ROM之前要先复位,然后执行跳过或其他指令tempwritebyte(0xCC);tempwritebyte(0xBE); //读暂存器temp_data[0]=tempread(); //第0位,温度值低8位;RAM共9个字节,从0开始自动读temp_data[1]=tempread(); //第1位,温度值高8位aaa=temp_data[1];aaa<<=8;aaa=aaa|temp_data[0]; // 两字节合成一个整型变量。
}work_aaa(){n=0;if(aaa>63488) // 温度值正负判断63448=1111 1000 0000 0000 {aaa=65536-aaa;n=1; // 负温度求补码,标志位置1}ttt=aaa*6.25; //0.0625*100=6.25temper=(int)ttt;a1=temper/10000; //对1000求模,取万位a2=temper%10000/1000; //对10000求余对1000求模,取千位a3=temper%1000/100; //对1000求余再对100求模,取百位a4=temper%100/10; //取小数十位a5=temper%10; //取个位for(num=100;num>0;num--){if(n==1) //负温度{if(ttt>warn_l) //超温报警{beep=0;delay(100);beep=1;delay(100);}if(a2!=0)disp(11,10,a2,a3,a4,a5);else disp(11,11,10,a3,a4,a5);}else //正温度{if(ttt>warn_h) //超温报警{beep=0;delay(100);beep=1;delay(100);}if(a1==0&&a2==0)disp(11,11,11,a3,a4,a5);if(a1==0&&a2!=0)disp(11,11,a2,a3,a4,a5);if(a1!=0)disp(11,a1,a2,a3,a4,a5);}}}void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5) {wela=1;P0=0xFE;wela=0;dula=1;P0=table[num0];//显示第一个数码管显示'-'号dula=0;delay(2);wela=1;P0=0xFD;wela=0;dula=1;P0=table[num1];//显示第二个数码管dula=0;delay(2);wela=1;P0=0xFB;wela=0;dula=1;P0=table[num2];//显示第三个数码管dula=0;delay(2);wela=1;P0=0xF7;wela=0;dula=1;P0=table1[num3];//显示第四个数码管dula=0;delay(2);wela=1;P0=0xEF;wela=0;dula=1;P0=table[num4];//显示第五个数码管dula=0;delay(2);wela=1;P0=0xDF;wela=0;dula=1;P0=table[num5];//显示第六个数码管dula=0;delay(2);}void disp1(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5) {wela=1;P0=0xFE;wela=0;dula=1;P0=table[num0];//显示第一个数码管显示'-'号dula=0;delay(2);wela=1;P0=0xFD;wela=0;dula=1;P0=table[num1];//显示第二个数码管dula=0;delay(2);wela=1;P0=0xFB;wela=0;dula=1;P0=table[num2];//显示第三个数码管dula=0;delay(2);wela=1;P0=0xF7;wela=0;dula=1;P0=table[num3];//显示第四个数码管dula=0;delay(2);wela=1;P0=0xEF;wela=0;dula=1;P0=table[num4];//显示第五个数码管dula=0;delay(2);wela=1;P0=0xDF;wela=0;dula=1;P0=table[num5];//显示第六个数码管dula=0;delay(2);}void main(){uchar j;get_tem();for(j=0;j<10;j++){wela=1;P0=0x00;wela=0;dula=1;P0=table[j];//显示第一个数码管显示'-'号delay(500);dula=0;}while(1){get_tem();work_aaa();}}/******************************************************************** * 程序名; __delayus_h__* 功能:DS18B20的c51编程头文件* 编程者:ZPZ* 编程时间:2017/1* 说明:us延时程序*********************************************************************/ #ifndef __delayus_h__ //定义头文件#define __delayus_h__#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned charvoid delayus(uint t) //t=54时,延时500us;t=81时延时745us{while(t--);}void delay15us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}void delay20us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}void delay30us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}void delay45us() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}void delay70us() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }。