PIC16F877A控制DS18B20汇编程序

合集下载

基于PIC16F877单片机与DS18B20的温度采集与显示

基于PIC16F877单片机与DS18B20的温度采集与显示

河北联合大学轻工学院QINGGONG COLLEGE, HEBEI UNITED UNIVERSITY 《PIC单片机课程设计》学生姓名:肖晓峰学号:201124520121学部:信息科学技术部专业班级:电信1指导教师:曹义2014年7 月 4 日本课程设计是在《PIC单片机原理及应用》及《单片机C语言编程》课程的基础上,通过硬件设计、软件编程及仿真调试的实践,进一步掌握PIC单片机的应用方法,熟练掌握PICC C语言程序的编写与调试,是毕业设计前的一次重要实践,为今后走上工作岗位打下坚实的单片机应用基础。

2.1 设计题目:基于PIC16F877单片机与DS18B20的温度采集与显示2.2 功能实现:实时温度显示,并具有超限报警功能。

输出显示采用LCD1602。

2.3 设计要求:自己设计硬件和程序编程,画出完整的电路原理图,用Multisim或Proteus 仿真,最终可实现脱机运行。

三、设计原理说明3.2 显示模块如用LCD1602作为显示设备,要求显示屏分两行显示,第一行显示日期(年-月-日)和星期,第二行显示时间(时:分:秒)和温度。

显示秒由00一直加到59,分钟数也由00加到59,小时采用24小时制,由00加到23,如此循环显示。

3.3 按键模块按键用来作为时间调整。

要求至少设计4个按键,按键1作为设置键;按键2、按键3分别为增加、减少键,在设置键按下时,此两个按键方有效;按键4是确定键,在设置键按下时方才有效。

3.4 温度采集模块DS18B20是美国DALLAS公司推出的单总线数字温度传感器。

DS18B20内部集成了温敏元件、数据转换芯片、存储器芯片和计算机接口芯片等多功能模块。

其主要技术特点有:具有独特的单线接口方式;可以通过数据线供电,具有超低功耗工作方式;测温范围为-55℃~125℃,测温精度为0.5℃;温度转换精度9~12位可编程,直接将温度转换值以二进制数码的方式串行输出。

四、硬件原理图(含原理图、电路仿真图)图2电路仿真图五、软件设计(含流程图、带注释的程序清单)程序设计流程图主文件he//**********************************************/#include<pic.h>__CONFIG(0x3B31);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡//宏定义#define DQ RC1 //温度数据口#define DQ_HIGH() TRISC1=1#define DQ_LOW() TRISC1=0;DQ=0#define uchar unsigned char#define uint unsigned int#define RS RA0 //LCD功能选择位#define RW RA1 //读写选择#define EN RA2 //使能//变量定义int temper;char f = 0 ;uchar a1,a2,a3,a4;uchar Prompt[]="P1ress K1 - K3 To Start Demo Prog";//各种申明void init();void DelayMS(uint ms);uchar Busy_Check();void Write_LCD_Command(uchar cmd);void Write_LCD_Data(uchar dat);void Initialize_LCD();void ShowString(uchar x,uchar y,uchar *str);void Showword0(uchar x,uchar y,char word );void Showword1(char word );void write_shuzi(uchar num1,uchar num2,uchar num3,uchar num4);//18b20void delay(uint x);void delayus(uint,uchar);void init();void write_byte(uchar date);uchar read_byte();void get_tem();//***子函数****************************************///系统初始化函数void init(){ADCON1=0X07; //设置A口为普通数字口TRISA =0X00; //设置A口方向为输出TRISB =0x00;OPTION=0x00; //B口电阻上拉TRISC = 1;PORTC = 0x20;TRISD =0X00;TRISD =0x00;}//延时函数void delayus(uint x,uchar y){uint i;uchar j;for(i=x;i>0;i--);for(j=y;j>0;j--);}void delay(uint x){uint a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}//ds18b20复位函数void reset(){uchar st=1;DQ_HIGH(); //开始于高电平NOP();NOP(); //延时2uswhile(st){DQ_LOW();delayus(70,30); //750DQ_HIGH(); //释放总线delayus(4,4); //等70if(DQ==1) //应答判断st=1;elsest=0;delayus(50,10); //延时450}}//ds18b20写函数void write_byte(uchar date){uchar i,temp;DQ_HIGH(); //开始于高电平NOP();NOP();for(i=8;i>0;i--){temp=date&0x01;//01010101 //分位写入DQ_LOW();delayus(0,0); //15if(temp==1)DQ_HIGH();delayus(2,2); //45DQ_HIGH();date=date>>1;//00101010}}//ds18b20读函数uchar read_byte(){uchar i,date;static bit j;for(i=8;i>0;i--){date=date>>1;DQ_HIGH(); //开始于高电平NOP();NOP();DQ_LOW();NOP();NOP();NOP();NOP();NOP();NOP(); //6DQ_HIGH();NOP();NOP();NOP();NOP(); //4j=DQ; //读取总线if(j==1)date=date|0x80;//1000 0000delayus(1,1); //30 }return (date); //返回函数值}//温度读取处理函数void get_tem(){uchar tem1,tem2,num;float aaa;reset(); //复位write_byte(0xCC);//跳过ROMwrite_byte(0x44);//温度转换reset();write_byte(0xCC); //跳过ROMwrite_byte(0xBE); //温度传递tem1=read_byte(); //读取低8位tem2=read_byte();//读取高8位if(tem2>7) //符号判断{tem2=255-tem2;tem1=255-tem1;f=1;}else {f=0;}aaa=(tem2*256+tem1)*6.25*8; //转化为实际温度值temper=(int)aaa; //强行转化位整数a1=temper/1000; //十进制分位a2=temper%1000/100;a3=temper%100/10;a4=temper%10;if(a1>7||a1<5) RD7=1;else RD7=0;}//延时void DelayMS(uint ms) //毫秒{uchar i;while(ms--) for(i=0;i<120;i++);}//LCD忙检查函数uchar Busy_Check(){uchar LCD_Status;RS=0; //寄存器选择(0指令1数据)RW=1; //读状态寄存器EN=1; //开始读DelayMS(1);LCD_Status=PORTB;EN=0;return LCD_Status;}//写LCD命令函数void Write_LCD_Command(uchar cmd){// while((Busy_Check()&0x80)==0x80); //忙等待RS=0; //选择命令寄存器RW=0; //写EN=0;PORTB=cmd;EN=1;DelayMS(1);EN=0;}//LCD发送数据函数void Write_LCD_Data(uchar dat){// while((Busy_Check()&0x80)==0x80); //忙等待RS=1;RW=0;EN=0;PORTB=dat;EN=1;DelayMS(1);EN=0;}//LCD初始化函数void Initialize_LCD(){Write_LCD_Command(0x38);DelayMS(1); //38:数据长8位,两行显示,字体5*7点阵(80)Write_LCD_Command(0x01);DelayMS(1); //清屏Write_LCD_Command(0x06);DelayMS(1); //字符进入模式:屏幕不动,字符后移Write_LCD_Command(0x0c);DelayMS(1); //显示开,光标关;0x0e 是开光标}//显示字符函数void Showword0(uchar x,uchar y,char word ) //y:行地址,x:列地址{if(y==0) Write_LCD_Command(0x80|x); //设置显示起始位置(x,0)第一行if(y==1) Write_LCD_Command(0xc0|x); // (x,1)第二行Write_LCD_Data(word+0x30); //str[i]等价于*(str+i)}//显示温度函数void write_shuzi(uchar num1,uchar num2,uchar num3,uchar num4){if(f){Showword0(0,0,-3 );} //负号Showword0(1,0,num1 ); //十位Showword0(2,0,num2 );Showword0(3,0,-2 ); //小数点Showword0(4,0,num3 );Showword0(5,0,num4 );DelayMS(5);}//主函数void main(){init(); //调用系统初始化函数Initialize_LCD(); //LCD初始化while (1){ get_tem(); //读取温度write_shuzi(a1,a2,a3,a4 ); //显示}}六、设计总结1 打好基础,清楚硬件工作原理,性能,以便于编程。

[PIC16F877A+汇编语言]DS18B20温度采集程序

[PIC16F877A+汇编语言]DS18B20温度采集程序

[PIC16F877A+汇编语言]DS18B20温度采集程序DS18B20温度采集程序[PIC16F877A+汇编语言];六位数码管显示温度结果,其中整数部分2位,小数部分4位;每次按下RB0键后进行一次温度转换。

