程序+详细使用说明_第1页
程序+详细使用说明_第2页
程序+详细使用说明_第3页
程序+详细使用说明_第4页
程序+详细使用说明_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、./*18B20驱动程序,DQ为数据口,接于P2.1*11.0592M晶振,上拉4.7k电阻*Author:fyb*2005-3-25 11:23,OK!*/#include#include#define uchar unsigned char#define uintunsigned intsbit dq = P17;bitflag;uint Temperature;uchar temp_buff9; /存储读取的字节,read scratchpad为9字节,read rom ID为8字节uchar id_buff8;uchar *p;uchar crc_data;uchar code Crc

2、Table 256=0,94, 188,226,97,63,221,131,194,156,126,32,163,253,31,65,157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,219,133,

3、 103,57,186,228,6,88,25,71,165,251,120,38,196,154,101,59, 217,135,4,90,184,230,167,249,27,69,198,152,122,36,248,166, 68,26,153,199,37,123,58,100,134,216,91,5,231,185,140,210, 48,110,237,179,81,15,78,16,242,172,47,113,147,205,17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,175,241, 19,77,20

4、6,144,114,44,109,51,209,143,12,82,176,238,50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,202,148, 118,40,171,245,23,73,8,86,180,234,105,55,213, 139,87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,116,42,200,150,21,75,169,2