;硬件要求:把DS18B20插在18B20插座上; 拨码开关S10第1位置ON,其他位置OFF; 拨码开关S5、S6全部置ON,其他拨码开关全部置OFF;*****************以下是暂存器的定义*****************************#INCLUDE#DEFINE DQ PORTA,0 ;18B20数据口__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF &_BODEN_OFF&_PWRTE_ON&_W DT_OFF&_HS_OSC;调试模式关闭,写保护,一半ROM可在线改写,EEPROM加密,低压编程关闭,掉电检测关闭,上电延时开,看门狗关,4M晶振HS 振荡CBLOCK 20HDQ_DELAY1DQ_DELAY2TEMPTEMP1TEMP2 ;存放采样到的温度值TEMP3COUNTCOUNT1ENDCTMR0_VALUE EQU 0AH ;寄存器初值为6,预分频比1:4,中断一次时间为4*(256-6)=1000us DQ_DELAY_VALUE1 EQU 0FAHDQ_DELAY_VALUE2 EQU 4H;**********************以下是程序的开始************************ORG 00HNOPGOTO MAIN ;入口地址ORG 04HRETFIE ;在中断入口出放置一条中断返回指令,防止干扰产生中断TABLEADDWF PCL,1RETLW 0C0H ;0的编码(公阳极数码管)RETLW 0F9H ;1的编码RETLW 0A4H ;2的编码RETLW 0B0H ;3的编码RETLW 99H ;4的编码RETLW 92H ;5的编码RETLW 082H ;6RETLW 0F8H ;7RETLW 080H ;8RETLW 090H ;9;***************************主程序*******************************MAINCLRF PORTACLRF PORTBBANKSEL TRISACLRF TRISA ;A口所有先设置为输出CLRF TRISDMOVLW 01HMOVWF TRISB ;B0口为输入,其他为输出MOVWF ADCON1 ;关闭所有A/D口MOVLW 01HMOVWF OPTION_REG ;分频比1:4,定时器,内部时钟源 BCF STATUS,RP0CLRF TEMPCLRF TEMP1CLRF TEMP2 ;清零临时寄存器MOVLW 8HMOVWF COUNTMOVLW 38HMOVWF FSRCLRF INDFINCF FSR,1DECFSZ COUNT,1GOTO $-3;****************************循环处理部分************************;先启动18B20温度转换程序,在判断温度转换是否完成(需750us);未完成则调用显示子程序,直到完成温度转换;完成后读取温度值;送LCD显示LOOPBTFSC PORTB,0 ;判断温度转换按键是否按下GOTO LOOP1 ;否,转显示CALL DELAY ;消抖BTFSC PORTB,0 ;再次判断GOTO LOOP1CALL RESET_18B20 ;调用复位18B20子程序MOVLW 0CCHCALL WRITE_18B20 ;SKIP ROM命令MOVLW 44HMOVWF TEMPCALL WRITE_18B20 ;温度转换命令CLRF STATUSCALL DELAY_750MS ;调用温度转换所需要的750MS延时NOP CALL RESET_18B20MOVLW 0CCHMOVWF TEMPCALL WRITE_18B20 ;SKIP ROM命令MOVLW 0BEHMOVWF TEMPCALL WRITE_18B20 ;读温度命令CALL READ_18B20 ;调用读温度低字节MOVFW TEMPMOVWF TEMP1 ;保存到TEMP1CALL READ_18B20 ;调用读温度高字节MOVFW TEMPMOVWF TEMP2 ;保存到TMEP2CALL RESET_18B20LOOP1CALL TEMP_CHANGE ;调用温度转换程序CALL DISPLAY ;调用LCD显示程序GOTO LOOP ;循环工作;*********************复位DS18B20子程序************************** RESET_18B20;根据DATASHEET介绍,写数据时应遵照如下规定:;主控制器把总线拉低至少480us,;18B20等待15-60us后,把总线拉低做为返回给控制器的应答信号BANKSEL TRISABCF TRISA,0BCF STATUS,RP0BCF DQMOVLW 0A0HMOVWF COUNT ;160USDECFSZ COUNT,1GOTO $-1 ;拉低480usBSF DQ ;释放总线MOVLW 14HMOVWF COUNTDECFSZ COUNT,1GOTO $-1 ;等待60usBANKSEL TRISABSF TRISA,0 ;DQ设置为输入BCF STATUS,RP0BTFSC DQ ;数据线是否为低GOTO RESET_18B20 ;否则继续复位MOVLW 4HMOVWF COUNTDECFSZ COUNT,1 ;延时一段时间后再次判断GOTO $-1BTFSC DQGOTO RESET_18B20MOVLW 4BHMOVWF COUNTDECFSZ COUNT,1GOTO $-1BANKSEL TRISABCF TRISA,0 ;DQ设置为输出BCF STATUS,RP0RETURN;*********************写DS18B20子程序**************************** WRITE_18B20;根据DATASHEET介绍,写数据时应遵照如下规定:;写数据0时,主控制器把总线拉低至少60us;写数据1时,主控制器把总线拉低,但必须在15us内释放MOVLW 8HMOVWF COUNT ;8位数据BANKSEL TRISABCF TRISA,0BCF STATUS,RP0BCF STATUS,CWRITE_18B20_1BSF DQ ;先保持DQ为高MOVLW 5HMOVWF COUNT1BCF DQ ;拉低DQ15usDECFSZ COUNT1,1GOTO $-1RRF TEMP,1BTFSS STATUS,C ;判断写的数据为0还是1 GOTO WRITE_0BSF DQ ;为1,立即拉高数据线GOTO WRITE_ENDWRITE_0BCF DQ ;继续保持数据线为低WRITE_ENDMOVLW 0FHMOVWF COUNT1 ;保持45msDECFSZ COUNT1,1GOTO $-1BSF DQ ;释放总线DECFSZ COUNT,1 ;是否写完8位数据GOTO WRITE_18B20_1RETURN;**********************读DS18B20子程序**************************** READ_18B20;根据DATASHEET介绍,读数据时应遵照如下规定:;读数据0时,主控制器把总线拉低后,18B20再把总线拉低60us ;读数据1时,主控制器把总线拉低后,保持总线状态不变;主控制器在数据线拉低后15us内读区数据线上的状态。

两个DS18B20汇编程序

两个DS18B20汇编程序

DS18B20(1)复位时序。

单总线上的所有预处理均从初始化开始,初始化时序为,主机拉低总线至少480us,然后至高,产生上升沿,1820检测到这一上升沿后,延时15 us~60 us 后,发送60~240 us低电平的存在脉冲,主机检测到低电平后,复位成功。

(2)写时序。

写时序从主机将总线拉低开始,写“1”时序,主机将总线拉低15 us后释放总线,将总线至高。

写“0”时序,主机将总线一直拉低。

写时序至少持续60 us,。

(3)读时序。

读时序主机将总线拉低至少1us,但在15 us内释放总线读取数据。

但整个时序周期也应持续60 us。

(4)读ROM[33H]。

符合ROM[55H]。

跳过ROM[CCH]。

读暂存存储器[BEH]。

写暂存存储器[4EH]。

温度转换[44H]。

RS EQU P3.5RW EQU P3.6E EQU P3.2CS1 BIT P3.3CS2 BIT P3.4ORG 0000HLJMP MAINORG 0100HMAIN: LCALL RESETMOV A,#0CCHLCALL WRITEMOV A,#44HLCALL WRITELCALL XSMOV R4,#0FFHLCALL DELAY15LCALL XSLCALL RESETMOV A,#55HLCALL WRITEMOV A,#28HLCALL WRITEMOV A,#0D6HLCALL WRITELCALL WRITEMOV A,#18H LCALL WRITEMOV A,#01H LCALL WRITEMOV A,#00H LCALL WRITEMOV A,#00H LCALL WRITEMOV A,#0AEH LCALL WRITEMOV A,#0BEHLCALL WRITELCALL DUCHUMOV 30H,ALCALL DUCHUMOV 31H,A LCALL RESETMOV A,#0CCH LCALL WRITE MOV A,#44H LCALL WRITELCALL XSMOV R4,#0FFHLCALL DELAY15 LCALL XSLCALL RESETMOV A,#55H LCALL WRITEMOV A,#28H LCALL WRITEMOV A,#0F0H LCALL WRITEMOV A,#3EH LCALL WRITEMOV A,#18H LCALL WRITEMOV A,#01H LCALL WRITEMOV A,#00H LCALL WRITEMOV A,#00H LCALL WRITELCALL WRITEMOV A,#0BEHLCALL WRITELCALL DUCHUMOV 32H,ALCALL DUCHUMOV 33H,ALCALL WDZHLCALL XSCLR P2.1LCALL XSSETB P2.1AJMP MAINWDZH: ANL 30H,#0F0HANL 31H,#07HMOV A,31HORL A,30HSW AP AMOV B,#10DIV ABMOV 40H,AMOV 41H,BANL 32H,#0F0HANL 33H,#07HMOV A,33HORL A,32HSW AP AMOV B,#10DIV ABMOV 42H,AMOV 43H,BRETXS:MOV DPTR,#TABMOV A,40HMOVC A,@A+DPTRMOV P0,AMOV P1,#0FEHLCALL DELAYMOV P1,#0FFHMOV A,41HMOVC A,@A+DPTRMOV P0,AMOV P1,#0FDHLCALL DELAYMOV P1,#0FFHMOV A,42HMOVC A,@A+DPTRMOV P0,AMOV P1,#0F7HLCALL DELAYMOV P1,#0FFHMOV A,43HMOVC A,@A+DPTRMOV P0,AMOV P1,#0EFHLCALL DELAYMOV P1,#0FFHRETRESET: SETB P2.0NOPCLR P2.0MOV R6,#250DJNZ R6,$SETB P2.0MOV R7,#0DJNZ R7,$RETDELAY15: MOV R5,#6DJNZ R5,$DJNZ R4,DELAY15RETWRITE: SETB P2.0MOV R2,#8CLR CWR11: CLR P2.0MOV R3,#4DJNZ R3,$RRC AMOV P2.0, CMOV R3,#20DJNZ R3,$SETB P2.0NOPDJNZ R2,WR11RETDUCHU: MOV R6, #8RD11: clr P2.0CLR Csetb P2.0MOV R4 , #4DJNZ R4 , $MOV C , P2.0MOV R5, #23DJNZ R5 , $RRC ADJNZ R6 , RD11SETB P2.0RETDELAY: MOV R7,#1MOV R6,#4DDA: MOV R5,#60DJNZ R5,$DJNZ R6,DDADJNZ R7,DDARETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END。

DS18B20多路温度采集汇编程序

DS18B20多路温度采集汇编程序

4路DS18B20温度显示汇编程序(可设置上下限和分路查看)作者蔡雄略;操作说明:;------------------------------------------;功能说明:模式选择键按下后,选择循环显示、分路查看,上限设置,下限设置功能;每按一次模式键,对应的模式指示灯会亮起。

;循环显示模式时候,每秒显示一下各路温度状况;分路查看时界面冻结每按一次+或-键进行各路切换;上限设置时每按一次+或-键对各路上限报警进行设置;下限设置时每按一次+或-键对各路下限报警进行设置;------------------------------------------仿真效果图:程序如下:;------------------------------------------;功能说明:模式选择键按下后,选择循环显示、分路查看,上限设置,下限设置功能;循环显示模式时候,每秒显示一下各路温度状况;分路查看时界面冻结每按一次+或-键进行各路切换;上限设置时每按一次+或-键对各路上限报警进行设置;下限设置时每按一次+或-键对各路下限报警进行设置;------------------------------------------;主程序S0EQU30H;50ms计数寄存器MODE_CONT EQU S0+1;模式计数器DS18B20_CONT EQU S0+2HI_TMP_SET_IN EQU S0+3;进水口LOW_TMP_SET_IN EQU S0+4HI_TMP_SET_OUT EQU S0+5;出水口LOW_TMP_SET_OUT EQU S0+6HI_TMP_SET_FRONT EQU S0+7;前后点HI_TMP_SET_BACK EQU S0+8TMP_IN EQU S0+12TMP_OUT EQU S0+13TMP_FRONT EQU S0+14TMP_BACK EQU S0+15DISPLAY_DATA EQU P0;LED数据口KEY_PORT EQU P3;按键口COM_TEMPERL_L BIT P2.7COM_TEMPERL_H BIT P2.6COM_TEMPERH_L BIT P2.5COM_TEMPERH_H BIT P2.4COM_DS18B20_NUM BIT P2.2LED_LOW_SET BIT P3.0LED_HI_SET BIT P3.1LED_CHECK BIT P3.2LED_NORMAL BIT P3.3IN_LED_ALARM_HI BIT P1.1;ININ_LED_ALARM_LOW BIT P1.3OUT_LED_ALARM_HI BIT P1.0;INOUT_LED_ALARM_LOW BIT P1.2FRONT_LED_ALARM_HI BIT P2.0BACK_LED_ALARM_HI BIT P2.1FLAG1BIT20H.5;DS18B20存在标志位DQ1BIT P1.7DQ2BIT P1.6DQ3BIT P1.5DQ4BIT P1.4TEMPER_L EQU28HTEMPER_H EQU27H;------------------------------------------ORG0000HAJMP STARTORG000BH;T0入口LJMP T_INT;------------------------------------------;START初始化;------------------------------------------ORG100HSTART:MOV TEMPER_L,#00HMOV TEMPER_H,#00HMOV MODE_CONT,#00HMOV DS18B20_CONT,#00HMOV HI_TMP_SET_IN,#100;进水口MOV LOW_TMP_SET_IN,#10MOV HI_TMP_SET_OUT,#100;出水口MOV LOW_TMP_SET_OUT,#10MOV HI_TMP_SET_FRONT,#100MOV HI_TMP_SET_BACK,#100CLR TMP_INCLR TMP_OUTCLR TMP_FRONTCLR TMP_BACKMOV S0,#00HMOV TMOD,#01HMOV TH0,#3CH;定时器0,模式1,定时时常50mS MOV TL0,#0B0HMOV IE,#82HMOV KEY_PORT,#0F8HSETB TR0;运行T0LCALL INIT_18B20;------------------------------------------;主函数;------------------------------------------MAIN:LCALL KEYLCALL GET_TEMPER;获取各路温度LCALL DISPLAY;调用显示程序LJMP MAIN;------------------------------------------;T0中服程序,实现1秒一次切换,同时1秒一次的比较各路温度是否超标;------------------------------------------;T0中服程序T_INT:PUSH ACCPUSH PSWMOV TH0,#3CH;定时器0,模式1,定时时常50mSMOV TL0,#0B0H;------------------------------NEXT:INC S0MOV A,S0CJNE A,#14H,ZDMOV S0,#00H;到1S后进行切换INC DS18B20_CONTMOV A,DS18B20_CONTCJNE A,#04H,ZDMOV DS18B20_CONT,#00HLCALL CHECK1;判断各路温度是否超标ZD:POP PSWPOP ACCRETI;-------------------------------------------;ALARM_CHECK;判断各路温度是否超标;-------------------------------------------CHECK1:MOV R0,TMP_INMOV R1,HI_TMP_SET_INLCALL ALARM_CALJZ ALARM_HI_NORMALSETB IN_LED_ALARM_HIJMP CHECK2ALARM_HI_NORMAL:CLR IN_LED_ALARM_HICHECK2:MOV R0,TMP_INMOV R1,LOW_TMP_SET_INLCALL ALARM_CALJNZ CCSETB IN_LED_ALARM_LOWJMP DDCC:CLR IN_LED_ALARM_LOW DD:MOV R0,TMP_OUTMOV R1,HI_TMP_SET_OUTLCALL ALARM_CALJZ EESETB OUT_LED_ALARM_HIJMP DDDEE:CLR OUT_LED_ALARM_HI DDD:MOV R0,TMP_OUTMOV R1,LOW_TMP_SET_OUTLCALL ALARM_CALJNZ FFSETB OUT_LED_ALARM_LOWJMP GGFF:CLR OUT_LED_ALARM_LOW GG:MOV R0,TMP_OUTMOV R1,HI_TMP_SET_FRONTLCALL ALARM_CALJZ HHSETB FRONT_LED_ALARM_HIJMP IIHH:CLR FRONT_LED_ALARM_HI II:MOV R0,TMP_OUTMOV R1,HI_TMP_SET_BACKLCALL ALARM_CALJZ JJSETB BACK_LED_ALARM_HIJMP ALARM_RET1JJ:CLR BACK_LED_ALARM_HI ALARM_RET1:RET;------------------------------------------;R0=R1A=2,R0<R1A=0,R0>R1A=1 ;比较大小;------------------------------------------ALARM_CAL:;R0,R1MOV A,R0SUBB A,R1JC SMALLMOV A,#01HJMP COMP_RETSMALL:MOV A,#0HCOMP_RET:RET;------------------------------------------;显示子程序;时分秒显示;------------------------------------------DISPLAY:MOV DPTR,#TABMOV A,TEMPER_LMOV B,#10DIV ABMOV R4,AMOV R5,BMOV A,R5;温度低位MOVC A,@A+DPTR;显示输出MOV DISPLAY_DATA,ASETB COM_TEMPERL_LLCALL DELAY5MSCLR COM_TEMPERL_LMOV A,R4MOVC A,@A+DPTR;显示输出MOV DISPLAY_DATA,ASETB COM_TEMPERL_HLCALL DELAY5MSCLR COM_TEMPERL_HMOV A,TEMPER_H;温度高位MOV B,#10DIV ABMOV R4,AMOV R5,BMOV A,R5MOVC A,@A+DPTR;显示输出ANL A,#7FH;MOV DISPLAY_DATA,ASETB COM_TEMPERH_LLCALL DELAY5MSCLR COM_TEMPERH_LMOV A,R4MOVC A,@A+DPTRMOV DISPLAY_DATA,ASETB COM_TEMPERH_HLCALL DELAY5MSCLR COM_TEMPERH_HMOV A,DS18B20_CONTINC AMOVC A,@A+DPTR;显示输出MOV DISPLAY_DATA,ASETB COM_DS18B20_NUMLCALL DELAY5MSCLR COM_DS18B20_NUMRET;------------------------------------------;键盘扫描程序;------------------------------------------KEY:;KEY_PORT,#0FFHMOV A,KEY_PORTCPL AANL A,#0F0HJZ RET1LCALL DELAY10MSMOV A,KEY_PORTCPL AANL A,#0F0HJZ RET1JB ACC.7,MODE_CHANGEJB ACC.6,MODE_DEC_JJB ACC.5,MODE_ADD_JJB ACC.4,NUM_ADD_JRET1:RETMODE_DEC_J:LJMP MODE_DECRETMODE_ADD_J:LJMP MODE_ADDRETNUM_ADD_J:LJMP NUM_ADDRETMODE_CHANGE:INC MODE_CONTMOV A,MODE_CONTCJNE A,#04H,MODE_RETMOV MODE_CONT,#00HSETB TR0MODE_RET:LCALL MODE_DEL WAIT:LCALL DISPLAYJNB P3.7,WAITRETMODE_DEL:MOV A,MODE_CONTCJNE A,#00H,MOD_1CLR LED_LOW_SETCLR LED_HI_SETCLR LED_CHECKSETB LED_NORMALRETMOD_1:CJNE A,#01H,MOD_2CLR LED_LOW_SETCLR LED_HI_SETSETB LED_CHECKCLR LED_NORMALCLR TR0RETMOD_2:CJNE A,#02H,MOD_3CLR LED_LOW_SETSETB LED_HI_SETCLR LED_CHECKCLR LED_NORMALCLR TR0RETMOD_3:SETB LED_LOW_SETCLR LED_HI_SETCLR LED_CHECKCLR LED_NORMALCLR TR0RET;-----------------------------------;----------------------------------MODE_DEC:;模式0MOV A,MODE_CONTCJNE A,#00H,MODE_DEC_1 WAIT1:LCALL DISPLAYJNB P3.6,WAIT1RETMODE_DEC_1:;模式1CJNE A,#01H,MODE_DEC_2MOV A,DS18B20_CONTCJNE A,#00H,MODE_DEC_11MOV DS18B20_CONT,#03H WAIT2:LCALL DISPLAYJNB P3.6,WAIT2RETMODE_DEC_11:DEC DS18B20_CONTWAIT3:LCALL DISPLAYJNB P3.6,WAIT3RETMODE_DEC_2:;模式2IN口CJNE A,#02H,MODE_DEC_3MOV A,DS18B20_CONTCJNE A,#00H,MODE_DEC_21DEC HI_TMP_SET_INMOV A,HI_TMP_SET_OUTJNZ MODE_DEC_DELMOV HI_TMP_SET_IN,#64H MODE_DEC_DEL:MOV TEMPER_H,HI_TMP_SET_INMOV TEMPER_L,#00HJMP MODE_DEC_RETMODE_DEC_21:;OUT口MOV A,DS18B20_CONTCJNE A,#01H,MODE_DEC_22DEC HI_TMP_SET_OUTMOV A,HI_TMP_SET_OUTJNZ MODE_DEC_RET1MOV HI_TMP_SET_OUT,#64H MODE_DEC_RET1:MOV TEMPER_H,HI_TMP_SET_OUTMOV TEMPER_L,#00HJMP MODE_DEC_RETMODE_DEC_22:;前点CJNE A,#02H,MODE_DEC_23DEC HI_TMP_SET_FRONTMOV A,HI_TMP_SET_FRONTJNZ MODE_DEC_RET2MOV HI_TMP_SET_FRONT,#64H MODE_DEC_RET2:MOV TEMPER_H,HI_TMP_SET_FRONT MOV TEMPER_L,#00HJMP MODE_DEC_RETMODE_DEC_23:;后点DEC HI_TMP_SET_BACKMOV A,HI_TMP_SET_BACKJNZ MODE_DEC_XMOV HI_TMP_SET_BACK,#64H MODE_DEC_X:MOV TEMPER_H,HI_TMP_SET_BACK MOV TEMPER_L,#00HMODE_DEC_RET:WAIT4:LCALL DISPLAYJNB P3.6,WAIT4RET;------------------------------------;-----------------------------------MODE_DEC_3:;模式3MOV A,DS18B20_CONTCJNE A,#00H,MODE_DEC_21BDEC LOW_TMP_SET_INMOV A,LOW_TMP_SET_INJNZ MODE_DEC_DELBMOV LOW_TMP_SET_IN,#64H MODE_DEC_DELB:MOV TEMPER_H,LOW_TMP_SET_IN MOV TEMPER_L,#00HJMP MODE_DEC_RETBMODE_DEC_21B:;OUT口MOV A,DS18B20_CONTCJNE A,#01H,MODE_DEC_RETBDEC LOW_TMP_SET_OUTMOV A,LOW_TMP_SET_OUTJNZ MODE_DEC_RET1BMOV LOW_TMP_SET_OUT,#64H MODE_DEC_RET1B:MOV TEMPER_H,LOW_TMP_SET_OUT MOV TEMPER_L,#00HMODE_DEC_RETB:WAIT5:LCALL DISPLAYJNB P3.6,WAIT5RET;-----------------------------------;----------------------------------MODE_ADD:MOV A,MODE_CONTCJNE A,#00H,MODE_ADD_1WAIT6:LCALL DISPLAYJNB P3.5,WAIT6RETMODE_ADD_1:;模式1CJNE A,#01H,MODE_ADD_2MOV A,DS18B20_CONTCJNE A,#03H,MODE_ADD_11MOV DS18B20_CONT,#00HWAIT7:LCALL DISPLAYJNB P3.5,WAIT7RETMODE_ADD_11:INC DS18B20_CONTWAIT8:LCALL DISPLAYJNB P3.5,WAIT8RETMODE_ADD_2:;模式2IN口CJNE A,#02H,MODE_ADD_3MOV A,DS18B20_CONTCJNE A,#00H,MODE_ADD_21INC HI_TMP_SET_INMOV A,HI_TMP_SET_OUTCJNE A,#64H,MODE_ADD_DELMOV HI_TMP_SET_IN,#00H MODE_ADD_DEL:MOV TEMPER_H,HI_TMP_SET_IN MOV TEMPER_L,#00HJMP MODE_ADD_RETMODE_ADD_21:;OUT口MOV A,DS18B20_CONTCJNE A,#01H,MODE_ADD_22INC HI_TMP_SET_OUTMOV A,HI_TMP_SET_OUTCJNE A,#64H,MODE_ADD_RET1MOV HI_TMP_SET_OUT,#00H MODE_ADD_RET1:MOV TEMPER_H,HI_TMP_SET_OUTMOV TEMPER_L,#00HJMP MODE_ADD_RETMODE_ADD_22:;前点CJNE A,#02H,MODE_ADD_23INC HI_TMP_SET_FRONTMOV A,HI_TMP_SET_FRONTCJNE A,#64H,MODE_ADD_RET2MOV HI_TMP_SET_FRONT,#00H MODE_ADD_RET2:MOV TEMPER_H,HI_TMP_SET_FRONT MOV TEMPER_L,#00HJMP MODE_ADD_RETMODE_ADD_23:;后点INC HI_TMP_SET_BACKMOV A,HI_TMP_SET_BACKCJNE A,#64H,MODE_ADD_XMOV HI_TMP_SET_BACK,#00HMODE_ADD_X:MOV TEMPER_H,HI_TMP_SET_BACKMOV TEMPER_L,#00HMODE_ADD_RET:WAIT9:LCALL DISPLAYJNB P3.5,WAIT9RET;------------------------------------;-----------------------------------MODE_ADD_3:;模式3MOV A,DS18B20_CONTCJNE A,#00H,MODE_ADD_21BINC LOW_TMP_SET_INMOV A,LOW_TMP_SET_INCJNE A,#64H,MODE_ADD_DELBMOV LOW_TMP_SET_IN,#00H MODE_ADD_DELB:MOV TEMPER_H,LOW_TMP_SET_IN MOV TEMPER_L,#00HJMP MODE_ADD_RETBMODE_ADD_21B:;OUT口MOV A,DS18B20_CONTCJNE A,#01H,MODE_ADD_RETBINC LOW_TMP_SET_OUTMOV A,LOW_TMP_SET_OUTCJNE A,#64H,MODE_ADD_RET1BMOV LOW_TMP_SET_OUT,#64H MODE_ADD_RET1B:MOV TEMPER_H,LOW_TMP_SET_OUT MOV TEMPER_L,#00HMODE_ADD_RETB:WAIT71:LCALL DISPLAYJNB P3.5,WAIT71RET;----------------------------------;----------------------------------NUM_ADD:INC DS18B20_CONTMOV A,DS18B20_CONTCJNE A,#04H,NUM_ADD_RETMOV DS18B20_CONT,#00HNUM_ADD_RET:WAIT81:LCALL DISPLAYJNB P3.5,WAIT81RET;--------------------------------DELAY;延时程序;----------------------------------DELAY5MS:MOV R1,#2;5mS延时#5D1:MOV R2,#248D2:DJNZ R2,D2DJNZ R1,D1RET;------------------------------------------10MS DELAY DELAY10MS:MOV R3,#25;10mS延时D4:MOV R4,#200D3:DJNZ R4,D3DJNZ R3,D4RET;**********DS18B20复位程序***************** INIT_18B20:SETB DQ1SETB DQ2SETB DQ3SETB DQ4NOPNOPNOPNOPCLR DQ1CLR DQ2CLR DQ3CLR DQ4MOV R0,#0FBHTSR1:DJNZ R0,TSR1;延时SETB DQ1SETB DQ2SETB DQ3SETB DQ4MOV R0,#25HTSR2:JNB DQ1,TSR3JNB DQ2,TSR3JNB DQ3,TSR3JNB DQ4,TSR3DJNZ R0,TSR2TSR3:SETB FLAG1;置标志位,表明DS18B20存在AJMP TSR5TSR4:CLR FLAG1LJMP TSR7TSR5:MOV R0,#06BHTSR6:DJNZ R0,TSR6TSR7:SETB DQ1;表明不存在RET;********************设定DS18B20暂存器设定值************** RE_CONFIG:JB FLAG1,RE_CONFIG1RETRE_CONFIG1:MOV A,#0CCH;放跳过ROM命令LCALL WRITE_18B20MOV A,#4EHLCALL WRITE_18B20;写暂存器命令MOV A,#00H;报警上限中写入00HLCALL WRITE_18B20MOV A,#00H;报警下限中写入00HLCALL WRITE_18B20MOV A,#7FH;选择12位温度分辨率LCALL WRITE_18B20RET;*****************读转换后的温度值**************** GET_TEMPER:MOV A,MODE_CONTJZ GET_NEXT;只有模式零才GETCJNE A,#02H,AARETAA:CJNE A,#03H,GET_NEXTRETGET_NEXT:SETB DQ1SETB DQ2SETB DQ3SETB DQ4LCALL INIT_18B20JB FLAG1,TSS2RET;若不存在则返回TSS2:MOV A,#0CCH;跳过ROMLCALL WRITE_18B20MOV A,#44H;发出温度转换命令LCALL WRITE_18B20LCALL INIT_18B20MOV A,#0CCH;跳过ROMLCALL WRITE_18B20MOV A,#0BEH;发出读温度换命令LCALL WRITE_18B20MOV A,DS18B20_CONTCJNE A,#00H,READ_1LCALL READ2_18B20LCALL CHANGE1MOV TMP_IN,TEMPER_HRETREAD_1:MOV A,DS18B20_CONTCJNE A,#01H,READ_2LCALL READ2_18B20_2LCALL CHANGE1MOV TMP_OUT,TEMPER_HRETREAD_2:MOV A,DS18B20_CONTCJNE A,#02H,READ_3LCALL READ2_18B20_3LCALL CHANGE1MOV TMP_FRONT,TEMPER_HRETREAD_3:LCALL READ2_18B20_4;读两个字节的温度LCALL CHANGE1MOV TMP_BACK,TEMPER_HRET;**************************************;***************写DS18B20程序************ WRITE_18B20:MOV R2,#8CLR CWR1:CLR DQ1CLR DQ2CLR DQ3CLR DQ4MOV R3,#6DJNZ R3,$RRC AMOV DQ1,CMOV DQ2,CMOV DQ3,CMOV DQ4,CMOV R3,#23DJNZ R3,$SETB DQ1SETB DQ2SETB DQ3SETB DQ4NOPDJNZ R2,WR1SETB DQ1SETB DQ2SETB DQ3SETB DQ4RET;***********读18B20程序,读出两个字节的温度*********READ2_18B20:MOV R4,#2;低位存在29H,高位存在TEMPER_H MOV R1,#TEMPER_LRE00:MOV R2,#8RE01:CLR CSETB CNOPNOPCLR DQ1NOPNOPSETB DQ1MOV R3,#7DJNZ R3,$MOV C,DQ1MOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV@R1,ADEC R1DJNZ R4,RE00RET;***********读18B20_2程序,读出两个字节的温度********* READ2_18B20_2:MOV R4,#2;低位存在29H,高位存在TEMPER_H MOV R1,#TEMPER_LRE001:MOV R2,#8RE012:CLR CSETB CNOPCLR DQ2NOPNOPNOPSETB DQ2MOV R3,#7DJNZ R3,$MOV C,DQ2MOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE012MOV@R1,ADEC R1DJNZ R4,RE001RET;***********读18B20_3程序,读出两个字节的温度********* READ2_18B20_3:MOV R4,#2;低位存在29H,高位存在TEMPER_H MOV R1,#TEMPER_LRE002:MOV R2,#8RE013:CLR CSETB CNOPNOPCLR DQ3NOPNOPNOPSETB DQ3MOV R3,#7DJNZ R3,$MOV C,DQ3MOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE013MOV@R1,ADEC R1DJNZ R4,RE002RET;***********读18B20_3程序,读出两个字节的温度********* READ2_18B20_4:MOV R4,#2;低位存在29H,高位存在TEMPER_H MOV R1,#TEMPER_LRE003:MOV R2,#8RE014:CLR CSETB CNOPNOPCLR DQ4NOPNOPNOPSETB DQ4MOV R3,#7DJNZ R3,$MOV C,DQ4MOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE014MOV@R1,ADEC R1DJNZ R4,RE003RET;************读出的温度进行数据转换**************CHANGE1:MOV A,MODE_CONTJZ CHANGE1_NEXT;只有模式零和1才GETCJNE A,#02H,BBRETBB:CJNE A,#03H,CHANGE1_NEXTRETCHANGE1_NEXT:MOV A,TEMPER_LANL A,#0FHMOV B,#6HMUL ABMOV R0,AMOV A,TEMPER_LMOV C,TEMPER_H.0;将TEMPER_H中的最低位移入C RRC AMOV C,TEMPER_H.1RRC AMOV C,TEMPER_H.2RRC AMOV C,TEMPER_H.3RRC AMOV TEMPER_H,AMOV TEMPER_L,R0RET;***********************************D1MS:MOV R7,#80;1MS延时(按12MHZ算)DJNZ R7,$RET;*************************TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HEND;DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,0H;共阴极LED;END。