5、47,182,232,10,84,215,137,107,53;/*Function:延时处理*parameter:*Return:*Modify:*/void TempDelay (uchar us)while(us-);/*Function:18B20初始化*parameter:*Return:*Modify:*/void Init18b20 (void)dq=1;_nop_();dq=0;TempDelay(86);/delay 530 uS/80_nop_();dq=1;TempDelay(14);/delay 100 uS/14_nop_();_nop_();_nop_();if(d

6、q=0)flag = 1;/detect 1820 success!elseflag = 0;/detect 1820 fail!TempDelay(20);/20_nop_();_nop_();dq = 1;/*Function:向18B20写入一个字节*parameter:*Return:*Modify:*/void WriteByte (uchar wr)/单字节写入uchar i;for (i=0;i= 1;/*Function:读18B20的一个字节*parameter:*Return:*Modify:*/uchar ReadByte (void)/读取单字节uchar i,u=0;

7、for(i=0;i= 1;dq = 1;if(dq=1)u |= 0x80;TempDelay (4);_nop_();return(u);/*Function:读18B20*parameter:*Return:*Modify:*/void read_bytes (uchar j)uchar i;for(i=0;ij;i+)*p = ReadByte();p+;/*Function:CRC校验*parameter:*Return:*Modify:*/uchar CRC (uchar j)uchar i,crc_data=0;for(i=0;ij;i+)/查表校验crc_data = CrcTa

8、blecrc_datatemp_buffi;return (crc_data);/*Function:读取温度*parameter:*Return:*Modify:*/void GemTemp (void)read_bytes (9);if (CRC(9)=0) /校验正确Temperature = temp_buff1*0x100 + temp_buff0;/Temperature *= 0.625;Temperature /= 16;TempDelay(1);/*Function:内部配置*parameter:*Return:*Modify:*/void Config18b20 (void

9、)/重新配置报警限定值和分辨率Init18b20();WriteByte(0xcc);/skip romWriteByte(0x4e);/write scratchpadWriteByte(0x19);/上限WriteByte(0x1a);/下限WriteByte(0x7f);/set 11 bit (0.125)Init18b20();WriteByte(0xcc);/skip romWriteByte(0x48);/保存设定值Init18b20();WriteByte(0xcc);/skip romWriteByte(0xb8);/回调设定值/*Function:读18B20ID*para

10、meter:*Return:*Modify:*/void ReadID (void)/读取器件 idInit18b20();WriteByte(0x33);/read romread_bytes(8);/*Function:18B20ID全处理*parameter:*Return:*Modify:*/void TemperatuerResult(void)p = id_buff;ReadID();Config18b20();Init18b20 ();WriteByte(0xcc);/skip romWriteByte(0x44);/Temperature convertInit18b20 ()

11、;WriteByte(0xcc);/skip romWriteByte(0xbe);/read Temperaturep = temp_buff;GemTemp();DS18B20温度测量实验功能:在数码管上显示当前DS18B20测到的温度 小数部分为4位,温度为负时,最高位显示- 测量范围:-55 +125#include #include #define uint unsigned int#define uchar unsigned char#include uchar DisplayData8=17,17,16,16,16,16,16,16; /数码管各位显示的数字sbit DQ=P34

12、; /定义连接DS18B20的IO口uchar MSB; /温度高字节uchar LSB; /温度低字节int t1=0; /温度整数部分数值uint t2=0; /温度小数部分数值uchar flag; /负温度标志/延时函数void delay(uchar count)uchar i;for(i=0;icount;i+);/初始化DS18B20void DS18B20Init()DQ=0; /下拉500usdelay(60);DQ=1; /释放总线delay(6);while(DQ); /等待应答信号while(DQ); /等待释放总线/读一个字节uchar ReadByte()uchar

13、 i;uchar ReadData=0;for(i=0;i=1;DQ=1;if(DQ) ReadData|=0x80;delay(4);return ReadData;/写一个字节WriteByte(uchar WriteData)uchar i;uchar tmpData;for(i=0;i=1;if(tmpData)DQ=0;DQ=1;delay(4);elseDQ=0;delay(4);DQ=1;/数码管扫描显示程序void Display() uchar i; for(i=0;i0) /判断是否为负温度flag=1;elseflag=0;if(flag) /如果为负温度取反加1MSB=

14、MSB;LSB=LSB+1;t1=MSB4);t2=(LSB&0x0F)*0.0625*10000; /得到温度小数部分并扩大10000倍/计算各位数码管要显示的数值if(flag)DisplayData1=16; /如果为负温度则显示-elseDisplayData1=t1/100;if(DisplayData1=0) DisplayData1=17;DisplayData2=t1%100/10;DisplayData3=t1%10;DisplayData4=t2/1000;DisplayData5=t2%1000/100;DisplayData6=t2%100/10;DisplayData

15、7=t2%10;/主程序main() CH451_Init(); /初始化CH451 while(1) DS18B20Init(); /复位DS18B20 WriteByte(0xCC); /跳过ROM配置 WriteByte(0x44); /启动温度转换 DS18B20Init(); WriteByte(0xCC); WriteByte(0xBE); /读温度寄存器 LSB=ReadByte(); /读温度数据低字节 MSB=ReadByte(); /读温度数据高字节 GetT(); /计算温度 Display(); /温度显示程序 实验六:温度传感DS18B20实验(数码管显示)一、实验目

16、的:1) 以AT89S52X单片机为核心器件,组成一个数字式温度计。2) 了解DS18B20的工作原理及使用方法。3) 掌握DS18B20读写时序的编程方法。4) 锻炼单片机综合应用和开发的能力二、实验内容与要求:1)显示当前温度:在数码管显示模块上前四个数码管显示当前温度(整数小数各两位)。2)编程要求:用汇编语言编写此程序,写出各个子程序的功能并在主要的指令后加上必要地文字说明增加程序的可读性。三、实验原理:(1)硬件电路原理图:如图-1所示, 图-1中温度测量使用P1.3端口,使用DS18B20器件,显示使用4位数码管。 (2)工作原理:本实验通过DS18B20采集环境温度,当单片机检测

17、到DSl820的存在便可以发出ROM操作命令之一,Read ROM(读ROM) Match ROM(匹配ROM) Skip ROM(跳过ROM) Search ROM(搜索ROM) Alarm search(告警搜索) 然后对发存储器操作命令对DS18B20进行读写数据转换等操作。单片机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位,然后将读到的数据转换BCD码在数码管显示出来(DS18B20的详细资料详见附录)。四软件流程设计:该系统采用的方法,根据初始化温度传感器,再就是显示温度数值。测量出来温度软件系统基本流程如图所示: 五参考程序:/*-内存分配声明-*/T

18、EMPER_L EQU 31H ;用于保存读出温度的低字节TEMPER_H EQU 30H ;用于保存读出温度的高字节T_DF EQU 33H ;FORMAT后的小数部分(decimal fraction),半字节的温度小数(存在低四位)T_INTEGER EQU 32H ;FORMAT后的整数部分(integer),将两字节的温度整合成1字节FLAG BIT 20H ;标志位DAT BIT P1.3 ;DS18B20数据线/*-主函数开始-*/ ORG 0000H;函数入口地址 AJMP MAIN;跳转指令 ORG 0030HMAIN: CLR EA ;使用DS18B20一定要禁止中断 MO