DS18B20汇编程序

DS18B20汇编程序

DS18B20汇编程序,1602液晶显示 2006-1-13 9:44:34TEMPER_L EQU 36HTEMPER_H EQU 35HTEMPER_NUM EQU 60HFLAG1 BIT 00HDQ BIT P3.3RS EQU P3.7 ;RS <---->P2.0RW EQU P3.6 ;R/W <--->P2.1E EQU P3.5 ;E <----->P2.2LCD_DB EQU P1AAA:MOV SP,#70HLCALL GET_TEMPERLCALL TEMPER_COVLCALL DISPLAY;调用显示子程序LJMP AAANOP;------------------读出转换后的温度值GET_TEMPER:SETB DQ ; 定时入口BCD:LCALL INIT_1820JB FLAG1,S22LJMP CC ; 若DS18B20不存在则返回S22:LCALL DELAY1MOV A,#0CCH ; 跳过ROM匹配------0CCLCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820NOPLCALL DELAYLCALL DELAYCBA:LCALL INIT_1820JB FLAG1,ABCLJMP CBAABC:LCALL DELAY1MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200 ;READ_1820RET;------------------读DS18B20的程序,从DS18B20中读出一个字节的数据READ_1820:MOV R2,#8RE1:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE1RET;-------------------写DS18B20的程序WRITE_1820:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRET;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)RE00:MOV R2,#8RE01:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;-------------------将从DS18B20中读出的温度数据进行转换TEMPER_COV:MOV A,#0F0HANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值SWAP AMOV TEMPER_NUM,AMOV A,TEMPER_LJNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值INC TEMPER_NUMTEMPER_COV1:MOV A,TEMPER_HANL A,#07HSWAP AORL A,TEMPER_NUMMOV TEMPER_NUM,A ; 保存变换后的温度数据LCALL BIN_BCDRET;-------------------将16进制的温度数据转换成压缩BCD码BIN_BCD:MOV DPTR,#TEMP_TABMOV A,TEMPER_NUMMOVC A,@A+DPTRMOV TEMPER_NUM,ARETTEMP_TAB:DB 00H,01H,02H,03H,04H,05H,06H,07H DB 08H,09H,10H,11H,12H,13H,14H,15H DB 16H,17H,18H,19H,20H,21H,22H,23H DB 24H,25H,26H,27H,28H,29H,30H,31H DB 32H,33H,34H,35H,36H,37H,38H,39H DB 40H,41H,42H,43H,44H,45H,46H,47H DB 48H,49H,50H,51H,52H,53H,54H,55H DB 56H,57H,58H,59H,60H,61H,62H,63H DB 64H,65H,66H,67H,68H,69H,70H,71H DB 72H,73H,74H,75H,76H,77H,78H,79H DB 80H,81H,82H,83H,84H,85H,86H,87H DB 88H,89H,90H,91H,92H,93H,94H,95HDB 96H,97H,98H,99H;-------------------DS18B20初始化程序INIT_1820:SETB DQNOPCLR DQMOV R0,#80HTSR1:DJNZ R0,TSR1 ; 延时SETB DQMOV R0,#25H ;96US-25HTSR2:DJNZ R0,TSR2JNB DQ,TSR3LJMP TSR4 ; 延时TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在LJMP TSR5TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在LJMP TSR7TSR5:MOV R0,#06BH ;200USTSR6:DJNZ R0,TSR6 ; 延时TSR7:SETB DQRET;------------------重新写DS18B20暂存存储器设定值RE_CONFIG:JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1RETRE_CONFIG1:MOV A,#0CCH ; 发SKIP ROM命令LCALL WRITE_1820MOV A,#4EH ; 发写暂存存储器命令LCALL WRITE_1820MOV A,#00H ; TH(报警上限)中写入00HLCALL WRITE_1820MOV A,#00H ; TL(报警下限)中写入00HLCALL WRITE_1820MOV A,#7FH ; 选择12位温度分辨率LCALL WRITE_1820RET;------------------延时子程序DELAY:MOV R7,#00HMIN:DJNZ R7,YS500RETYS500:LCALL YS500USLJMP MINYS500US:MOV R6,#00HDJNZ R6,$RETDELAY1:MOV R7,#20HDJNZ R7,$RET;显示子程序display:ACALL LCD_INTMOV P1,#01H ;清屏ACALL ENABLEMOV P1,#81HLCALL ENABLEMOV P1,#'T'LCALL WRITERMOV P1,#'='LCALL WRITERCLR CLJMP DISP3RET;说明:使用前,必须先对液晶显示模块进行初始化。

DS18B20汇编程序(完整版)

DS18B20汇编程序(完整版)

DS18B20汇编程序;实验目的:熟悉DS18B20的使用;六位数码管显示温度结果,其中整数部分2位,小数部分4位;每次按下RB0键后进行一次温度转换。

;硬件要求:把DS18B20插在18B20插座上; 拨码开关S10第1位置ON,其他位置OFF; 拨码开关S5、S6全部置ON,其他拨码开关全部置OFF;*****************以下是暂存器的定义*****************************#INCLUDE<P16F877A.INC>#DEFINE DQ PORTA,0 ;18B20数据口__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS _OSCCBLOCK 20HDQ_DELAY1DQ_DELAY2TEMPTEMP1TEMP2 ;存放采样到的温度值TEMP3COUNTCOUNT1ENDCTMR0_VALUE EQU 0AH ;寄存器初值为6,预分频比1:4,中断一次时间为4*(256-6)=1000usDQ_DELAY_VALUE1 EQU 0FAHDQ_DELAY_VALUE2 EQU 4H;**********************以下是程序的开始************************ ORG 00HNOPGOTO MAIN ;入口地址ORG 04HRETFIE ;在中断入口出放置一条中断返回指令,防止干扰产生中断TABLEADDWF PCL,1RETLW 0C0H ;0的编码(公阳极数码管)RETLW 0F9H ;1的编码RETLW 0A4H ;2的编码RETLW 0B0H ;3的编码RETLW 99H ;4的编码RETLW 92H ;5的编码RETLW 082H ;6RETLW 0F8H ;7RETLW 080H ;8RETLW 090H ;9;***************************主程序******************************* MAINCLRF PORTACLRF PORTBBANKSEL TRISACLRF TRISA ;A口所有先设置为输出CLRF TRISDMOVLW 01HMOVWF TRISB ;B0口为输入,其他为输出MOVLW 06HMOVWF ADCON1 ;关闭所有A/D口MOVLW 01HMOVWF OPTION_REG ;分频比1:4,定时器,内部时钟源BCF STATUS,RP0CLRF TEMPCLRF TEMP1CLRF TEMP2 ;清零临时寄存器MOVLW 8HMOVWF COUNTMOVLW 38HMOVWF FSRCLRF INDFINCF FSR,1DECFSZ COUNT,1GOTO $-3;****************************循环处理部分************************;先启动18B20温度转换程序,在判断温度转换是否完成(需750us);未完成则调用显示子程序,直到完成温度转换;完成后读取温度值;送LCD显示LOOPBTFSC PORTB,0 ;判断温度转换按键是否按下GOTO LOOP1 ;否,转显示CALL DELAY ;消抖BTFSC PORTB,0 ;再次判断GOTO LOOP1CALL RESET_18B20 ;调用复位18B20子程序MOVLW 0CCHMOVWF TEMPCALL WRITE_18B20 ;SKIP ROM命令MOVLW 44HMOVWF TEMPCALL WRITE_18B20 ;温度转换命令CLRF STATUSCALL DELAY_750MS ;调用温度转换所需要的750MS延时NOPCALL RESET_18B20MOVLW 0CCHMOVWF TEMPCALL WRITE_18B20 ;SKIP ROM命令MOVLW 0BEHMOVWF TEMPCALL WRITE_18B20 ;读温度命令CALL READ_18B20 ;调用读温度低字节MOVFW TEMPMOVWF TEMP1 ;保存到TEMP1CALL READ_18B20 ;调用读温度高字节MOVFW TEMPMOVWF TEMP2 ;保存到TMEP2CALL RESET_18B20LOOP1CALL TEMP_CHANGE ;调用温度转换程序CALL DISPLAY ;调用LCD显示程序GOTO LOOP ;循环工作;*********************复位DS18B20子程序************************** RESET_18B20;根据DATASHEET介绍,写数据时应遵照如下规定:;主控制器把总线拉低至少480us,;18B20等待15-60us后,把总线拉低做为返回给控制器的应答信号BANKSEL TRISABCF TRISA,0BCF STATUS,RP0BCF DQMOVLW 0A0HMOVWF COUNT ;160USDECFSZ COUNT,1GOTO $-1 ;拉低480usBSF DQ ;释放总线MOVLW 14HMOVWF COUNTDECFSZ COUNT,1GOTO $-1 ;等待60usBANKSEL TRISABSF TRISA,0 ;DQ设置为输入BCF STATUS,RP0BTFSC DQ ;数据线是否为低GOTO RESET_18B20 ;否则继续复位MOVLW 4HMOVWF COUNTDECFSZ COUNT,1 ;延时一段时间后再次判断GOTO $-1BTFSC DQGOTO RESET_18B20MOVLW 4BHMOVWF COUNTDECFSZ COUNT,1GOTO $-1BANKSEL TRISABCF TRISA,0 ;DQ设置为输出BCF STATUS,RP0RETURN;*********************写DS18B20子程序**************************** WRITE_18B20;根据DATASHEET介绍,写数据时应遵照如下规定:;写数据0时,主控制器把总线拉低至少60us;写数据1时,主控制器把总线拉低,但必须在15us内释放MOVLW 8HMOVWF COUNT ;8位数据BANKSEL TRISABCF TRISA,0BCF STATUS,RP0BCF STATUS,CWRITE_18B20_1BSF DQ ;先保持DQ为高MOVLW 5HMOVWF COUNT1BCF DQ ;拉低DQ15usDECFSZ COUNT1,1GOTO $-1RRF TEMP,1BTFSS STATUS,C ;判断写的数据为0还是1GOTO WRITE_0BSF DQ ;为1,立即拉高数据线GOTO WRITE_ENDWRITE_0BCF DQ ;继续保持数据线为低WRITE_ENDMOVLW 0FHMOVWF COUNT1 ;保持45msDECFSZ COUNT1,1GOTO $-1BSF DQ ;释放总线DECFSZ COUNT,1 ;是否写完8位数据GOTO WRITE_18B20_1RETURN;**********************读DS18B20子程序**************************** READ_18B20;根据DATASHEET介绍,读数据时应遵照如下规定:;读数据0时,主控制器把总线拉低后,18B20再把总线拉低60us;读数据1时,主控制器把总线拉低后,保持总线状态不变;主控制器在数据线拉低后15us内读区数据线上的状态。