19、V SP,#60H MOV T_DF,#00H ;赋初始温度为30度 MOV T_INTEGER,#30HSTART: LCALL GET_TEMPER ;调用读温度子程序 LCALL T_FORMAT ;将读出的2字节温度格式化,并转换为压缩BCD码 LCALL DISPLAY ;显示温度 AJMP START/*-DS18B20的温度转换子程序-*/GET_TEMPER: LCALL Set_18B20;调用DS18B20初始化程序 MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE_1820;调用写DS18B20的子程序 MOV A,#44H ;发出温度转换命令 LCALL

20、 WRITE_1820 LCALL DISPLAY ;用显示温度(持续1s左右)来等待AD转换结束,12位的话要转换750ms LCALL Set_18B20 ;准备读温度前先初始化 MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE_1820 MOV A,#0BEH ;发出读温度命令 LCALL WRITE_1820 LCALL READ_1820 ;读DS18B20的程序 RET/*-DS18B20初始化程序-*/Set_18B20: SETB DAT;置位 NOP;空操作 CLR DAT;清零 MOV R2,#250 ;主机发出延时500微秒的复位低脉冲 DJNZ R2,$

21、;自减(-1)循环 SETB DAT ;然后拉高数据线 MOV R2,#30 DJNZ R2,$ ;延时60us等待DS18B20回应 JNB DAT,INIT1 JMP Set_18B20 ;超时而没有响应,重新初始化INIT1: MOV R2,#120 DJNZ R2,$ ;延时240us JB DAT,INIT2 ;数据变高,初始化成功 JMP Set_18B20INIT2: MOV R2,#240 DJNZ R2,$ RET/*-写DS18B20的子程序(有具体的时序要求)-*/WRITE_1820: MOV R2,#8 ;共8位数据WR0: CLR DAT MOV R3,#6 DJN

22、Z R3,$ RRC A MOV DAT,C MOV R3,#20 DJNZ R3,$ SETB DAT NOP NOP DJNZ R2,WR0 SETB DAT RET/*-读DS18B20的程序,从DS18B20中读出两个字节的温度数据-*/READ_1820: MOV R4,#2 ;将温度高位和低位从DS18B20中读出 MOV R1,#TEMPER_L ;低位存入31H(TEMPER_L)RE0: MOV R2,#8RE1: SETB DAT NOP NOP CLR DAT NOP NOP SETB DAT MOV R3,#4 DJNZ R3,$ MOV C,DAT RRC A MOV

23、 R3,#30 DJNZ R3,$ DJNZ R2,RE1 MOV R1,A DEC R1 ;高位存入30H(TEMPER_H) DJNZ R4,RE0 RET/*-整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)-*/T_FORMAT: MOV A,#0FH ANL A,TEMPER_L MOV T_DF,A ;获得小数部分(4位) MOV A,TEMPER_L SWAP A MOV R0,A MOV A,TEMPER_H SWAP A XCHD A,R0 MOV T_INTEGER,A ;获得整数部分(1字节)TO_BCD: MOV A,T_INTEGER MOV

24、B,#10 DIV AB SWAP A ADD A,B MOV T_INTEGER,A ;整数部分压缩BCD码送T_INTEGER MOV A,T_DF MOV B,#10 MUL AB MOV B,#16 DIV AB MOV R2,A ;暂存R2 MOV A, B MOV B,#10 MUL AB MOV B,#16 DIV AB MOV B,A MOV A,R2 SWAP A ADD A,B MOV T_DF,A ;小数部分压缩BCD码送T_DF RET/*-显示温度子程序-*/DISPLAY:MOV R1,#250DISP1: MOV A,T_INTEGER MOV R3,#0FEH

25、MOV R4,#0FDH SETB FLAGDISP2: CPL FLAG MOV B,#10H DIV AB MOV R2,A ;高位送R2暂存 MOV DPTR,#2000H ;字位口 MOV A,R3 MOVX DPTR,A ;送字位 MOV A,R2 ;字型R2送A MOV DPTR,#TAB ;表首地址送DPTR MOVC A,A+DPTR ;查表 MOV DPTR,#6000H ;字型口 MOVX DPTR,A ;送字型 CALL D1MS ;延时 MOV A,#0FFH MOVX DPTR,A ;关闭字型显示 MOV R2,B ;低位送R2暂存 MOV DPTR,#2000H ;