(整理)温度传感器DS18b20介绍和汇编度温度程序

基于proteus的51单片机仿真实例六十七、单总线温度传感器DS18B20读写实例标签: proteus温度传感器单片机单总线实例2010-02-20 01:031、I2C总线器件与单片机之间的通信需要两根线,而单总线器件与单片机间的数据通信只要一根线。

单总线适用于单主机系统,能够控制一个或多个从机设备。

主机通常是单片机,从机可以是单总线器件,他们之间通过一条信号线进行数据交换,单总线上同样允许挂接多个单总线器件,因此,每隔单总线器件必须有各自固定的地址,但总线器件通常需要接一个4.7k左右的上拉电阻,这样,当总线空闲时,状态为高电平。

2、单总线器件的数据操作过程1)初始化单总线上的所有处理均从初始化开始,单片机先发送一个复位脉冲,当单总线其间接收到复位脉冲后,先单片机发出应答信号,以便通知单片机:该器件已经准备好等待下一步操作2)识别单总线器件总线上允许挂接多个但总线器件,为便于单片机识别,每个单总线器件在出厂前都分配好了64为序列号以作为地址序列码。

所以单片机能够根据该序列号来识别和判断对那一个单总线器件进行操作3)数据交换单片机与单总线器件之间的数据交换必须遵循严格的通信协议。

单总线协议定义了复位信号,应答信号,写/读0,写/读1的集中信号类型,所有的单总线命令都是由这些基本的信号类型组成的,除了应答信号外,其余信号都由单片机发出,并且发送的所有命令和数据都是低位在前,高位在后。

3、DS18B20的工作时序1)初始化单片机将数据线拉低480-960us后释放,等待15-60us,单总线器件即可输出一个持续时间为60-240us的低电平(应答信号),单片机受到此应答后即可进行后续操作2)写时序当主机将数据线的电平从高拉到低时,形成写时序,有写0和写1两种时序。

写时序开始后,DS18B20在15-60us期间从数据线上采样,如果采样到低电平,则向DS18B20写0,否则写1,两个独立的时序之间至少需要1us的回复时间按(拉高总线电平)3)读时序当主机从DS18B20读取数据时,产生读时序,此时,主机将数据线的电平从高拉到低使读时序被初始化。

基于PIC16F877的DS18B20驱动程序

uchar read_byte(void) //从低位开始读.
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
DQ=1;
NOP();
NOP();
NOP();
NOP();
NOP();
dat>>=1;
DQ=0;
DQ_IN(); //定义成输入
dec=(uchar)(templ*50/8)%10; //将小数的第二位作为整数取出(templ*6.25)%10
templ=(templ*5)/8; //温度的小数部分扩大十倍(小数部分为*0.0625)
if(dec>=5)
{
templ+=1;
}
value=value*10+templ; //整数部分扩大十倍加扩大十倍后的小数部分
delay(160);
DQ=1;
DQ_IN();
delay(16); //等待DS18B20发出低电平应答
// n=DQ; //如果在工程中,并不知道总线上有没有挂测温设备,就需要返回n进行判断,n=0表示有设备
// while(DQ);
DQ_OUT();
DQ=1; //释放数据线
delay(2);
}
/*----------------------------------------
函数名称:read_byte()
作者 : haijun_zhang
入口参数:无
出口参数:dat
功能描述:从DS18B20读一个字节的数据
------------------------------------------*/

ds18b20汇编设计报告计划附电路图及程序

鉴于 AT89C51 单片机和 DS18B20 的数字温度计1课题说明跟着现代信息技术的飞快发展和传统工业改造的逐渐实现,能够独立工作的温度检测和显示系统应用于诸多领域。

传统的温度检测以热敏电阻为温度敏感元件。

热敏电阻的成本低,但需后续信号办理电路,并且靠谱性相对较差,测温正确度低,检测系统也有必定的偏差。

这里设计的数字温度计拥有读数方便,测温范围广,测温精准,数字显示,合用范围宽等特色。

本设计采纳 AT89C51型单片机作为主控制器件, DS18B20作为测温传感器 ,经过 LCD1602实现温度显示。

经过DS18B20直接读取被测温度值,进行数据变换,该器件的物理化学性能稳固,线性度较好,在 0℃~ 100℃最大线性偏差小于℃。

该器件可直接向单片机传输数字信号,便于单片机办理及控制。

此外,该温度计还可以直接采纳测温器件丈量温度,从而简化数据传输与办理过程。

2实现方法采纳数字温度芯片DS18B20 丈量温度,输出信号全数字化。

采纳了单总线的数据传输,由数字温度计 DS18B20和 AT89C51 单片机构成的温度丈量装置 ,它直接输出温度的数字信号 ,也可直接与计算机连结。

采纳 AT89C51单片机控制,软件编程的自由度大,可经过编程实现各种各种的算术算法和逻辑控制,并且体积小,硬件实现简单,安装方便。

该系统利用AT89S51芯片控制温度传感器 DS18B20进行及时温度检测并显示,能够实现迅速丈量环境温度,并能够依据需要设定上下限温度。

该系统扩展性特别强。

该测温系统电路简单、精准度较高、实现方便、软件设计也比较简单。

系统框图如图 1 所示。

电源电路LED 显示复位电路AT89C51DS18B20温度传感器时钟振荡电路图 1 DS18B20 温度测温系统框图3硬件设计单片机最小系统设计3.1.1 电源电路13VCCVin LM7805+5VVCC+12VD+5VNGR+ C12+ C34 70 uFC2 4 70 uFC2 1 K0.1u F0.1u FLEDGND图 2 电源电路3.1.2 振荡电路与复位电路XTAL1C1 30pF晶振12MHzAT89C51C2 30pFXTAL2图 3 振荡电路DS18B20与单片机的接口电路VCCR1AT89C51DS18B201 23VCCVccRESETR1C120022uFRST AT89C51R2 1KVss图 4 复位电路图 5DS18B20 与单片机的接口电路PROTEUS 仿真电路图图 6 PROTEUS仿真电路图4软件设计系统程序主要包含主程序、读取温度子程序、数据变换子程序、显示数据子程序等。

DS18B20汇编程序