26、字位口 MOV A,R4 MOVX DPTR,A ;送字位 MOV A,R2 ;字型R2送A MOV DPTR,#TAB ;表首地址送DPTR MOVC A,A+DPTR ;查表 JNB FLAG,D1;FLAG 为零,跳到D1 JMP D2;否则,跳到D2D1: ANL A,#7FH;相与D2: MOV DPTR,#6000H ;字型口 MOVX DPTR,A ;送字型 CALL D1MS ;延时 MOV A,#0FFH MOVX DPTR,A ;关闭字型显示 MOV A,T_DF MOV R3,#0FBH MOV R4,#0F7H JNB FLAG,DISP2 DJNZ R1,DISP1

27、RET/*-1mS延时(按12MHZ算)-*/D1MS: MOV R7,#250LOOP0: NOP NOP DJNZ R7,LOOP0 RET/*-共阳数码管对应字型表-*/TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H ;段码表 ; 0 1 2 3 4 5 6 7 对应内容 DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH ; 8 9 A B C D E F END六实验步骤:1.读DS18B20的数据手册,弄明白其时序及编程思路。 2.看实验开发板的连线手册,分析计算出显示模块数码管的物理地址。3.画出程序流程图编写相应的

28、程序。4.将程序下载到开发板上并调试程序,使程序达到预定功能。七、实验报告:1写出项目方案,包括硬件设计方案和软件设计方案。2给出电路原理图和程序流程图的设计。3提供程序清单,并加以注释。4在调试过程中发现了哪些问题?你是怎么解决的?5总结项目开发的经验八思考题: 本实验实现了单点的温度采集,你能否在本实验的基础上设计实验实现多点温度采集的系统。 附录数字温度传感器DS1820(DS18B20)的应用 一 单线数字温度计DSl820介绍 DSl820数字温度计提供9位(二进制)温度读数指示器件的温度信息经过单线接口送入DSl820或从DSl820送出因此从主机CPU到DSl820仅需一条线(和

29、地线)DSl820的电源可以由数据线本身提供而不需要外部电源因为每一个DSl820在出厂时已经给定了唯一的序号因此任意多个DSl820可以存放在同一条单线总线上这允许在许多不同的地方放置温度敏感器件DSl820的测量范围从-55到+125增量值为0.5可在l s(典型值)内把温度变换成数字每一个DSl820包括一个唯一的64位长的序号该序号值存放在DSl820内部的ROM(只读存贮器)中开始8位是产品类型编码(DSl820编码均为10H)接着的48位是每个器件唯一的序号最后8位是前面56位的CRC(循环冗余校验)码DSl820中还有用于贮存测得的温度值的两个8位存贮器RAM编号为0号和1号1号

30、存贮器存放温度值的符号如果温度为负()则1号存贮器8位全为1否则全为00号存贮器用于存放温度值的补码LSB(最低位)的1表示0.5将存贮器中的二进制数求补再转换成十进制数并除以2就得到被测温度值(-550125)DSl820的引脚如图226l所示每只D51820都可以设置成两种供电方式即数据总线供电方式和外部供电方式采取数据总线供电方式可以节省一根导线但完成温度测量的时间较长采取外部供电方式则多用一根导线但测量速度较快温度计算1 Ds1820用9位存贮温值度最高位为符号位下图为18b20的温度存储方式负温度S=1正温度S=0如 00AAH为+85,0032H为25,FF92H为552. Ds1

31、8b20用12位存贮温值度最高位为符号位下图为18b20的温度存储方式负温度S=1正温度S=0如 0550H为+85,0191H为25.0625,FC90H为-55二. DSl820工作过程及时序 DSl820工作过程中的协议如下 初始化RoM操作命令存储器操作命令处理数据 1初始化 单总线上的所有处理均从初始化开始 2ROM操作品令 总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如 指令 代码 Read ROM(读ROM) 33H Match ROM(匹配ROM) 55H Skip ROM(跳过ROM CCH Search ROM(搜索ROM) F0H Alarm se

32、arch(告警搜索) ECH 3存储器操作命令 指令 代码 Write Scratchpad(写暂存存储器) 4EH Read Scratchpad(读暂存存储器) BEH Copy Scratchpad(复制暂存存储器) 48H Convert Temperature(温度变换) 44H Recall EPROM(重新调出) B8H Read Power supply(读电源) B4H 4时 序 主机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位 (1)初始化 时序见图2.25-2主机总线to时刻发送一复位脉冲(最短为480us的低电平信号)接着在tl时刻释放总线

33、并进入接收状态DSl820在检测到总线的上升沿之后等待15-60us接着DS1820在t2时刻发出存在脉冲(低电平持续60-240 us)如图中虚线所示 以下子程序在MCS51仿真机上通过其晶振为12M.初始化子程序 RESET PUSH B ;保存B寄存器 PUSH A 保存A寄存器 MOV A,#4 ;设置循环次数 CLR P1.0 ;发出复位脉冲 MOV B,#250 ;计数250次 DJNZ B,$ ;保持低电平500us SETB Pl.0 ;释放总线 MOV B,#6 ;设置时间常数 CLR C ;清存在信号标志 WAITL: JB Pl.0,WH ;若总线释放跳出循环 DJNZ

34、B,WAITL ;总线低等待 DJNZ ACC,WAITL;释放总线等待一段时间 SJMP SHORT WH: MOV B,#111 WH1: ORL C,P1.0 DJNZ B,WH1 ;存在时间等待 SHORT: POP A POP B RET (2)写时间隙 当主机总线t o时刻从高拉至低电平时就产生写时间隙见图2253图2254从to时刻开始15us之内应将所需写的位送到总线上DSl820在t后15-60us间对总线采样若低电平写入的位是0见图2253若高电平写入的位是1见图2254连续写2位间的间隙应大于1us 写位子程序(待写位的内容在C中) WRBIT: PUSH B ;保存B

35、MOV B,#28 ;设置时间常数 CLR P1.0 ;写开始 NOP ;1us NOP ;1us NOP ;1us NOP ;1us N0P ;1us MOVPl.0,C ;C内容到总线 WDLT: DJNZ B,WDLT;等待56Us POP B SETB Pl.0 ;释放总线 RET ;返回 写字节子程序(待写内容在A中): WRBYTB: PUSH B :保存B MOV B#8H ;设置写位个数 WLOP: RRC A ;把写的位放到C ACALL WRBIT ;调写 1位子程序 DJNZ BWLOP ;8位全写完? POP B RET (3)读时间隙 见图2255主机总线to时刻从高

36、拉至低电平时总线只须保持低电平l 7ts之后在t1时刻将总线拉高产生读时间隙读时间隙在t1时刻后t 2时刻前有效t z距to为15捍s也就是说t z时刻前主机必须完成读位并在t o后的60尸s一120 fzs内释放总线 读位子程序(读得的位到C中) RDBIT: PUSH B ;保存B PUSH A ;保存A MOV B,#23 ;设置时间常数 CLR P1.0 ;读开始图2255的t0时刻 NOP ;1us NOP ;1us NOP ;1us NOP ;1us SETB Pl.0 ;释放总线 MOV A,P1 ;P1口读到A MOV C,EOH ;P1.0内容C NOP ;1us NOP ;

37、1us NOP ;1us NOP ;1us RDDLT: DJNZ B,RDDLT ;等待46us SETB P1.0 POP A POP B RET 读字节子程序(读到内容放到A中) RDBYTE: PUSH B ;保存BRLOP MOV B,#8H ;设置读位数 ACALL RDBIT ;调读1位子程序 RRC A ;把读到位在C中并依次送给A DJNZ B,RLOP ;8位读完? POP B ;恢复B RETDS18B20温度测量、报警系统的设计【图】 最近帮别人设计了一下毕业设计,就是温度检测、报警系统,具体的题目就不贴出来了。公开这个设计的原因也在于最近有很多人都在问我类似的课题,说

38、明这个课题之普遍。其实以前就给朋友做过一个DS18B20温度计,大同小异,这个是升级版而已。当然,加上了报警系统就更加实用了。现在又重新制作了硬件。 功能简介:温度测量范围099.9摄氏度,可设置上限报警温度、下限报警温度(即高于上限值或者低于下限值时蜂鸣器报警),默认上限报警温度为38、默认下限报警温度为5。报警值可设置范围:最低上限报警值等于当前下限报警值,最高下限报警值等于当前上限报警值。将下限报警值调为0时为关闭下限报警功能。他的毕业设计比较简单,以上这些功能就已经超额完成基本要求了。视频演示:硬件设计: 电源电压VCC为5V,可以焊一只USB座到板上,然后用相应的USB线连接至电脑,通过电脑USB口供电;D

温馨提示

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

评论

0/150

提交评论