FLAG BIT 00H;DS18B20存在标志位DQ BIT P3.7WD_L EQU 28HWD_H EQU 29H************程序起始********************ORG 0000HAJMP STARTORG 0030H**************主程序开始************START:MOV SP,#70HLCALL INIT_18B20LCALL RE_CONFIGLCALL GET_WDAJMP CHANGE**********DS18B20复位程序*****************INIT_18B20:SETB DQNOPCLR DQMOV R0,#0FBHDJNZ R0,$;延时SETB DQMOV R0,#25HDJNZ R0,$JNB DQ,TSR1AJMP TSR2TSR1:SETB FLAG;置标志位,表明DS18B20存在AJMP TSR3TSR2:CLR FLAG;清标志位,表明DS18B20不存在AJMP TSR4TSR3:MOV R0,#6BHDJNZ R0,$TSR4:SETB DQ;拉高总线RET********************设定DS18B20暂存器设定值************** RE_CONFIG:JB FLAG,RE_CONFIG1RETRE_CONFIG1:MOV A,#0CCH;放跳过ROM命令LCALL WRITE_18B20MOV A,#4EHLCALL WRITE_18B20 ;写暂存器命令MOV A,#00H ;报警上限中写入00HLCALL WRITE_18B20MOV A,#00H;报警下限中写入00HLCALL WRITE_18B20MOV A,#1FH;选择九位温度分辨率LCALL WRITE_18B20RET*****************读转换后的温度值****************GET_WD:SETB DQLCALL INIT_18B20JB FLAG,TSS1RET;若不存在则返回TSS1:MOV A,#0CCH;跳过ROMLCALL WRITE_18B20MOV A,#44H;发出温度转换命令LCALL WRITE_18B20LCALL DISPLAY;延时LCALL INIT_18B20MOV A,#0CCH;跳过ROMLCALL WRITE_18B20MOV A,#0BEH;发出读温度命令LCALL WRITE_18B20LCALL READ2_18B20;读两个字节的温度RET***************写DS18B20程序************WRITE_18B20:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRET***********读18B20程序,读出两个字节的温度*********READ2_18B20:MOV R4,#2MOV R1,#28H;低位存在28H,高位存在29H RE00:MOV R2,#8RE01:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,AINC R1DJNZ R4,RE00RET************读出的温度进行数据转换************** CHANGE:MOV A,28HMOV C,29H.0;将29H中的最低位移入CRRC AMOV C,29H.1RRC AMOV C,29H.2RRC AMOV C,29H.3RRC AMOV 28H,ALCALL DISPLAY;调用数码管显示子程序LJMP MAIN*******************DISPLAY******DISPLAY:MOV A,28H;将28H中的十六进制数转换成10进制MOV B,#10;10进制/10=10进制DIV ABMOV SHI,A;十位在SHIMOV GW,B;个位在GWMOV DPTR,#TAB ;指定查表启始地址 MOV A,GW ;取个位数MOVC A,@A+DPTR ;查个位数的7段代码MOV 34H,A;送出个位的7段代码MOV A,SHI;取十位数MOVC A,@A+DPTR ;查十位数的7段代码MOV 35H,A;送出十位的7段代码RET。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;************************************************************************;功能实现:通过DS18B20来读取温度,显示在2位LED上,精确到1度;硬件连接:(1)RC0-RC7接共阳数码管的段码A-H; RA0-RA3接共阳数码管的位码DIG0-DIG3;***********************************************************************;***********************************************************************;定义单片机型号为PIC16F877A;程序包含文件:P16F877A.INC;定义配置字;***********************************************************************LIST P=16F877A ;定义本程序所使用的芯片为PIC16F877A#INCLUDE "P16F877A.INC" ;定义本程序包含该文件__CONFIG 3F72H ;晶振配置HS,看门狗禁止,上电延时使能,掉电复位使能;低电压编程禁止,代码不保护#DEFINE DQ PORTB,2#DEFINE DIR TRISB,2CBLOCK 20HY1Y2COUNT1COUNT2COMDDATEBIN_L ;要进行转换的字节GE ;转换后的个位SHI ;转换后的十位DATE_LDATE_HENDC;***********************************************************************;复位矢量定义(对于16F877A);***********************************************************************ORG 0000H ;复位矢量地址GOTO MAIN ;程序跳转到MAIN主程序;----------------------------------------------------------------------;*********************************************************************** ;主程序区;*********************************************************************** ORG 0005HMAINNOPCALL INTIALSTART BTFSS DQ ;数据线空闲状态为高电平GOTO $-1CALL RESET ;复位DS18B20MOVLW 0CCH ;跳过读ROM命令CALL WR18B20MOVLW 44H ;温度转换CALL WR18B20CALL DELAY_750US ;延时750usCALL RESET ;复位DS18B20MOVLW 0CCH ;跳过读ROM命令CALL WR18B20MOVLW 0BEH ;读内部RAM中的9字节内容CALL WR18B20NOPCALL RE18B20 ;读数据MOVF DATE,WMOVWF DATE_L ;读低8位CALL RE18B20 ;读数据MOVF DATE,WMOVWF DATE_H ;读高8位MOVF DATE_L,W;------------------------显示处理-------------------------------------- RRF DATE_H,FRRF DATE_L,FRRF DATE_H,FRRF DATE_L,FRRF DATE_H,FRRF DATE_L,FRRF DATE_H,FRRF DATE_L,FMOVF DATE_L,WMOVWF BIN_L ;把高8位的低4位和低8位的高4位组合起来CALL DISPLAY ;调用数码管显示程序GOTO START;=======================================================================;***********************************************************************;初始化和消影;***********************************************************************INTIAL BSF STATUS,RP0 ;定义当前体为体1,对方向寄存器进行修改MOVLW 07HMOVWF ADCON1 ;关闭A口的模拟通道MOVLW 00HMOVWF TRISC ;段码显示口为输出口MOVLW 0F0HANDWF TRISA,1 ;使位码(RA0-RA3)为输出口BSF DIR ;使数据线为输入BCF STATUS,RP0 ;使当前体为体0MOVLW 0FFH ;关闭段码MOVWF PORTCMOVLW 0FFH ;关闭位码MOVWF PORTABTFSS DQ ;数据线空闲状态为高电平GOTO $-1CALL RESET ;复位DS18B20MOVLW 0CCH ;跳过读ROM命令CALL WR18B20MOVLW 44H ;温度转换CALL WR18B20CALL DELAY_750US ;延时750usCALL RESET ;复位DS18B20MOVLW 0CCH ;跳过读ROM命令CALL WR18B20MOVLW 0BEH ;读内部RAM中的9字节内容CALL WR18B20NOPNOPCALL RE18B20 ;读数据CALL RE18B20 ;读数据CALL DELAY_MAX ;延时600msCALL DELAY_MAXCALL DELAY_MAXRETLW 00H;=======================================================================;***********************************************************************;显示所测得的温度子程序;***********************************************************************DISPLAYCALL _BCDMOVF SHI,WANDLW 0FHCALL TABLE ;调用查表指令MOVWF PORTC ;显示十位段码BCF PORTA,0 ;选通十位显示位码CALL DELAYBSF PORTA,0 ;关闭十位显示位码MOVF GE,WANDLW 0FHCALL TABLE ;调用查表指令MOVWF PORTC ;显示个位段码BCF PORTA,1 ;选通个位显示位码CALL DELAYBSF PORTA,1 ;关闭个位显示位码RETLW 00H;=======================================================================;***********************************************************************;二进制转BCD码;***********************************************************************_BCD CLRF SHI ;保存地址清零CLRF GEMOVF BIN_L,F ;组合码自己给自己赋值,测试是否为0SKPNZ ;不为0则跳到下一步RETLW 00HSHI_ MOVLW D'10'SUBWF BIN_L,W ;BIN_L减10,结果存到W寄存器BTFSS STATUS,C ;执行减法后,如果无借位GOTO GE_MOVWF BIN_LINCF SHIGOTO SHI_GE_ MOVF BIN_L,WMOVWF GERETLW 00H;=======================================================================;***********************************************************************;延时200ms;***********************************************************************DELAY_MAXMOVLW 0FFHMOVWF Y1MOVLW 0FFHMOVWF Y2DECFSZ Y2GOTO $-1DECFSZ Y1GOTO $-5RETLW 00H;=======================================================================;***********************************************************************;延时6ms;***********************************************************************DELAYMOVLW 03FHMOVWF Y1MOVLW 020HMOVWF Y2DECFSZ Y2GOTO $-1DECFSZ Y1GOTO $-5RETLW 00H;=======================================================================;***********************************************************************;延时750us子程序;***********************************************************************DELAY_750USMOVLW 09HMOVWF Y1MOVLW 01AHMOVWF Y2DECFSZ Y2GOTO $-1DECFSZ Y1GOTO $-5RETLW 00H;=======================================================================;***********************************************************************;查表子程序,用于显示段码数字;数码管为共阳数码管;***********************************************************************TABLEADDWF PCL,FRETLW 0C0H ;"0"RETLW 0F9H ;"1"RETLW 0A4H ;"2"RETLW 0B0H ;"3"RETLW 99H ;"4"RETLW 92H ;"5"RETLW 82H ;"6"RETLW 0F8H ;"7"RETLW 80H ;"8"RETLW 90H ;"9";=======================================================================;***********************************************************************;DS18B20复位和应答子程序;***********************************************************************RESET BSF STATUS,RP0 ;使当前体为体1BCF DIR ;使数据位为输出BCF STATUS,RP0 ;使当前体为体0BSF DQ ;拉高数据位NOP ;空循环BCF DQ ;拉低数据位MOVLW D'200' ;延时600usMOVWF Y1DECFSZ Y1GOTO $-1BSF STATUS,RP0 ;使当前体为体1BSF DIR ;使数据位为输入BCF STATUS,RP0 ;使当前体为体0MOVLW D'30' ;延时90usMOVWF Y1DECFSZ Y1GOTO $-1BTFSC DQ ;主机接收到低电平应答脉冲,跳转到下一句GOTO RESETMOVLW D'80' ;延时240usMOVWF Y1DECFSZ Y1GOTO $-1BTFSS DQ ;主机接收到高电平应答脉冲,跳转到下一句GOTO RESETRETLW 00H ;返回00H,复位应答结束;========================================================================;***********************************************************************;写DS18B20子程序;***********************************************************************WR18B20MOVWF COMD ;把要写的数据写到COMD内MOVLW D'8'MOVWF COUNT2 ;大循环8次WR0 BSF STATUS,RP0 ;使当前体为体1BCF DIR ;使数据位为输出BCF STATUS,RP0 ;使当前体为体0BCF DQ ;拉低数据线NOPNOPMOVLW D'2'MOVWF COUNT1 ;延时9usWR1 DECFSZ COUNT1,1GOTO WR1BTFSC COMD,0 ;COMD最低位为0则跳转到下一句BSF DQ ;拉高数据线BTFSC COMD,0 ;COMD最低位为0则跳转到下一句NOPBCF STATUS,C ;进位位置0RRF COMD,1 ;带进位位,COMD向右移一位MOVLW D'20' ;延时60usMOVWF COUNT1WR2 DECFSZ COUNT1,1GOTO WR2BSF DQ ;拉高数据线,空闲状态BSF STATUS,RP0 ;使当前体为体1BSF DIR ;使数据位为输入BCF STATUS,RP0 ;使当前体为体0DECFSZ COUNT2,1 ;8次循环到了则跳出GOTO WR0RETLW 00H;=======================================================================;***********************************************************************;读18B20子程序;***********************************************************************RE18B20MOVLW 8MOVWF COUNT2RE0 BSF STATUS,RP0 ;使当前体为体1BCF DIR ;使数据位为输出BCF STATUS,RP0 ;使当前体为体0BCF DQMOVLW 2MOVWF COUNT1RE1 DECFSZ COUNT1,1GOTO RE1BSF STATUS,RP0 ;使当前体为体1BSF DIR ;使数据位为输入BCF STATUS,RP0 ;使当前体为体0NOPBTFSS DQ ;如果数据线为高电平,则C=1BCF STATUS,CBTFSC DQ ;如果数据线为低电平,则C=0BSF STATUS,CRRF DATE,1 ;数据依次存在DATE上MOVLW D'20' ;延时60usMOVWF COUNT1RE2 DECFSZ COUNT1,1GOTO RE2DECFSZ COUNT2,1GOTO RE0BSF DQRETLW 00H;=======================================================================;======================================================================= END ;程序结束。

相关文档
最新文档