基于18B20的51单片机温度控制器汇编程序

合集下载

51单片机控制DS18B20测温的PID温控程序

51单片机控制DS18B20测温的PID温控程序

51单片机控制DS18B20测温的PID温控程序51单片机控制DS18B20测温的PID温控程序#include;#include;#include;#include;struct PID {unsigned int SetPoint; // 设定目标 Desired Value unsigned int Proportion; // 比例常数 Proportional Constunsigned int Integral; // 积分常数 Integral Const unsigned int Derivative; // 微分常数 Derivative Constunsigned int LastError; // Error[-1]unsigned int PrevError; // Error[-2]unsigned int SumError; // Sums of Errors};struct PID spid; // PID Control Structure unsigned int rout; // PID Response (Output) unsigned int rin; // PID Feedback (Input) sbit data1=P1^0;sbit clk=P1^1;sbit plus=P2^0;sbit subs=P2^1;sbit stop=P2^2;sbit output=P3^4;sbit DQ=P3^3;unsigned char flag,flag_1=0;unsigned char high_time,low_time,count=0;//占空比调节参数unsigned char set_temper=35;unsigned char temper;unsigned char i;unsigned char j=0;unsigned int s;void delay(unsigned char time){unsigned char m,n;for(n=0;nfor(m=0;m;>;i;temp=temp&1;write_bit(temp);}delay(7);// TR0=1;EA=1;}unsigned char read_bit(){unsigned char i,value_bit;EA=0;DQ=0;_nop_();_nop_();DQ=1;for(i=0;i;>;4;temper=i|j;}void PIDInit (struct PID *pp){memset ( pp,0,sizeof(struct PID)); //全部初始化为0 }unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) {unsigned int dError,Error;Error = pp->;SetPoint - NextPoint; // 偏差pp->;SumError += Error; // 积分dError = pp->;LastError - pp->;PrevError; // 当前微分pp->;PrevError = pp->;LastError;pp->;LastError = Error;return (pp->;Proportion * Error // 比例项+ pp->;Integral * pp->;SumError // 积分项+ pp->;Derivative * dError); // 微分项}void compare_temper(){unsigned char i;if(set_temper>;temper) //是否设置的温度大于实际温度{if(set_temper-temper>;1) //设置的温度比实际的温度是否是大于1度{high_time=100; //如果是,则全速加热low_time=0;}else //如果是在1度范围内,则运行PID计算 {for(i=0;i;0){high_time=0;low_time=100;}else{for(i=0;i;>;1;if(m==1)data1=1;elsedata1=0;_nop_();clk=1;_nop_();}}}void display(){unsigned char codenumber[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0 ,0xfe,0x f6};unsigned char disp_num[6];unsigned int k,k1;k=high_time;k=k00;k1=k/100;if(k1==0)disp_num[0]=0;elsedisp_num[0]=0x60;k=k0;disp_num[1]=number[k/10];disp_num[2]=number[k];k=temper;k=k0;disp_num[3]=number[k/10];disp_num[4]=number[k]+1;disp_num[5]=number[s/10];disp_1(disp_num);}void main(){unsigned char z;unsigned char a,b,flag_2=1,count1=0;unsigned char phil[]={2,0xce,0x6e,0x60,0x1c,2}; TMOD=0x21;TH0=0x2f;TL0=0x40;SCON=0x50;PCON=0x00;TH1=0xfd;TL1=0xfd;PS=1;EA=1;EX1=0;ET0=1;ES=1;TR0=1;TR1=1;high_time=50;low_time=50;PIDInit ( &spid ); // Initialize Structure spid.Proportion = 10; // Set PID Coefficients 比例常数 Proportional Constspid.Integral = 8; //积分常数 Integral Const spid.Derivative =6; //微分常数Derivative Const spid.SetPoint = 100; // Set PIDSetpoint 设定目标Desired Valuewhile(1){if(plus==0){EA=0;for(a=0;a;5)temper=a;elsetemper=b;a=temper;flag_2=0;if(++count1>;30){display();count1=0;}compare_temper();}TR0=0;z=1;while(1){EA=0;if(stop==0){for(a=0;a<5;a++)for(b=0;b<102;b++){} if(stop==0)disp_1(phil);// break;}EA=1; }}。

基于51单片机的18B20温度计C程序

基于51单片机的18B20温度计C程序

本程序为本人用单片机80c51与18b20做实验时写的,其中有些是汉语拼音,便于咱们中国同胞们理解.仅供参考#include <reg52.h>#define uint unsigned int#define uchar unsigned charuchar tab[]="0123456789WD:C";sbit ds=P2^6;sbit rs=P3^4;sbit rw=P3^5;sbit en=P3^6;uchar s,g,shu;/***延时2tus***/yanshi(uchar t){while(--t){;}}/***延时tms** */delay(uint t){uchar a,b;for(a=t;a>0;a--)for(b=110;b>0;b--);}/***18B20初始化***/chushi(){ds=0;yanshi(250); //延时500usds=1;yanshi(2);}/***等待应答***/yingda(){while(ds);while(~ds);yanshi(2);}/***写一个字节***/w_dat(uchar dat){uchar i;for(i=0;i<8;i++){dat=dat>>1;ds=0;yanshi(8);ds=CY;yanshi(30);ds=1;}}/***读一个字节***/ uchar du_dat(){uchar i,dat;for(i=0;i<8;i++){ dat=dat>>1;ds=0;yanshi(1);ds=1;if(ds==1){dat=dat|0x80;}yanshi(30);}return dat;}/***启动温度转换***/ zhuanhuan(){chushi();yingda();delay(1);w_dat(0xcc);w_dat(0x44);}/***读取温度***/uchar du_wendu(){uchar a,b,dat;chushi();yingda();delay(1);w_dat(0xcc);w_dat(0xbe);a=du_dat(); //低位字节;b=du_dat(); //高位字节;dat=(b<<4)|(a>>4);return dat;}////////////////////////////// 1602液晶/////////////////////////////w_ml(uchar com){rs=0;P0=com;delay(5);en=1;delay(5);en=0;}chushihua(){rw=0;en=0;w_ml(0x38);w_ml(0x0c);w_ml(0x06);w_ml(0x01); }w_1602(uchar date){rs=1;P0=date;delay(5);en=1;delay(5);en=0;}xianshi(){w_ml(0x80);w_1602(tab[10]);w_1602(tab[11]);w_1602(tab[12]);w_1602(tab[s]);w_1602(tab[g]);w_1602(tab[13]);}/***************//** 主函数**//**************/main(){chushihua();while(1){delay(1);zhuanhuan();delay(10);shu=du_wendu();s=shu/10;g=shu%10;xianshi();}}。

51单片机 DS18B20温控保温汇编程序

51单片机 DS18B20温控保温汇编程序

51单片机+DS18B20温控保温汇编程序;DS18B20和AT89C2051制作的热水器程序!两位数码管显示温度,设定温度时数码管成闪烁状态,延时几秒后跳转到被测温度;DS18B20的正电源就是红线接+5伏,兰线接地,黄线接P3.2,红线和黄线之间接一个4.7K的上拉电阻;这是关于DS18B20的读写程序,数据脚P3.2,晶振12MHz ;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒;可以将检测到的温度直接显示到AT89C2051的p1口输数码管段码到两位一体数码管上;显示温度00到99度,很准确哦~~无需校正!;p3.1驱动加热管装置,让温度保温在0-99度内;p3.0保温指示灯,p3.4是温度设定按键加1度;p3.5是温度设定按键减1度,p3.7是数码管高位位码,p3.3是数码管低位位码;程序16进制的温度值放在29h里,我用可调节0度到99度的16进制值(#08H/#0EH)与之比较;1至40度的16进制为:01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 1-10度; 0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H 14H 11-20度; 15H 16H 17H 18H 19H 1AH 1BH 1CH 1DH 1EH 21-30度; 1FH 2OH 21H 22H 23H 24H 25H 26H 27H 28H 31-40度; 29H 2AH 2BH 2CH 2DH 2EH 2FH 30H 31H 32H 41-50度; 33H 34H 35H 36H 37H 38H 39H 3AH 3BH 3CH 51-60度; 3CH 3DH 3EH 3FH 40H 41H 42H 43H 44H 45H 61-70度; 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH 71-80度; 51H 52H 53H 54H 55H 56H 57H 58H 59H 5AH 81-90度; 5BH 5CH 5DH 5EH 5FH 60H 61H 62H 63H 64H 91-100度;================================================ =========================================;单片机内存分配申明!TEMPER_L EQU 29H ;用于保存读出温度的低8位 TEMPER_H EQU 28H ;用于保存读出温度的高8位(特别是可位寻址,程序中用的着哦)TIAO_H EQU 27H ;用于保存设定温度的数据(最低温度的设定,高温度为低温度加2度)FLAG1 EQU 38H ;是否检测到DS18B20标志位a_bit equ 20h ;数码管个位数存放内存位置b_bit equ 21h ;数码管十位数存放内存位置SL EQU 22H ;设定温度时数码管个位数存放内存位置SH EQU 23H ;设定温度时数码管十位数存放内存位置sdwd equ 24h ;设定温度压缩BCD码位DS18B20 BIT P3.2 ;定义DS18B20的数据脚为P3.2端口ORG 0000HMOV sdwd,#25H ;;;;设定初始温度37度,上电后内部设定温度MAIN:LCALL INIT_1820 ;调用复位DS18B20子程序MAIN1:LCALL GET_TEMPER ;调用读温度子程序;进行温度显示,这里我是用两位数码管来显示温度,显示范围00到99度,显示精度为1度;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数MOV A,29HMOV C,40H ;将28H中的最低位移入CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,ALCALL DISPLAY ;调用数码管显示子程序;这里是后加的,做为控制在0-99度内恒温的程序!p3.1驱动加热管装置setb p3.4setb p3.5jnb p3.4,DD1 ;按下后转加1程序jnb p3.5,DD2 ;按下后转减1程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;TT: CLR C ;比较转换值与设定值MOV 26H,sdwd ;把低温度设定保存到26H单元后减2度,作为低度的数据DEC 26HMOV A,29HCJNE A,26H,LOOP1 ;下限设定温度度,不相等跳LOOP1SJMP HOTTING ;与下限值相等跳HOTTING,加热LOOP1:JC HOTTING ;温度小于下限值跳HOTTING,加热MOV A,29H ;温度大于下限值,与上限值比较CLR Cmov 27h,sdwdinc 27hCJNE A,27h,LOOP2 ;上限设定温度度,不相等跳LOOP2SJMP STOPHOT ;相等跳STOPHOT,停止加热LOOP2:JNC STOPHOT ;温度大于上限值跳STOPHOT,停止加热SJMP KEEP ;温度小于上限且大于下限值跳KEEP,保温HOTTING:CLR P3.1 ;小,加热器驱动setb p3.0 ;关闭保温灯KEEP:SJMP MAIN ;返回,保持原态,保温STOPHOT:SETB P3.1 ;关闭加热器clr p3.0 ;点亮保温灯AJMP MAIN ;反回主程序;;;;;;;;;;;;;;;;;;;;;按键处理;;;;;;;;;;;; ;;;;;加限设定温度度;;;;;;;;;;DD1:LCALL displa ;调用数码管闪烁设定显示子程序mov r5,#30JNB P3.4,DD1mov a,sdwd ;把设定温度送累加器判断cjne a,#62h,ty1 ;比较设定温度是否到99度,不是则加ajmp dh2ty1: INC sdwddh2:jnb p3.4,DD1jnb p3.5,DD2 ;按下后转减1程序LCALL displa ;调用数码管闪烁设定显示子程序djnz r5,dh2LJMP TT;;;减限设定温度度;;;;;;;;;;;;DD2:LCALL displa ;调用数码管闪烁设定显示子程序mov r5,#30JNB P3.5,DD2mov a,sdwd ;把设定温度送累加器判断cjne a,#01h,ty ;比较设定温度是否到0度,不是则减ajmp dh1ty: DEC sdwddh1:jnb p3.5,DD2jnb p3.4,DD1 ;按下后转加1程序LCALL displa ;调用数码管闪烁设定显示子程序djnz r5,dh1LJMP TT;================================================ =========================================; DS18B20复位初始化程序INIT_1820:SETB DS18B20NOPCLR DS18B20MOV R0,#06BH ;主机发出延时537微秒的复位低脉冲MOV R1,#03HTSR1:DJNZ R0,TSR1MOV R0,#6BHDJNZ R1,TSR1SETB DS18B20 ;然后拉高数据线NOPNOPNOPMOV R0,#25HTSR2:JNB DS18B20,TSR3 ;等待DS18B20回应DJNZ R0,TSR2LJMP TSR4 ;延时TSR3:SETB FLAG1 ;置标志位,表示DS1820存在 LJMP TSR5TSR4:CLR FLAG1 ;清标志位,表示DS1820不存在 LJMP TSR7TSR5:MOV R0,#06BHTSR6:DJNZ R0,TSR6 ;时序要求延时一段时间TSR7:SETB DS18B20;================================================ =========================================; 读出转换后的温度值GET_TEMPER:SETB DS18B20 ;定时入口LCALL INIT_1820 ;先复位DS18B20JB FLAG1,TSS2RET ;判断DS1820是否存在?若DS18B20不存在则返回TSS2:MOV A,#0CCH ;跳过ROM匹配LCALL WRITE_1820MOV A,#44H ;发出温度转换命令LCALL WRITE_1820LCALL DISPLAY ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒. LCALL INIT_1820 ;准备读温度前先复位MOV A,#0CCH ;跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ;发出读温度命令LCALL WRITE_1820LCALL READ_18200 ;将读出的温度数据保存到35H/36H;写DS18B20的子程序(有具体的时序要求)WRITE_1820:MOV R2,#8 ;一共8位数据CLR CWR1:CLR DS18B20MOV R3,#6DJNZ R3,$RRC AMOV DS18B20,CMOV R3,#23DJNZ R3,$SETB DS18B20NOPDJNZ R2,WR1SETB DS18B20RET; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据READ_18200:MOV R4,#2 ;将温度高位和低位从DS18B20中读出MOV R1,#29H ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)RE00:MOV R2,#8RE01:CLR CSETB DS18B20NOPNOPCLR DS18B20NOPNOPNOPSETB DS18B20MOV R3,#09RE10:DJNZ R3,RE10MOV C,DS18B20MOV R3,#23RE20:DJNZ R3,RE20RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;========================================================================================= ;;;;;;;;;;;;;;;显示子程序;;;;;;;;;;;;;;;;;; display:mov a,29H ;将29H中的十六进制数转换成10进制mov b,#10 ;10进制/10=10进制div abmov b_bit,a ;十位在amov a_bit,b ;个位在bmov dptr,#numtab ;指定查表启始地址mov r1,#250 ;显示250次dplop:mov a,a_bit ;取个位数MOVC A,@A+DPTR ;查个位数的7段代码mov p1,a ;送出个位的7段代码clr p3.3 ;开个位显示acall d1ms ;显示1mssetb p3.3mov a,b_bit ;取十位数MOVC A,@A+DPTR ;查十位数的7段代码mov p1,a ;送出十位的7段代码clr p3.7 ;开十位显示acall d1ms ;显示1mssetb p3.7djnz r1,dplop ;250次没完循环RET;;;============================================== =================;;;;;;;闪烁设定显示子程序===================== displa: MOV A,sdwdmov b,#10 ;10进制/10=10进制div abmov SL,a ;十位在amov SH,b ;个位在bmov r1,#250 ;显示250次dpl2: mov a,SL ;取设定温度个位数mov dptr,#numtab ;指定查表启始地址MOVC A,@A+DPTR ;查个位数的7段代码mov p1,a ;送出个位的7段代码clr p3.7 ;开个位显示acall d1ms ;显示1mssetb p3.7mov a,SH ;取设定温度十位数MOVC A,@A+DPTR ;查十位数的7段代码mov p1,a ;送出十位的7段代码clr p3.3 ;开十位显示acall d1ms ;显示1mssetb p3.3djnz r1,dpl2 ;250次没完循环acall D1s ;显示1msRET;;=============================================== ==========================================;1MS延时(按12MHZ算)D1MS:MOV R7,#80DJNZ R7,$RET;;1S延时(按12MHZ算)D1s:MOV R7,#255l1:nopnopnopnopnopnopnopnopnopnop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nopnop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nopnop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nopnop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nopnop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nopnopnopDJNZ R7,l1RET;================================================ ========================================= numtab: DB 0EEH;0DB 048H;1DB 0D6H;2DB 0DCH;3DB 078H;4DB 0BCH;5DB 0BEH;6DB 0C8H;7DB 0FEH;8DB 0FCH;9END。

基于51单片机――Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图)

基于51单片机――Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图)

TEMP_ZH EQU 24H ;实测温度值存放单元TEMPL EQU 25H TEMPH EQU 26HTEMP_TH EQU 27H ;高温报警值存放单元TEMP_TL EQU28H ;TEMPHC EQU 29H ;TEMPLC EQU 2AHTEMPFC EQU 2BHK1 EQU P1.4K2 EQU P1.5 ;K3 EQU P1.6 ;K4 EQU P1.7 ;BEEP EQU P3.7 ;RELAY EQU P1.3 ;LCD_X EQU 2FH ;LCDLCD_RS EQU P2.0 ;LCDLCD_RW EQU P2.1 ;LCDLCD_EN EQU P2.2 ;LCDFLAG1 EQU 20H.0 ;DS18B20 KEY_UD EQU 20H.1 ;DQEQU P3.3低温报警值存放单元正、负温度值标记查询按键设置/调整键调整键确定键蜂鸣器指示灯字符显示位置寄存器选择信号读写信号允许信号是否存在标志设定按键的增、减标志数据信号;;DS18B20ORG 00HLJMP MAINORG 0030H MAIN:MOV SP,#60H MOV A,#00HMOV R0,#20H MOV R1,#10H CLEAR:MOV @R0,A INC R0DJNZ R1,CLEAR LCALL SET_LCD LCALL RE_18B20 START:LCALL RST JNB FLAG1,START1 LCALL MENU_OK信息子程序MOV TEMP_TH,#055H MOV TEMP_TL,#019H LCALL RE_18B20ALCALL WRITE_E2 ;LCALL TEMP_BJ ;JMP START2;将20H~2FH单元清零;调用18B20复位子程序;DS1820不存在;DS1820存在,调用显示正确设置TH初值85度设置TL初值25度调用暂存器操作子程序写入DS18B20显示温度标记;;;START1: LCALL MENU_ERROR;调用显示出错信息子程序LCALL TEMP_BJ ;显示温度标记SJMP $START2: LCALL RST;调用DS18B20复位子程序JNBFLAG1,START1;DS18B20不存在MOV A,#0CCHLCALL WRITEMOV A,#44HLCALL WRITELCALL RSTMOV A,#0CCHLCALL WRITEMOV A,#0BEHLCALL WRITELCALL READ子程序LCALL CONVTEMP程序LCALL DISPBCDLCALL CONVLCALL TEMP_COMP值比较子程序;跳过ROM匹配命令;温度转换命令;跳过ROM匹配;读温度命令;调用DS18B20数据读取操作;调用温度数据BCD码处理子;调用温度数据显示子程序;调用LCD显示处理子程序;调用实测温度值与设定温度LCALLPROC_KEY ;调用键扫描子程序SJMP START2;循环;***************************键*****************************PROC_KEY:JB K1,PROC_K1LCALL BEEP_BLJNB K1,$MOV DPTR,#M_ALAX1MOV A,#1LCALL LCD_PRINTLCALL LOOK_ALARMJB K3,$LCALL BEEP_BLJMP PROC_K2PROC_K1: JB K2,PROC_ENDLCALL BEEP_BLJNB K2,$MOV DPTR,#RST_A1MOV A,#1LCALL LCD_PRINTLCALL SET_ALARMLCALL RE_18B20 ;扫描子程序将设定的TH,TL值写入DS18B20 LCALL WRITE_E2PROC_K2: LCALL MENU_OKLCALL TEMP_BJPROC_END:RET;******************************************************SET_ALARM:LCALL LOOK_ALARMAS0: JB K1,AS00LCALL BEEP_BLJNB K1,$CPL 20H.1 ;UP/DOWNAS00: JB 20H.1,ASZ01 ;20H.1=1 JMP ASJ01 ;20H.1=0ASZ01: JB K2,ASZ02 ;THLCALL BEEP_BLINC TEMP_THMOV A,TEMP_THCJNE A,#120,ASZ011MOV TEMP_TH,#0ASZ011: LCALL LOOK_ALARM设定温度报警值标记,增加,减小值调整(增加)TH、TLMOV R5,#10LCALL DELAYJMP ASZ01ASZ02: JB K3,ASZ03;TL值调整(增加)LCALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#99,ASZ021MOV TEMP_TL,#00HASZ021: LCALL LOOK_ALARM MOV R5,#10LCALL DELAYJMP ASZ02ASZ03: JB K4,AS0LCALL BEEP_BLJNB K4,$RETASJ01: JB K2,ASJ02LCALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ011;确定调整;TH值调整(减少)JMP ASJ022ASJ011: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP AS0ASJ02: JB K3,ASJ03;TL值调整(减少)LCALL BEEP_BLDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,ASJ021JMP ASJ022ASJ021: LCALL LOOK_ALARM ;MOV R5,#10LCALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRST_A1: DB " SET ALERT CODE " ,0;***********************实测温度值与设定温度值比较子程序**********************TEMP_COMP:MOVA,TEMP_THSUBBA,TEMP_ZH;减数>被减数,则JC CHULI1;借位标志位C=1,转MOV A,TEMPFCCJNEA,#0BH,COMPSJMPCHULI2COMP:MOV A,TEMP_ZHSUBB A,TEMP_TL ;JC CHULI2 ;MOV DPTR,#BJ5LCALL TEMP_BJ3CLR RELAYRETCHULI1: MOV DPTR,#BJ3LCALL TEMP_BJ3SETB RELAY ;LCALL BEEP_BLRETCHULI2: MOV DPTR,#BJ4LCALL TEMP_BJ3SETB RELAY ;减数>被减数,则借位标志位C=1,转;点亮指示灯熄灭指示灯蜂鸣器响熄灭指示灯;LCALL BEEP_BL;蜂鸣器响RET;-----------------------------------------TEMP_BJ3: MOV A,#0CEHLCALL WCOMMOV R1,#0MOV R0,#2BBJJ3: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3: DB ">H"BJ4: DB "<L"BJ5: DB " !";;**************************** ***************************TEMP_BJ:MOV A,#0CBHLCALL WCOMMOV DPTR,#BJ1显示温度标记子程序指针指到显示消息;MOV R1,#0 MOV R0,#2BBJJ1: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ1RETBJ1: DB 00H,"C";********************************显示正确信息子程序***************************MENU_OK:MOV DPTR,#M_OK1;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_OK2;指针指到显示消息MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_OK1: DB " DS18B20 OK ",0M_OK2: DB " TEMP:",0;********************************显示出错信息子程序***************************MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_ERROR2;指针指到显示消息1MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_ERROR1: DB " DS18B20 ERROR ",0M_ERROR2: DB " TEMP:---- ",0;****************************DS18B20复位子*****************************RST:SETB DQNOPCLR DQMOV R0,#6BH ;主机发出延时复位低脉冲MOV R1,#04HTSR1: DJNZ R0,$MOV R0,#6BHDJNZ R1,TSR1程序SETB DQ;拉高数据线NOPNOPNOPMOV R0,#32HTSR2: JNB DQ,TSR3;等待DS18B20回应DJNZ R0,TSR2JMP TSR4 ;延时TSR3: SETB FLAG1 ;置1标志位,表示DS1820存在JMP TSR5 TSR4: CLR FLAG1 ;清0标志位,表示DS1820不存在JMP TSR7 TSR5: MOV R0,#06BHTSR6: DJNZ R0,$ ;时序要求延时一段时间TSR7: SETB DQRET;************************DS18B20***************************RE_18B20:JB FLAG1,RE_18B20ARETRE_18B20A:暂存器操作子程序LCALL RSTMOV A,#0CCH;跳过ROM匹配LCALL WRITEWR_SCRAPD:MOV A,#4EH;写暂器LCALL WRITEMOV A,TEMP_TH;TH(报警上限)LCALL WRITEMOV A,TEMP_TL;TL(报警下限)LCALL WRITEMOV A,#7FH;12位精度LCALL WRITERET;************************复制暂存器子程序*******************************WRITE_E2:LCALL RSTMOV A,#0CCH;跳过ROM匹配LCALL WRITEMOV A,#48H;把暂存器里的温度报警值拷贝到EEROM LCALL WRITERET;***********************重读EEROM子程序********************************READ_E2:LCALL RSTMOV A,#0CCH;跳过ROM匹配LCALL WRITEMOV A,#0B8H;把EEROM里的温度报警值拷贝回暂存器LCALL WRITERET;************************将自定义字符写入LCD的CGRAM中*********************STORE_DATA:MOV A,#40HLCALL WCOMMOV R2,#08HMOV DPTR,#D_DATAMOV R3,#00HS_DATA:MOV A,R3MOVC A,@A+DPTRLCALL WDATA;写入数据INC R3DJNZ R2,S_DATAD_DATA:DB 0CH,12H,12H,0CH,00H,00H,00H,00H;***********************DS18B20数据写入操作子程序************************WRITE:MOV R2,#8 ;一共8位数据CLR CWR1: CLR DQ;开始写入DS18B20总线要处于复位(低)状态MOV R3,#07DJNZ R3,$ ;总线复位保持16微妙以上RRCA ;把一个字节DATA分成8个BIT环移给CMOV DQ,C;写入一位MOV R3,#3CHDJNZ R3,$ ;等待100微妙SETB DQ;重新释放总线NOPDJNZ R2,WR1 ;写入下一位SETB DQRET;**********************DS18B20数据读取操作子程序**************************MOV R4,#4;将温度低位、高位、TH、TL从DS18B20中读出MOV R1,#TEMPL元RE00: MOV R2,#8RE01: CLR CYSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#09DJNZ R3,$MOV C,DQMOV R3,#3CH;存入25H、26H、27H、28H单;读前总线保持为低;开始读总线释放;延时18微妙;从DS18B20总线读得一位DJNZ R3,$;等待100微妙RRC A;把读得的位值环移给ADJNZ R2,RE01;读下一位MOV @R1,ADJNZ R4,RE00RET;************************温度值BCD码处理子程序*************************CONVTEMP:MOV A,TEMPH ;判温度是否零下ANL A,#08HJZ TEMPC1 ;温度零上转CLR CMOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,AMOV TEMPHC,#0BH;负温度标志MOV TEMPFC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH;正温度标志MOV TEMPFC,#0AHTEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=分BCD MOV A,TEMPL ;ANL A,#0F0H ;SWAP AMOV TEMPL,AMOV A,TEMPH ;ANL A,#0FHSWAP AORL A,TEMPL ;乘0.0625小数部整数部分取出高四位取出低四位重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHCBCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI =BCD ORL A,TEMPLCMOV TEMPLC,AMOV A,R4JZ TEMPC12ANL A,#0FHSWAP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI =BCD ANL A,#0FHLOW=十位数个位数百位数ORL A,R4TEMPC12: RET;************************二-十进制转换子程序*****************************HEX2BCD1: MOV B,#064HDIV ABMOV R4,AMOV A,#0AHXCH A,BDIV ABSWAP AORL A,BRETTEMPDOTTAB:DB 00H,00H,01H,01H,02H,03H,03H,04H ;小数部分码表DB 05H,05H,06H,06H,07H,08H,08H,09H;**********************查询温度报警值子程序***************************LOOK_ALARM:MOV DPTR,#M_ALAX2 ;指针指到显示信息区MOV A,#2;显示在第二行LCALL LCD_PRINTLCALL TEMP_BJ1MOV A,TEMP_TH;加载TH数据MOV LCD_X,#3LCALL SHOW_DIG2H ;MOV A,#0CEHLCALL TEMP_BJ1MOV A,TEMP_TLMOV LCD_X,#12LCALL SHOW_DIG2L ;RETM_ALAX1: DB " LOOK ALERT CODE",0 M_ALAX2: DB "TH:TL:",0TEMP_BJ1: LCALL WCOMMOV DPTR,#BJ2MOV R1,#0MOV R0,#2BBJJ2: MOV A,R1MOVC A,@A+DPTRLCALL WDATA;设置显示位置显示数据;加载TL数据;设置显示位置显示数据;指针指到显示信息区INC R1DJNZ R0,BBJJ2RETBJ2: DB 00H,"C";**************************LCD********************************** SHOW_DIG2H:MOV B,#100DIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC LCD_XPUSH BMOV B,LCD_XLCALL LCDP2显示子程序POP B INC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RETSHOW_DIG2L:MOV B,#100DIV ABMOV A,#0AHXCH A,BDIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RET;************************显示区BCD码温度值刷新子程序**********************DISPBCD:MOV A,TEMPLCANL A,#0FHMOV 70H,A ;MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ;MOV A,TEMPHCANL A,#0FHMOV 72H,A ;MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,A ;DISPBCD2: RET小数位个位十位百位;***************************LCD显示数据处理子程序*************************CONV:MOV A,73HMOV LCD_X,#6CJNE A,#1,CONV1JMP CONV2CONV1: CJNE A,#0BH,CONV11MOV A,#"-"JMP CONV111CONV11: MOV A,#" "CONV111: MOV B,LCD_XLCALL LCDP2JMP CONV3CONV2: LCALL SHOW_DIG2CONV3: INC LCD_X MOV A,72HLCALL SHOW_DIG2INC LCD_XMOV A,71HLCALL SHOW_DIG2INC LCD_XMOV A,#'.';加载百位数据;设置位置;"-"号显示;"+"号不显示;显示数据;十位;个位MOV B,LCD_XLCALL LCDP2MOV A,70H;加载小数点位INC LCD_X;设置显示位置LCALL SHOW_DIG2;显示数据RET;***************************第二行显示数字子程序*************************SHOW_DIG2:ADD A,#30HMOV B,LCD_XLCALL LCDP2RET;***************************第二行显示数字子程序*************************LCDP2: PUSH ACCMOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA;写入数据RET;***************************对LCD做初始化设置及测试*************************SET_LCD:CLR LCD_ENLCALL INIT_LCD ;初始化LCDLCALL STORE_DATA ;将自定义字符存入LCD的CGRAMRET;*****************************************************************INIT_LCD:MOV A,#38H ;2行显示,字形5*7点阵LCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#0CH ;开显示,显示光标,光标不闪烁LCALL WCOMLCD 初始化LCALL DELAY1MOV A,#01H ;清除LCD显示屏LCALL WCOMLCALL DELAY1RET;*****************************清除LCD的第一行字符**************************CLR_LINE1:MOV A,#80H ;设置LCD的第一行地址LCALL WCOMMOV R0,#24 ;设置计数值C1: MOV A,#' ' ;载入空格符至LCDLCALL WDATA ;输出字符至LCDDJNZ R0,C1 ;计数结束RET;*************************LCD的第一行或第二行显示字符**********************LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置LCD的第二行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置LCD的第二行地址LCALL WCOMFILL:CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: LCALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;***************************清除****************************CLR_LINE:MOV R0,#24CL1: MOV A,#' 'LCALL WDATADJNZ R0,CL11行LCD的字符RETDE:MOV R7,#250DJNZ R7,$RET;****************************LCD间接控制方式命令写入*************************WCOM:MOV P0,A ;写入命令CLR LCD_RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲CLR LCD_RW SETB LCD_ENLCALL DELAY1CLR LCD_ENRET;****************************LCD间接控制方式数据写入*************************WDATA:MOV P0,A ;写入数据SETB LCD_RSCLR LCD_RWSETB LCD_ENLCALL DECLR LCD_ENLCALL DERET;**************************在LCD的第一行显示字符**************************LCDP1: PUSH ACCMOV A,B ;设置显示地址ADD A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA ;写入数据RET;******************************声光报警子程序*******************************BEEP_BL:MOV R6,#100BL2: LCALL DEX1CPL BEEPCPL RELAYDJNZ R6,BL2MOV R5,#10LCALL DELAYRETDEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RET;******************************延*******************************DELAY:MOV R6,#50DL1: MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R5,DELAYRETDELAY1: MOV R6,#25 ;延时5毫秒DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RETEND子程序时。

我的51单片机之 温度传感器18B20 的C语言和汇编编程

我的51单片机之 温度传感器18B20 的C语言和汇编编程

{
TCZ=TCZ%100;//只显示小于 100 的整数温度
}
TC[1]=TCZ/10;
TC[0]=TCZ%10;
}
Hale Waihona Puke }void main() {
LEDCODE=0xFF; LED1=0; while(1) {
ReadTemp(); Disp(); } }
四、汇编程序: ;********************************************************************
温度传感器 18B20 实验
一、功能: 插上 18B20,上电后,数码管显示相应的环境温度。
二、电路图:
三、C 程序: //******************************************************************** //读取 18B20 输出的温度数据(2 位)并在数码管上显示;made by luqichao //********************************************************************
unsigned char Reset(); unsigned char ReadByte(); void WriteByte(unsigned char Data); void ReadTemp(); //延时 void delay(unsigned char n) {
unsigned char i; for(i=0;i<n;i++) { } }
Data>>=1; CLK=0; NOP();NOP();NOP();NOP();NOP();NOP();//6us CLK=1; NOP();NOP();NOP();NOP();NOP();//4us Temp=CLK; if(Temp) {

基于51单片机的温度监测系统(DS18B20)

基于51单片机的温度监测系统(DS18B20)
为产生写0时隙,在拉低总线后主机必须继续拉低总线以满足时隙持续时间 的要求(至少60μs)。在主机产生写时隙后,DS18B20会在其后的15到60us的一 个时间窗口内采样单总线。在采样的时间窗口内,如果总线为低电平,主机会 向DS18B20写入0。
DS18B20读时序
所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为 高
配置寄存器
8 位 CRC 生成器
DS18B20的时序
DS18B20复位时序
DS18B20的所有通信都由由复位脉冲组成的初始化序列开始。该初始化序列由主 机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。在初始化步骤中,总线 上的主机通过拉低单总线至少480μs来产生复位脉冲。然后总线主机释放总线并进入接收 模式。当总线释放后,5kΩ的上拉电阻把单总线上的电平拉回高电平。当DS18B20检测 到上升沿后等待15到60us,发出存在脉冲,拉低总线60-240us至此,初始化和存在时序 完毕。时序图如下:
1.主控制器电路和测温
电路的设计
主控制器电路由AT89S52 及外围时钟和复位电路构成, 测温电路由DS18B20、报警 电路组成。AT89C52是此硬 件电路设计的核心,通过 AT89S52的管脚P2.7与 DS18B20相连,控制温度的 读出和显示。硬件电路的功 能都是与软件编程相结合而 实现的。具体电路原理图如 右图2所示。
送1,以拉低总线的方式表示发送0.当发送0的时候,DS18B20在读时隙的末期将会释放总线,总线
将会被上拉电阻拉回高电平(也是总线空闲的状态)。DS18B20输出的数据在下降沿(下降沿产 生读时隙)产生后15us后有效。因此,主机释放总线和采样总线等动作要在15μs内完成。

基于51单片机——Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图).docx

基于51单片机——Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图).docx

TEMP_ZH EQU 24H ; 实测温度值存放单元TEMPL EQU 25HTEMPH EQU 26H高温报警值存放单元TEMP_TH EQU 27H ;低温报警值存放单元TEMP_TL EQU 28H ;正、负温度值标记TEMPHC EQU 29H ;TEMPLC EQU 2AHTEMPFC EQU 2BHK1 EQU P1.4 ; 查询按键K2 EQU P1.5 ; 设置/ 调整键调整键K3 EQU P1.6 ;K4 EQU P1.7 ; 确定键BEEP EQU P3.7 ; 蜂鸣器RELAY EQU P1.3 ; 指示灯LCD_X EQU FH ;LCD 字符显示位置寄存器选择信号LCD_RS EQU P2.0 ;LCD读写信号LCD_RW EQU P2.1 ;LCD允许信号LCD_EN EQU P2.2 ;LCD是否存在标志FLAG1 EQU 20H.0 ;DS18B20KEY_UD EQU 20H.1 5 设定按键的增、减标志DQ EQU P3.3 ;DS18B20 数据信号ORG 0000HLJMP MAINORG 0030H MAIN: MOV SP,#60HMOV A,#00HMOV R0,#20HMOV R1,#10HCLEAR: MOV @R0,AINC R0DJNZ R1,CLEARLCALL SET_LCDLCALL RE_18B20 START: LCALL RSTJNB FLAG1,START1LCALL MENU_OK 信息子程序MOV TEMP_TH,#055HMOV TEMP_TL,#019HLCALL RE_18B20ALCALL WRITE_E2 ;LCALL TEMP_BJ ;JMP START2;将20H~2FH单元清零;调用18B20复位子程序;DS 1 820不存在;DS1820 存在,调用显示正确;设置TH初值85度;设置TL初值25度; 调用暂存器操作子程序写入DS18B20显示温度标记LCALL TEMP_BJSJMP $START2: LCALL RSTJNB FLAG1,START1 MOV A,#0CCH LCALL WRITE MOV A,#44H LCALL WRITE LCALL RST MOV A,#0CCH LCALL WRITE MOV A,#0BEH LCALL WRITE LCALL READ 子程序LCALL CONVTEMP 程序LCALL DISPBCD LCALL CONV LCALLTEMP_COMP 值比较子程序显示温度标记;调用DS18B2(复位子程序QS18B20不存在;跳过RoM E配命令; 温度转换命令START1: LCALL MENU_ERROR ; 调用显示出错信息子程序;跳过ROM E配; 读温度命令;调用DS18B20数据读取操作;调用温度数据BCD码处理子; 调用温度数据显示子程序;调用LCD显示处理子程序; 调用实测温度值与设定温度调用键扫描子程序 ;循环 键扫描子PROC_KEY:JB K1,PROC_K1LCALL BEEP_BL JNB K1,$MOV DPTR,#M_ALAX1 MOV A,#1LCALL LCD_PRINT LCALL LOOK_ALARM JB K3,$LCALL BEEP_BL JMP PROC_K2PROC_K1: JB K2,PROC_ENDLCALL BEEP_BL JNB K2,$MOV DPTR,#RST_A1 MOV A,#1LCALL LCD_PRINT LCALL SET_ALARMLCALL RE_18B20 将设定的 TH,TL 值写入LCALL PROC_KEYSJMP START2・ ***************************5*****************************程序DS18B20LCALL WRITE_E2PROC_K2: LCALL MENU_OKLCALL TEMP_BJPROC_END:RET・ *************************** 设定温度报警值TH、TL ***************************SET_ALARM:LCALL LOOK_ALARMAS0: JB K1,AS00LCALL BEEP_BLJNB K1,$CPL 20H.1 ;UP/DOWN 标记AS00: JB 20H.1,ASZ01 ;20H.1=1 ,增加JMP ASJ01 ;20H.1=0 ,减小ASZ01: JB K2,ASZ02 ;TH 值调整(增加)LCALL BEEP_BLINC TEMP_THMOV A,TEMP_THCJNE A,#120,ASZ011MOV TEMP_TH,#0ASZ011: LCALL LOOK_ALARMMOV R5,#10 LCALL DELAY JMP ASZ01ASZ02: JB K3,ASZ03LCALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#99,ASZ021MOV TEMP_TL,#00H ASZ021: LCALL LOOK_ALARM MOV R5,#10LCALL DELAYJMP ASZ02ASZ03: JB K4,AS0LCALL BEEP_BLJNB K4,$RETASJ01: JB K2,ASJ02LCALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ011 ;TL 值调整(增加); 确定调整;TH 值调整(减少)JMP ASJ022ASJ011: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP AS0ASJ02: JB K3,ASJ03 ;TL 值调整(减少)LCALL BEEP_BLDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,ASJ021JMP ASJ022ASJ021: LCALL LOOK_ALARM ;MOV R5,#10LCALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRST_A1: DB " SET ALERT CODE " ,0・ *********************** 实测温度值与设定温度值比较子程序**********************TEMP_COMP:MOV A,TEMP_TH SUBB A,TEMP_ZH JCCHULI1MOV A,TEMPFCCJNE A,#0BH,COMP SJMPCHULI2COMP: MOV A,TEMP_ZHSUBB A,TEMP_TL ; JCCHULI2 ;MOV DPTR,#BJ5 LCALLTEMP_BJ3 CLR RELAYRETCHULI1: MOV DPTR,#BJ3 LCALL TEMP_BJ3 SETB RELAY ;LCALL BEEP_BL RET CHULI2: MOV DPTR,#BJ4 LCALL TEMP_BJ3SETB RELAY; 减数>被减数,则;借位标志位C=I,转减数>被减数,则借位标志位C=I ,转; 点亮指示灯熄灭指示灯; 蜂鸣器响熄灭指示灯LCALL BEEP_BL ; 蜂鸣器响RETTEMP_BJ3: MOV A,#0CEHLCALL WCOMMOV R1,#0MOV R0,#2BBJJ3: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3: DB ">H"BJ4: DB "<L"BJ5: DB " !"・ **************************** 显示温度标记子程序***************************TEMP_BJ: MOV A,#0CBHLCALL WCOMMOV DPTR,#BJ1 ; 指针指到显示消息MOV R1,#0MOV R0,#2BBJJ1: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ1RETBJ1: DB 00H,"C"・ ********************************5***************************MENU_OK: MOV DPTR,#M_O MOV A,#1 ;LCALL LCD_PRINT MOVDPTR,#M_OK2 MOVA,#2 ;LCALL LCD_PRINTRETM_OK1: DB " DS18B20 OK显示正确信息子程序; 指针指到显示消息显示在第一行; 指针指到显示消息显示在第一行",0M_OK2: DB " TEMP: ",0・ ******************************** 显示出错信息子程序***************************MENU_ERROR:MoV DPTR,#M_ERROR针指到显示消息MOV A,#1 ; 显示在第一行LCALL LCD_PRINTMoV DPTR,#M_ERRoR2 ; 指针指到显示消息1MoV A,#2 ; 显示在第一行LCALL LCD_PRINTRETM_ERRoR1: DB " DS18B20 ERRoR ",0M_ERRoR2: DB " TEMP: ------ ",0;**************************** DS18B20 复位子程序*****************************RST: SETB DQNoPCLR DQMoV R0,#6BH ; 主机发出延时复位低脉冲MoV R1,#04HTSR1: DJNZ R0,$MoV R0,#6BHDJNZ R1,TSR1SETB DQ ; 拉高数据线NOPNOPNOPMOV R0,#32HTSR2: JNB DQ,TSR3DJNZ R0,TSR2JMP TSR4 ;TSR3: SETB FLAG1JMP TSR5TSR4: CLR FLAG1JMP TSR7TSR5: MOV R0,#06BH TSR6: DJNZ R0,$ TSR7: SETB DQRET・ ************************ 5***************************RE_18B20:JB FLAG1,RE_18B20A RET延时置1标志位,表示DS1820存在清0标志位,表示DS1820不存在时序要求延时一段时间RE_18B20A:;等待DS18B20回应DS18B20 暂存器操作子程序LCALL RSTMOV A,#0CCH LCALL WRITE WR_SCRAPD:MOV A,#4EH LCALL WRITE MOV A,TEMP_TH LCALL WRITE MOV A,TEMP_TL LCALL WRITE MOV A,#7FH LCALL WRITERET;跳过RoME 配; 写暂器;TH ( 报警上限);TL ( 报警下限);12 位精度复制暂存器子程序;跳过ROM E 配; 把暂存器里的温度报警值拷贝到 LCALL WRITE・ ************************5*******************************WRITE_E2:LCALL RSTMoV A,#0CCH LCALL WRITE MoV A,#48H EERoM********************************READ_E2:LCALL RSTMOV A,#0CCH LCALL WRITE MOV A,#0B8H暂存器LCALL WRITE RET ;跳过RoM E 配;把EEROMl 的温度报警值拷贝回*********************STORE_DATA:MOV A,#40H LCALL WCOM MOV R2,#08H MOV DPTR,#D_DATA MOV R3,#00H S_DATA: MOV A,R3MOVC A,@A+DPTRRET・ ***********************重 读 EEROM 子 程 序・ ************************将自定义字符写入 LCD 的CGRAM 中INC R3DJNZ R2,S_DATA RETD_DATA: DB 0CH,12H,12H,0CH,00H,00H,00H,00HDS18B20 数 据 写 入 操 作 子 程 序************************CLR CWR1: CLR DQ;开始写入DS18B20总线要处于复位(低)状态MOV R3,#07DJNZ R3,$ 总线复位保持 1 6微妙以上 RRC A把一个字节DATA 分成8个BlT环移给 CMOV DQ,C ; 写入一位MOV R3,#3CH DJNZ R3,$ 等待 100 微妙SETB DQ ; 重新释放总线NOPDJNZ R2,WR1 写入下一位SETB DQLCALL WDATA; 写入数据・ ***********************WRITE: MOV R2,#8一共 8 位数据RET・ ********************** DS18B20 数据读取操作子程序**************************READ: MOV R4,#4DS18B2冲读出MOV R1,#TEMPL 元RE00: MOV R2,#8RE01: CLR CYSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#09DJNZ R3,$MOV C,DQ; 将温度低位、高位、TH、TL 从; 存入25H、26H、27H、28H 单; 读前总线保持为低; 开始读总线释放; 延时18 微妙;从DS18B2(总线读得一位DJNZ R3,$ ; 等待 100 微妙RRC A ; 把读得的位值环移给 A DJNZ R2,RE01; 读下一位MOV @R1,AINC R1DJNZ R4,RE00RET*************************CONVTEMP: MOV A,TEMPHANL A,#08H JZ TEMPC1 ; CLR CMOV A,TEMPL ; CPL A ; ADD A,#01H MOV TEMPL,A MOV A,TEMPH CPL A ADDC A,#00H MOV TEMPH,A・ ************************温 度 值 BCD 码 处 理 子 程 序判温度是否零下温度零上转二进制数求补(双字节) 取反加 1MOV TEMPHC,#0BH ; 负温度标志MOV TEMPFC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH ; 正温度标志MOV TEMPFC,#0AHTEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ; 乘0.0625MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分BCD整数部分MOV A,TEMPL ;取出高四位ANL A,#0F0H ;SWAP AMOV TEMPL,A取出低四位MOV A,TEMPH ;ANL A,#0FHSWAP AORL A,TEMPL ; 重新组合ORL A,TEMPLC MOV TEMPLC,A MOV A,R4 JZ TEMPC12 ANL A,#0FH SWAP A MOV R4,A MOV A,TEMPHC;TEMPHC HI = 百位数BCDANL A,#0FHBCDBCDMOV TEMP_ZH,A LCALL HEX2BCD1 MOV TEMPL,A ANL A,#0F0H SWAP AORL A,TEMPHC ;TEMPHCMOV TEMPHC,A MOV A,TEMPL ANL A,#0FH SWAP A;TEMPLC HI =LOW= 十位数个位数ORL A,R4MOV TEMPHC,ATEMPC12: RET・ ************************ 二-十进制转换子程序*****************************HEX2BCD1: MOV B,#064HDIV ABMOV R4,AMOV A,#0AHXCH A,BDIV ABSWAP AORL A,BRETTEMPDOTTAB: DB 00H,00H,01H,01H,02H,03H,03H,04H ; 小数部分码表DB 05H,05H,06H,06H,07H,08H,08H,09H・ ********************** 查询温度报警值子程序***************************LOOK_ALARM: MOV DPTR,#M_ALAX2 指; 针指到显示信息区M_ALAX1: DB " LOOK ALERT CODE",0 M_ALAX2: DB "TH: TL: ",0 TEMP_BJ1: LCALL WCOMMOV DPTR,#BJ2 ; 指针指到显示信息区MOV R1,#0 MOV R0,#2 BBJJ2: MOV A,R1MOVC A,@A+DPTR LCALL WDATALCALL LCD_PRINTMOV A,#0C6HLCALL TEMP_BJ1MOV A,TEMP_TH ; 加载 TH 数据 MOV LCD_X,#3 ; 设置显示位置LCALL SHOW_DIG2H ;显示数据MOV A,#0CEHLCALL TEMP_BJ1MOV A,TEMP_TL ; 加载 TL 数据 MOV LCD_X,#12 ; 设置显示位置LCALL SHOW_DIG2L ;显示数据RETMOV A,#2; 显示在第二行INC R1DJNZ R0,BBJJ2RETBJ2: DB 00H,"C"POP B・ ************************** LCD 显示子程序**********************************SHOW_DIG2H: MOV B,#100DIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC LCD_XPUSH BMOV B,LCD_XLCALL LCDP2INC LCD_X MOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RETSHOW_DIG2L:MOV B,#100 DIV ABMOV A,#0AHXCH A,B DIV ABADD A,#30H PUSH BMOV B,LCD_XLCALL LCDP2 POP B INC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RET;************************ 显示区BCD 码温度值刷新子程序**********************DISPBCD: MOV A,TEMPLCANL A,#0FHMOV 70H,A ; 小数位MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ; 个位MOV A,TEMPHCANL A,#0FHMOV 72H,A ; 十位MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,A ; 百位DISPBCD2: RET・ *************************** LCD 显示数据处理子程序*************************CONV: MOV A,73HMOV LCD_X,#6CJNE A,#1,CONV1JMP CONV2CONV1: CJNE A,#0BH,CONV11MOV A,#"-"JMP CONV111 CONV11: MOV A,#" " CONV111: MOV B,LCD_X LCALL LCDP2JMP CONV3CONV2: LCALL SHOW_DIG2CONV3: INC LCD_XMOV A,72HLCALL SHOW_DIG2INC LCD_XMOV A,71H LCALLSHOW_DIG2INC LCD_XMOV A,#'.'; 加载百位数据; 设置位置;"-" 号显示;"+" 号不显示; 显示数据; 十位; 个位第二行显示数字子程序设置显示地址设置LCD 的第二行地址写入命令 由堆栈取出 A; 写入数据MOV B,LCD_X LCALL LCDP2 MOV A,70H INC LCD_XLCALL SHOW_DIG2 RET; 加载小数点位 ; 设置显示位置 ; 显示数据第二行显示数字子程序・ ***************************5*************************SHOW_DIG2:ADD A,#30HMOV B,LCD_XLCALL LCDP2RET・ ***************************5*************************LCDP2: PUSH ACC MOVA,B ; ADD A,#0C0H ; LCALL WCOM ; POP ACC ;LCALL WDATARETLCALL WCOM・ ***************************5*************************SET_LCD: CLR LCD_ENLCALL INIT_LCD ; LCALL STORE_DATA ; RET・ ******************************5***********************************INIT_LCD: MOV A,#38H ;2LCALL WCOM LCALL DELAY1 MOV A,#38H LCALL WCOM LCALL DELAY1 MOV A,#38H LCALL WCOM LCALL DELAY1 MOV A,#0CH ;对 LCD 做 初 始 化 设 置 及 测 试初始化 LCD将自定义字符存入LCD 的CGRAMLCD 初 始 化开显示,显示光标,光标不闪烁LCALL DELAY1MOV A,#01H ; 清除 LCD 显示屏 LCALL WCOM LCALL DELAY1 RET清 除 LCD 的 第 一 行 字 符设置 LCD 的第一行地址 设置计数值载入空格符至 LCD 输出字符至 LCD 计数结束LCD 的 第一 行或第二行 显 示字符LCD_PRINT:CJNE A,#1,LINE2 ; 判断是否为第一行LINE1: MOV A,#80H ; 设置 LCD 的第一行地址LCALL WCOM ; 写入命令LCALL CLR_LINE ; 清除该行字符数据・ *****************************5**************************CLR_LINE1:MOV A,#80HLCALL WCOM MOV R0,#24 ;C1: MOV A,#' ' ; LCALLWDATA DJNZ R0,C1 ; RET・ *************************5**********************MOV A,#80H 设置 LCD 的第一行地址LCALL WCOM ; JMP FILL LINE2: MOV A,#0C0H LCALLWCOM ; LCALL CLR_LINEMOV A,#0C0H ;LCALL WCOMFILL: CLR A ;MOVC A,@A+DPTR CJNEA,#0,LC1 ;RETLC1: LCALL WDATA INCDPTR ; JMP FILL ; RET・ ***************************5****************************CLR_LINE: MOV R0,#24 CL1: MOV A,#' 'LCALL WDATA DJNZR0,CL1写入命令设置LCD 的第二行地址写入命令清除该行字符数据设置LCD 的第二行地址填入字符由消息区取出字符判断是否为结束码写入数据指针加1继续填入字符清除1 行LCD 的字符RET DE: MOV R7,#250DJNZ R7,$ RET・ ****************************5*************************WCOM: MOV P0,ACLR LCD_RS ;RS=L,RW=L,D0-D7= 指令码,E= 高脉冲CLR LCD_RW SETB LCD_EN LCALL DELAY1 CLR LCD_EN RETLCALL DELCD 间接控制方式命令写入写入命令・ ****************************5*************************WDATA: MOV P0,ASETB LCD_RS CLR LCD_RW SETB LCD_ENLCD 间接控制方式数据写 入写入数据CLR LCD_EN LCALL DE RET・ **************************5在LCD 的第一行显示字符**************************LCDP1: PUSH ACCMOV A,B ;设置显示地址ADD A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令POP ACC ; 由堆栈取出ALCALL WDATA ; 写入数据RET・ ******************************5声光报警子程序*******************************BEEP_BL: MOV R6,#100BL2: LCALL DEX1CPL BEEPCPL RELAYDJNZ R6,BL2MOV R5,#10LCALL DELAYRETDEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RET・ ****************************** 延时子程序*******************************DELAY: MOV R6,#50DL1: MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R5,DELAYRETDELAY1: MOV R6,#25 ; 延时5 毫秒DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RETENDLCDlLMOT6LDS18B2Θ OK TEMP : 82.0O C8sS23Sδ≥CRYSLUIXTALIXTAL2RSTPQOfAa) P0.1∕AD1PO2∕AD2 P0.3∕ACGP0.4∕ACU PO5∕AD6P0 6∕ACePO7∕AD7 ,°u∙远2QX 'KliS BP1 5 PI 6 Pl 7 ΘO5Γ <TEXT>K3K2 PSENALE EAP1.0 PII P1 2P2ΓUAfl P2.1)W P22∕A10 P23∕A11 P24∕A12 P25∕A13 P26∕A14 P27∕A15 P3.Q∕RXD P3.1∕7XD P3.2∕iF∏D P3 3∕INT1P3 4/TD P3 5f∏ P3 6Λ⅛5 P3 7WI ■■39■ 屮 ■ g■ 卜■ ■σ∙ O■ ■ ■ J■ --■↑2・ ■ 383" ■ 374・5" ■356"7" ■338∙■ 22 ....................... ...............................9・■51•■ 22•■ 23221 ∆2i * ±2& ■2Z. ■28 ,Ir蚩工n s: ∙ inJTDS1ΘB2D <TEXT>, ∙GND ∙ ∙2・ U2。

基于51单片机――Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图)

基于51单片机――Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图)

TEMP_ZH EQU 24H ;实测温度值存放单元TEMPL EQU 25H TEMPH EQU 26HTEMP_TH EQU 27H ;高温报警值存放单元TEMP_TL EQU28H ;TEMPHC EQU 29H ;TEMPLC EQU 2AHTEMPFC EQU 2BHK1 EQU P1.4K2 EQU P1.5 ;K3 EQU P1.6 ;K4 EQU P1.7 ;BEEP EQU P3.7 ;RELAY EQU P1.3 ;LCD_X EQU 2FH ;LCDLCD_RS EQU P2.0 ;LCDLCD_RW EQU P2.1 ;LCDLCD_EN EQU P2.2 ;LCDFLAG1 EQU 20H.0 ;DS18B20KEY_UD EQU 20H.1 ;DQEQU P3.3低温报警值存放单元正、负温度值标记查询按键设置/调整键调整键确定键蜂鸣器指示灯字符显示位置寄存器选择信号读写信号允许信号是否存在标志设定按键的增、减标志数据信号;;DS18B20ORG 0000HLJMP MAINORG 0030HMAIN: MOV SP,#60HMOV A,#00HMOV R0,#20HMOV R1,#10HCLEAR: MOV @R0,AINC R0DJNZ R1,CLEARLCALL SET_LCDLCALL RE_18B20START: LCALL RSTJNB FLAG1,START1LCALL MENU_OK信息子程序MOV TEMP_TH,#055HMOV TEMP_TL,#019HLCALL RE_18B20ALCALL WRITE_E2 ;LCALL TEMP_BJ ;JMP START2;将20H~2FH单元清零;调用18B20复位子程序;DS1820不存在;DS1820存在,调用显示正确设置TH初值85度设置TL初值25度调用暂存器操作子程序写入DS18B20显示温度标记;;;START1: LCALL MENU_ERROR;调用显示出错信息子程序LCALL TEMP_BJ ;显示温度标记SJMP $START2: LCALL RST;调用DS18B20复位子程序JNBFLAG1,START1;DS18B20不存在MOV A,#0CCHLCALL WRITEMOV A,#44HLCALL WRITELCALL RSTMOV A,#0CCHLCALL WRITEMOV A,#0BEHLCALL WRITELCALL READ子程序LCALL CONVTEMP程序LCALL DISPBCDLCALL CONVLCALL TEMP_COMP值比较子程序;跳过ROM匹配命令;温度转换命令;跳过ROM匹配;读温度命令;调用DS18B20数据读取操作;调用温度数据BCD码处理子;调用温度数据显示子程序;调用LCD显示处理子程序;调用实测温度值与设定温度LCALLPROC_KEY ;调用键扫描子程序SJMP START2;循环;***************************键*****************************PROC_KEY:JB K1,PROC_K1LCALL BEEP_BLJNB K1,$MOV DPTR,#M_ALAX1MOV A,#1LCALL LCD_PRINTLCALL LOOK_ALARMJB K3,$LCALL BEEP_BLJMP PROC_K2PROC_K1: JB K2,PROC_ENDLCALL BEEP_BLJNB K2,$MOV DPTR,#RST_A1MOV A,#1LCALL LCD_PRINTLCALL SET_ALARMLCALL RE_18B20 ;扫描子程序将设定的TH,TL值写入DS18B20 LCALL WRITE_E2PROC_K2: LCALL MENU_OKLCALL TEMP_BJPROC_END:RET;******************************************************SET_ALARM:LCALL LOOK_ALARMAS0: JB K1,AS00LCALL BEEP_BLJNB K1,$CPL 20H.1 ;UP/DOWNAS00: JB 20H.1,ASZ01 ;20H.1=1JMP ASJ01 ;20H.1=0ASZ01: JB K2,ASZ02 ;THLCALL BEEP_BLINC TEMP_THMOV A,TEMP_THCJNE A,#120,ASZ011MOV TEMP_TH,#0ASZ011: LCALL LOOK_ALARM设定温度报警值标记,增加,减小值调整(增加)TH、TLMOV R5,#10LCALL DELAYJMP ASZ01ASZ02: JB K3,ASZ03;TL值调整(增加) LCALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#99,ASZ021MOV TEMP_TL,#00HASZ021: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP ASZ02ASZ03: JB K4,AS0LCALL BEEP_BLJNB K4,$RETASJ01: JB K2,ASJ02LCALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ011;确定调整;TH值调整(减少)JMP ASJ022ASJ011: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP AS0ASJ02: JB K3,ASJ03;TL值调整(减少)LCALL BEEP_BLDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,ASJ021JMP ASJ022ASJ021: LCALL LOOK_ALARM ;MOV R5,#10LCALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRST_A1: DB " SET ALERT CODE " ,0;***********************实测温度值与设定温度值比较子程序**********************TEMP_COMP:MOVA,TEMP_THSUBBA,TEMP_ZH;减数>被减数,则JC CHULI1;借位标志位C=1,转MOV A,TEMPFCCJNEA,#0BH,COMPSJMPCHULI2COMP: MOV A,TEMP_ZHSUBB A,TEMP_TL ;JC CHULI2 ;MOV DPTR,#BJ5LCALL TEMP_BJ3CLR RELAYRETCHULI1: MOV DPTR,#BJ3LCALL TEMP_BJ3SETB RELAY ;LCALL BEEP_BLRETCHULI2: MOV DPTR,#BJ4LCALL TEMP_BJ3SETB RELAY ;减数>被减数,则借位标志位C=1,转;点亮指示灯熄灭指示灯蜂鸣器响熄灭指示灯;LCALL BEEP_BL;蜂鸣器响RET;-----------------------------------------TEMP_BJ3: MOV A,#0CEHLCALL WCOMMOV R1,#0MOV R0,#2BBJJ3: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3: DB ">H"BJ4: DB "<L"BJ5: DB " !";;*******************************************************TEMP_BJ: MOV A,#0CBHLCALL WCOMMOV DPTR,#BJ1显示温度标记子程序指针指到显示消息;MOV R1,#0MOV R0,#2BBJJ1: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ1RETBJ1: DB 00H,"C";********************************显示正确信息子程序***************************MENU_OK: MOV DPTR,#M_OK1;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_OK2;指针指到显示消息MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_OK1: DB " DS18B20 OK ",0M_OK2: DB " TEMP: ",0;********************************显示出错信息子程序***************************MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_ERROR2;指针指到显示消息1MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_ERROR1: DB " DS18B20 ERROR ",0M_ERROR2: DB " TEMP: ---- ",0;****************************DS18B20复位子*****************************RST:SETB DQNOPCLR DQMOV R0,#6BH ;主机发出延时复位低脉冲MOV R1,#04HTSR1: DJNZ R0,$MOV R0,#6BHDJNZ R1,TSR1程序SETB DQ;拉高数据线NOPNOPNOPMOV R0,#32HTSR2: JNB DQ,TSR3;等待DS18B20回应DJNZ R0,TSR2JMP TSR4 ;延时TSR3: SETB FLAG1 ;置1标志位,表示DS1820存在JMP TSR5 TSR4: CLR FLAG1 ;清0标志位,表示DS1820不存在JMP TSR7 TSR5: MOV R0,#06BHTSR6: DJNZ R0,$ ;时序要求延时一段时间TSR7: SETB DQRET;************************DS18B20***************************RE_18B20:JB FLAG1,RE_18B20ARETRE_18B20A:暂存器操作子程序LCALL RSTMOV A,#0CCH;跳过ROM匹配LCALL WRITEWR_SCRAPD:MOV A,#4EH;写暂器LCALL WRITEMOV A,TEMP_TH;TH(报警上限)LCALL WRITEMOV A,TEMP_TL;TL(报警下限)LCALL WRITEMOV A,#7FH;12位精度RET;************************复制暂存器子程序*******************************WRITE_E2:LCALL RSTMOV A,#0CCH;跳过ROM匹配LCALL WRITEMOV A,#48H;把暂存器里的温度报警值拷贝到EEROMLCALL WRITERET;***********************重读EEROM子程序********************************READ_E2:LCALL RSTMOV A,#0CCH;跳过ROM匹配LCALL WRITEMOV A,#0B8H;把EEROM里的温度报警值拷贝回暂存器LCALL WRITERET;************************将自定义字符写入LCD的CGRAM中*********************STORE_DATA:MOV A,#40HMOV R2,#08HMOV DPTR,#D_DATAMOV R3,#00HS_DATA: MOV A,R3MOVC A,@A+DPTRLCALL WDATA;写入数据INC R3DJNZ R2,S_DATARETD_DATA: DB 0CH,12H,12H,0CH,00H,00H,00H,00H;***********************DS18B20数据写入操作子程序************************WRITE: MOV R2,#8 ;一共8位数据CLR CWR1: CLR DQ;开始写入DS18B20总线要处于复位(低)状态MOV R3,#07DJNZ R3,$ ;总线复位保持16微妙以上RRCA ;把一个字节DATA分成8个BIT环移给CMOV DQ,C;写入一位MOV R3,#3CHDJNZ R3,$ ;等待100微妙SETB DQ;重新释放总线NOPDJNZ R2,WR1 ;写入下一位SETB DQRET;**********************DS18B20数据读取操作子程序**************************READ: MOV R4,#4;将温度低位、高位、TH、TL从DS18B20中读出MOV R1,#TEMPL元RE00: MOV R2,#8RE01: CLR CYSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#09DJNZ R3,$MOV C,DQMOV R3,#3CH;存入25H、26H、27H、28H单;读前总线保持为低;开始读总线释放;延时18微妙;从DS18B20总线读得一位DJNZ R3,$;等待100微妙RRC A;把读得的位值环移给ADJNZ R2,RE01;读下一位MOV @R1,AINC R1DJNZ R4,RE00RET;************************温度值BCD码处理子程序*************************CONVTEMP: MOV A,TEMPH ;判温度是否零下ANL A,#08HJZ TEMPC1 ;温度零上转CLR CMOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,AMOV TEMPHC,#0BH;负温度标志MOV TEMPFC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH;正温度标志MOV TEMPFC,#0AHTEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=分BCD MOV A,TEMPL ;ANL A,#0F0H ;SWAP AMOV TEMPL,AMOV A,TEMPH ;ANL A,#0FHSWAP AORL A,TEMPL ;乘0.0625小数部整数部分取出高四位取出低四位重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHCBCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI =BCD ORL A,TEMPLCMOV TEMPLC,AMOV A,R4JZ TEMPC12ANL A,#0FHSWAP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI =BCDANL A,#0FHLOW=十位数个位数百位数ORL A,R4MOV TEMPHC,ATEMPC12: RET;************************二-十进制转换子程序*****************************HEX2BCD1: MOV B,#064HDIV ABMOV R4,AMOV A,#0AHXCH A,BDIV ABSWAP AORL A,BRETTEMPDOTTAB: DB 00H,00H,01H,01H,02H,03H,03H,04H ;小数部分码表DB 05H,05H,06H,06H,07H,08H,08H,09H;**********************查询温度报警值子程序***************************LOOK_ALARM: MOV DPTR,#M_ALAX2 ;指针指到显示信息区MOV A,#2;显示在第二行LCALL LCD_PRINTMOV A,#0C6HLCALL TEMP_BJ1MOV A,TEMP_TH;加载TH数据MOV LCD_X,#3LCALL SHOW_DIG2H ;MOV A,#0CEHLCALL TEMP_BJ1MOV A,TEMP_TLMOV LCD_X,#12LCALL SHOW_DIG2L ;RETM_ALAX1: DB " LOOK ALERT CODE",0M_ALAX2: DB "TH: TL: ",0TEMP_BJ1: LCALL WCOMMOV DPTR,#BJ2MOV R1,#0MOV R0,#2BBJJ2: MOV A,R1MOVC A,@A+DPTRLCALL WDATA;设置显示位置显示数据;加载TL数据;设置显示位置显示数据;指针指到显示信息区INC R1DJNZ R0,BBJJ2RETBJ2: DB 00H,"C";**************************LCD********************************** SHOW_DIG2H: MOV B,#100DIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC LCD_XPUSH BMOV B,LCD_XLCALL LCDP2显示子程序POP B INC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RETSHOW_DIG2L:MOV B,#100DIV ABMOV A,#0AHXCH A,BDIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RET;************************显示区BCD码温度值刷新子程序**********************DISPBCD: MOV A,TEMPLCANL A,#0FHMOV 70H,A ;MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ;MOV A,TEMPHCANL A,#0FHMOV 72H,A ;MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,A ;DISPBCD2: RET小数位个位十位百位;***************************LCD显示数据处理子程序*************************CONV: MOV A,73HMOV LCD_X,#6CJNE A,#1,CONV1JMP CONV2CONV1: CJNE A,#0BH,CONV11MOV A,#"-"JMP CONV111CONV11: MOV A,#" "CONV111: MOV B,LCD_XLCALL LCDP2JMP CONV3CONV2: LCALL SHOW_DIG2CONV3: INC LCD_XMOV A,72HLCALL SHOW_DIG2MOV A,71HLCALL SHOW_DIG2INC LCD_XMOV A,#'.';加载百位数据;设置位置;"-"号显示;"+"号不显示;显示数据;十位;个位MOV B,LCD_XLCALL LCDP2MOV A,70H;加载小数点位INC LCD_X;设置显示位置LCALL SHOW_DIG2;显示数据RET;***************************第二行显示数字子程序*************************SHOW_DIG2:ADD A,#30HMOV B,LCD_XRET;***************************第二行显示数字子程序*************************LCDP2: PUSH ACCMOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA;写入数据RET;***************************对LCD做初始化设置及测试*************************SET_LCD: CLR LCD_ENLCALL INIT_LCD ;初始化LCDLCALL STORE_DATA ;将自定义字符存入LCD的CGRAMRET;*****************************************************************INIT_LCD: MOV A,#38H ;2行显示,字形5*7点阵LCALL WCOMLCALL DELAY1MOV A,#38HLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#0CH ;开显示,显示光标,光标不闪烁LCALL WCOMLCD 初始化LCALL DELAY1MOV A,#01H ;清除LCD显示屏LCALL WCOMLCALL DELAY1RET;*****************************清除LCD的第一行字符**************************CLR_LINE1:MOV A,#80H ;设置LCD的第一行地址LCALL WCOMMOV R0,#24 ;设置计数值C1: MOV A,#' ' ;载入空格符至LCDLCALL WDATA ;输出字符至LCDDJNZ R0,C1 ;计数结束RET;*************************LCD的第一行或第二行显示字符**********************LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置LCD的第二行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置LCD的第二行地址LCALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: LCALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;***************************清除****************************CLR_LINE: MOV R0,#24CL1: MOV A,#' 'LCALL WDATADJNZ R0,CL11行LCD的字符RETDE: MOV R7,#250DJNZ R7,$RET;****************************LCD间接控制方式命令写入*************************WCOM: MOV P0,A ;写入命令CLR LCD_RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲CLR LCD_RW SETB LCD_ENLCALL DELAY1CLR LCD_ENRET;****************************LCD间接控制方式数据写入*************************WDATA: MOV P0,A ;写入数据SETB LCD_RSCLR LCD_RWSETB LCD_ENLCALL DECLR LCD_ENLCALL DERET;**************************在LCD的第一行显示字符**************************LCDP1: PUSH ACCMOV A,B ;设置显示地址ADD A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA ;写入数据RET;******************************声光报警子程序*******************************BEEP_BL: MOV R6,#100BL2: LCALL DEX1CPL BEEPCPL RELAYDJNZ R6,BL2MOV R5,#10LCALL DELAYRETDEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RET;******************************延******************************* DELAY: MOV R6,#50DL1: MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R5,DELAYRETDELAY1: MOV R6,#25 ;延时5毫秒DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RETEND子程序时。

基于51单片机和DS18B20的数字温度计设计

基于51单片机和DS18B20的数字温度计设计

基于51单片机和DS18B20的数字温度计设计宿迁学院基于51单片机的数字温度计设计学生姓名: 李先智学号: 20090802120 系别: 七系专业: 数控专业指导教师: 刘海洋评阅教师:论文答辩日期摘要随着科技的不断发展,电子设备的应用已经取得了非凡的成就。

即使是高度集成化的今天,单片机技术依旧在我们的日常生活中占据着重要的地位。

温度是日常生活、工业、医学、环境保护、化工、石油等领域最常用到的一个物理量。

测量温度的基本方法是使用温度计直接读取温度。

最常见到得测量温度的工具是各种各样的温度计。

它们常常以刻度的形式表示温度的高低,人们必须通过读取刻度值的多少来测量温度。

利用单片机和温度传感器构成的电子式智能温度计就可以直接测量温度,得到温度的数字值,既简单方便,有直观准确。

本文讲叙了一种基于51系列单片机的数字温度计的设计过程与仿真结果。

通过Proteus画图以及Keil编程,成功的仿真出了能够实时测量温度并显示温度的数字温度计,另外还能够通过外接的键盘设置一个基准值,若温度高于基准值则会报警并且发出控制动作。

关键词:单片机,温度计,仿真,AT89C52,DS18B20IAbstractWith the continuous development of science and technology,the application ofelectronic equipment has made remarkable achievements(Even the highly integratedsingle-chip technology today,still in our daily life plays an important role in(Temperature is the daily life, industry, medicine,environmental protection,chemical industry,petroleum and other areas of the most commonly used of a physical quantity(Temperature measurement is the basic method used to directly read temperature thermometer(The most common to measuring the temperature of the tool is various thermometer(They often graduated form high and low temperature,peoplemust read through the scale value number to measuretemperature(Using single chipcomputer and a temperature sensor(The electronic type intelligent thermometer can measure temperature,the temperature of the digital values,are simple andconvenient,is intuitive and accurate(This article tells of a microcontroller based on the Series 51 digital thermometer's design process and simulation results(Through theProteus drawing and keil programming,a successful simulation of a real-time temperature measurement and display the temperature of the digital thermometer,also can pass through an external keyboard to set a baseline value,if the temperatureis higher than the reference value can alarm and send out the feedback action(Keywords:Single-chip Microcomputer,Thermometer,simulation,AT89C52,DS18B20II目录摘要 ..................................................................... . (I)Abstract ............................................................... ................................II 1 绪言1(1 课题背景...................................................................... ....................................... 1 1(2 课题研究的目的和意义...................................................................... ............... 1 1(3 国内外研究现状...................................................................... ........................... 2 2 系统设计方案的研究2(1 系统的控制特点与性能要求...................................................................... ....... 4 2(2 系统的实现原理...................................................................... ........................... 4 2(3 系统的实现方案分析...................................................................... ................... 5 2(4 方案的分析比较...................................................................... ........................... 6 3 系统的硬件设计3(1 元件选取...................................................................... ....................................... 8 3(2 主电路搭建...................................................................... ................................. 13 3(3 显示电路...................................................................... ..................................... 14 3(4 外围电路建立...................................................................... ............................. 15 4 系统的软件设计4(1 软件Keil介绍...................................................................... ............................ 17 4(2 程序介绍...................................................................... ..................................... 18 4(2(1 传感器程序...................................................................... ........................... 18 4(2(2 显示器程序...................................................................... ........................... 19 4(2(3 键盘程序...................................................................... ............................... 20 4(2(4 主程序...................................................................... ................................... 20 5 系统仿真及结果分析5(1 仿真软件Proteus介绍...................................................................... (22)5(1(, 什么是Proteus仿真软件...................................................................... ... 22 5(2 仿真结果...................................................................... ..................................... 22 6 总结与展望6(1 总结...................................................................... ............................................. 27 6(1(1 硬件方面...................................................................... ............................... 27 6(1(2 软件方面...................................................................... ............................... 27 6(2 展望...................................................................... ............................................. 28 6(2(1 系统硬件...................................................................... ............................... 28 6(2(2 系统软件...................................................................... ............................... 28 致谢 ...............................................................................................29 参考文献...................................................................... ......................30 附录程序 ..................................................................... .....................33 独创性声明 .............................................................. 错误~未定义书签。

基于51单片机和DS18B20的数字温度计设计说明

基于51单片机和DS18B20的数字温度计设计说明

基于51单片机和DS18B20的数字温度计设计说明
1.硬件设计:
-51单片机:选择合适的型号,如STC89C52或AT89C52等。

-DS18B20温度传感器:该传感器是一种数字温度传感器,具有单总线接口和高精度测量能力。

-接口电路:将51单片机和DS18B20传感器连接起来,要注意电平转换和信号线的阻抗匹配。

2.软件设计:
-初始化:在主函数中,首先对单片机进行初始化设置,包括时钟设置、串口配置等。

-DS18B20通信协议:使用单总线协议与DS18B20传感器进行通信,包括发送复位信号、读写数据等操作。

-温度测量:通过向DS18B20发送读取温度的命令,从传感器中读取温度值并保存。

-数据传输:将温度值转换为可显示的格式,如摄氏度或华氏度,并通过串口输出或LED显示。

3.程序流程:
-初始化单片机,设置时钟和串口参数。

-进入主循环,循环执行以下操作:
-发送复位信号,启动温度转换。

-等待转换完成,发送读取温度命令。

-读取温度值,并进行数据处理转换。

-输出温度值。

4.其他功能:
-可以添加LCD显示模块,将温度值显示在液晶屏上。

-可以添加按键输入模块,通过按键切换温度单位或进行其他操作。

需要注意的是,该设计只是一个简单的示例,实际应用中可能需要根据具体需求进行扩展和修改。

同时,在程序设计过程中,也要注意低功耗和数据稳定性等方面的考虑。

基于51单片机与DS18B20的数字温度计设计

基于51单片机与DS18B20的数字温度计设计

信息与通信工程学院课程设计项目:基于单片机的DS18B20数字温度计设计指导老师:湛腾西设计人:尹世强彭娇礼班级:电实11-1BF2013 年06 月18 日1 设计要求1.1 基本要求1、测量精度0.5℃2、范围:-50℃-110℃3、可测多点温度,演示两点以上4、LED直读显示5、可任意设计温度报警的上限与下限6、可上传通信(RS232口),也可以相互对通(485口)1.2 扩展功能温度报警,能任意设定温度范围实现声光报警;每隔10分钟记录一次温度数据,至少能查询过去10个时刻的温度情况。

2 元器件清单3 总体方案设计2.1 方案论证 2.1.1 方案一由于本设计是测温电路,可以使用热敏电阻之类的器件,将随被测温度变化的电压或电流采样,进行A/D 转换后就可以用单片机进行数据处理,实现温度显示。

这种设计需要用到A/D 转换电路,增大了电路的复杂性,而且要做到高精度也比较困难。

2.1.2 方案二考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。

另外DS18B20具有3引脚的小体积封装,测温范围为-55~+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。

以上两种方案相比较,第二种方案的电路、软件设计更简单,此方案设计的系统在功耗、测量精度、范围等方面都能很好地达到要求,故本设计采用方案二。

图1 系统总体方框图2.2 总体设计框图本方案设计的系统由单片机系统、数字温度传感器、LED显示模块、按键控制模块、温度报警模块组成,其总体架构如图1。

3 硬件设计3.1 单片机系统1.本设计采用STC89C52单片机作为控制器,完成所有功能的控制,包括:●DS18B20数字温度传感器的初始化和读取温度值●LED数码管显示驱动与控制●按键识别和响应控制●温度设置和报警●温度值的存储和读取2.单片机系统电路原理图:图2 单片机系统原理图4.1 数字温度传感器模块4.1.1 DS18B20性能●独特的单线接口仅需一个端口引脚进行通信●简单的多点分布应用●无需外部器件●可通过数据线供电●零待机功耗●测温范围-55~+125℃,以0.5℃递增●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃●温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字●应用包括温度控制、工业系统、消费品、温度计和任何热感测系统●负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作4.1.2 DS18B20外形及引脚说明图3 DS18B20外形及引脚●GND:地●DQ:单线运用的数据输入/输出引脚●VD:可选的电源引脚4.1.3 DS18B20接线原理图单总线通常要求接一个约4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。

基于51单片机和DS18B20的数字温度计设计说明

基于51单片机和DS18B20的数字温度计设计说明

基于51单片机和DS18B20的数字温度计设计说明题目:基于89C51和DS18B20的数字温度计设计一、设计要求数字式温度计要求测温范围为-55~125°C,精度误差在0.1°C以内,LED数码管直读显示。

二、方案论证根据系统的设计要求,选择DS18B20作为本系统的温度传感器,选择单片机AT89C51为测控系统的核心来完成数据采集、处理、显示、报警等功能。

选用数字温度传感器DS18B20,省却了采样/保持电路、运放、数/模转换电路以及进行长距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。

该系统的总体设计思路如下:温度传感器DS18B20把所测得的温度发送到AT89C51单片机上,经过51单片机处理,将把温度在显示电路上显示,本系统显示器用4位共阳LED数码管以动态扫描法实现。

检测范围-55摄氏度到125摄氏度。

按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和显示电路。

数字温度计总体电路结构框图如图1所示。

图1 数字温度计总体电路结构框图三、系统硬件电路的设计温度计电路设计原理图如图2所示,控制器使用单片机AT89C51,温度传感器使用DS18B20,用4位共阳LED数码管实现温度显示。

图2 数字温度计设计电路原理图1、主控制器AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU 和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

2、显示电路显示电路采用4位共阳LED数码管,从P0口输出段码,列扫描用P3.0~P3.3口来实现,列驱动用8550三极管。

3、温度传感器工作原理DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

DS18B20-51单片机汇编程序

DS18B20-51单片机汇编程序

DS18B20程序,51单片机汇编程序,仅需修改前几行即可。

晶振大小12M,转换完全正确。

DQ BIT P1.3 ;温度传感器接口TEMP_L EQU 29H ;用于保存读出温度的低字节TEMP_H EQU 28H ;用于保存读出温度的高字节TEMP_XIAO EQU 27H ;用于保存温度的小数部分TEMP_GE EQU 26H ;用于保存温度的个位部分TEMP_SHI EQU 25H ;用于保存温度的十位部分DQ_DELAY EQU 40H/*****************************************DS18B20温度转换程序,包括转换成小数、个位、十位*****************************************/// lOOP:// ACALL DS_GET_TEMP ;读取DS18B20温度// ACALL DOFOR_TEMP ;转换为十进制的十位、各位和小树部分// AJMP lOOPDS_RST: ;DS18B20复位函数SETB DQNOPCLR DQMOV DQ_DELAY,#66 ;延时约660usACALL DELAYSETB DQMOV DQ_DELAY,#6 ;延时约60usACALL DELAYMOV C,DQJC DS_RSTMOV DQ_DELAY , #24 ;延时约240usACALL DELAYSETB DQRETDS_WR_BYTE: ;写指令函数SETB DQMOV R4,#8CLR CDS_WR_LOOP:CLR DQMOV DQ_DELAY , #1 ;延时10us,短一些较好ACALL DELAYRRC AMOV DQ , CMOV DQ_DELAY , #5 ;延时50us,因为采样有效期为15-45usACALL DELAYSETB DQNOPDJNZ R4,DS_WR_LOOPRETDS_RD_BYTE: ;读指令函数MOV R4,#8DS_RD_LOOP:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV DQ_DELAY,#1 ;延时约10usACALL DELAYMOV C,DQMOV DQ_DELAY,#5 ;延时50usACALL DELAYRRC ADJNZ R4,DS_RD_LOOPMOV @R1,ARETDS_GET_TEMP: ;读取温度函数CLR EA ;由于DS18B20对时序要求较严格,所以采样期间关中断SETB DQACALL DS_RST ;执行指令之前,必须复位MOV A,#0CCH ;忽略64位ROM地址,直接发送存储器指令ACALL DS_WR_BYTEMOV A,#044H ;发送开始转换指令ACALL DS_WR_BYTESETB EA ;转换期间可以开中断MOV DQ_DELAY,#200 ;转换时间最长750ms,延时了800ms。

基于51单片机的DS18B20温度传感器驱动程序加详解

基于51单片机的DS18B20温度传感器驱动程序加详解

基于51单片机的DS18B20温度传感器驱动程序加详解//此部分为18B20的驱动程序//本程序验证通过,晶振为12MHz#include <reg52.H>#include <intrins.h>sbit D18B20=P3^7; //DQ接P3^7#define NOP() _nop_()#define _Nop() _nop_()void TempDelay (unsigned char idata us); //延时函数定义void Init18b20 (void); //初始化函数定义void WriteByte (unsigned char idata wr); //单字节写入void read_bytes (unsigned char idata j); //定义多字节数据读取unsigned char CRC (unsigned char j);//定义校验码数组void GemTemp (void); //数据处理void Config18b20 (void); //配置上下限即处理位数(9/10/11) void ReadID (void); //读取器件ID,即ROM中的数据void TemperatuerResult(void); //最终数据输出//bit flag;unsigned int idata Temperature,D[10]; //定义温度数组unsigned char idata temp_buff[9]; //定义RAM数据暂存数组//存储读取的字节,read scratchpad为9字节,read rom ID为8字节unsigned char idata id_buff[8]; //定义ROM数据暂存数组unsigned char idata *p,TIM; //指针变量unsigned char idata crc_data; //CRC计算变量定义unsigned char code CrcTable [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, 12 8, 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, 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, 2 05,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 2 38,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 1 45, 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, 2 44, 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, 247, 182, 232, 10, 84, 2 15, 137, 107, 53};//CRC数据表//Function:延时处理void TempDelay (unsigned char idata us){while(us--);}//Function:18B20初始化void Init18b20 (void){D18B20=1; //侦测到下跳沿,初始化_nop_();D18B20=0;TempDelay(160); //delay480 us (480)_nop_();D18B20=1; //释放总线TempDelay(30); //delay 96 us (60-112)_nop_();_nop_();_nop_(); //18B20侦测到此上升沿,会自动应答//发送presence信号//if(D18B20==0)// flag = 1; //detect 1820 success!//else// flag = 0; //detect 1820 fail!TempDelay(30); //delay 96 us(60-240)_nop_(); //发送应答脉冲_nop_();D18B20 = 1; //释放总线}//Function:向18B20写入一个字节void WriteByte (unsigned char idata wr) //单字节写入{unsigned char idata i;for (i=0;i<8;i++){D18B20 = 1;_nop_();D18B20 = 0; //侦测到下跳沿,初始化_nop_();D18B20=wr&0x01; //写数据在(60-120)us内TempDelay(30); //delay 96(60-120)us_nop_();_nop_(); //至少大于1us恢复时间D18B20=1; //释放总线wr >>= 1; //一个字节8位,总共写8次}}//Function:读18B20的一个字节unsigned char ReadByte (void) //读取单字节{unsigned char idata i,u=0;for(i=0;i<8;i++){D18B20 = 1;_nop_();D18B20 = 0; //负跳沿,初始化u >>= 1;D18B20 = 1; //释放总线if(D18B20==1)u |= 0x80;TempDelay (3); //15us内采样_nop_();}return(u);}//Function:读18B20void read_bytes (unsigned char idata j){unsigned char idata i;for(i=0;i<j;i++){*p = ReadByte();p++;}}//Function:CRC校验unsigned char CRC (unsigned char j){unsigned char idata i,crc_data=0;for(i=0;i<j;i++) //查表校验crc_data = CrcTable[crc_data^temp_buff[i]]; return (crc_data);//返回i=8时的crc_data}//若为0,校验正确,即此时的temp_buff[8]=0x00; //Function:读取温度void GemTemp (void){read_bytes (9);if (CRC(9)==0) //校验正确{ //暂存器第0字节低8位,第一字节为高8位。

基于STC51单片机的以及DS18B20-恒温控制系统设计程序编写

基于STC51单片机的以及DS18B20-恒温控制系统设计程序编写

--基于STC51单片机的以及DS18B20 恒温控制系统设计软件设计:(C语言)#include<reg51.h>#include<stdio.h>#include <math.h> 库函数#include <intrins.h>#define uint unsigned int#define uchar unsigned charuintLED_Data1,LED_Data2,LED_Data3,LED_Data4,LED_Data5,LED_Data6,LED_Data7 ,LED_Data8;#define CH451_DIG0 0x0800 //数码管位0显示#define CH451_DIG1 0x0900 //#define CH451_DIG2 0x0a00 //#define CH451_DIG3 0x0b00 // CH451宏定义#define CH451_DIG4 0x0c00 //#define CH451_DIG5 0x0d00 //#define CH451_DIG6 0x0e00 //#define CH451_DIG7 0x0f00 //数码管位7显示sbit DOUT=P2^2; //接ch451数据输出sbit LOAD=P2^3; //串行命令加载,上升延激活sbit DIN =P3^3; //串行数据输出,接CH451的数据输人位寻址寄存器定义sbit DCLK=P3^4; //串行数据时钟上升延激活sbit te=P1^6; //sbit sp=P2^6; //控制蜂鸣器引脚位定义sbit up=P2^4;sbit down=P2^5;int temp;int tt,tl=100,tm=300;uint f;uchar key=0; // 存放键盘中断中读取的键值uint display[8]={0x0a00,0x0900,0x0b00,0x0800,0x0c00,0x0d00,0x0e00,0x0f00}; uchar BCD[10]={0xbe,0x24,0xea,0xe6,0x74,0xd6,0xde,0xa4,0xfe,0xf6};void delay(uint i){ 延时程序--while(--i);}void speaker(void){uint i,j;for(j=0;j<250;j++)for(i=0;i<2000;i++){sp=0;} 蜂鸣器发生程序for(i=0;i<3000;i++){sp=1;}sp=1; //防止结束时候是低电平}void Init_Ds18b20(void) / /DS18B20初始化{te=0; //单片机拉低总线delay(500);te=1; //释放总线,即拉高了总线delay(200);}uchar Read_One_Byte(){uchar i=0;uchar dat=0;for(i=8;i>0;i--){te=0;_nop_();_nop_(); 读取字节程序dat>>=1;te=1;delay(1);if(te){dat|=0x80;}delay(60);}return (dat);}void Write_One_Byte(uchar dat){uchar i=0;for(i=8;i>0;i--){te=0;_nop_();_nop_(); 写字节程序te=dat&0x01;delay(60);te=1;dat>>=1;delay(1);}}uint Get_Tmp() //获取温度{float t;uchar a=11,b=0;Init_Ds18b20(); //初始化Write_One_Byte(0xcc); //忽略ROM指令Write_One_Byte(0x44); //温度转换指令Init_Ds18b20(); //初始化Write_One_Byte(0xcc); //忽略ROM指令Write_One_Byte(0xbe); //读读RAM的存储器指令a=Read_One_Byte(); //读取到的第一个字节为温度LSBb=Read_One_Byte(); //读取到的第二个字节为温度MSBtemp=b; //先把高八位有效数据赋于temptemp<<=8; //把以上8位数据从temp低八位移到高八位temp=temp|a; //两字节合成一个整型变量if(temp>0x800){f=1;temp=~(temp)+1;t=temp*0.0625;temp=t*10-0.5;} 得到真实十进制温度值else{f=0;t=temp*0.0625;temp=t*10+0.5;}return(temp);}void CH451_Init() // 初始化{DIN=0;DIN=1;}void CH451_Write(uint dat){uint i;TR1=0;LOAD=1;for(i=12;i>0;i--) 向CH451写命令(送数据){DCLK=0;if((dat&0x01)==0x01)DIN=1;else DIN=0;DCLK=1;dat=dat>>1;}LOAD=0;LOAD=1;TR1=1;}void getkey(){uchar i;uchar command,keycode;command=0x07;LOAD=0;for(i=0;i<4;i++){DIN=command&1;DCLK=0; 获取键盘command>>=1;DCLK=1;}LOAD=1;keycode=0;for(i=0;i<7;i++){keycode<<=1;keycode|=DOUT;DCLK=0;DCLK=1; 获取键盘}key=keycode;}void tempdis(uint v){uchar A0,A1,A2,A3,fl;A0=v/1000; //千位A1=v%1000/100; //百位A2=v%100/10; //十位A3=v%10; //个位if(f==1)fl=0x40;elsefl=0x00;CH451_Write(display[7]);CH451_Write(display[6]+fl);CH451_Write(display[5]+BCD[A0]); 温度显示CH451_Write(display[4]+BCD[A1]);CH451_Write(display[3]+BCD[A2]+1);CH451_Write(display[2]+BCD[A3]);}void main() //主函数{CH451_Init();CH451_Write(0x201); //CH451功能设定CH451_Write(0x403);CH451_Write(0x50f);sp=1;while(1){tt=Get_Tmp();if(tt>tm||tt<tl){delay(50);if(tt>tm||tt<tl)speaker(); 温度高于规定温度启动制冷装置,温度达标后制冷装置关闭if(tt>tm){down=0;}else if(tt<tl){up=0;}}温度低于规定温度启动加热装置,温度达标后关闭加热装置else{up=1;down=1;}tempdis(tt);getkey();switch(key){case 0x40:{while(key!=0x43&key!=0x48&key!=0x4b&key!=0x4a&key!=0x49){getkey();tempdis(tl);if(key==0x41){delay(65000000);if(key==0x41){tl=tl-10;delay(65000000);}} 键盘扫描判断,上下限温度调节else if(key==0x42){delay(65000000);if(key==0x42&&tl<tm){tl=tl+10;delay(65000000);}}}}break;case 0x43:{while(key!=0x40&key!=0x48&key!=0x4b&key!=0x4a&key!=0x49){getkey();tempdis(tm);if(key==0x41){delay(65000000);if(key==0x41&&tm>tl){tm=tm-10;delay(65000000);}}else if(key==0x42){delay(65000000); 键盘扫描判断,上下限温度调节if(key==0x42){tm=tm+10;delay(65000000);}}}}break;case 0x48:break;}}}。

51单片机 18b20显示温度(另一型号程序)

51单片机 18b20显示温度(另一型号程序)

//DS18B20的读写程序,数据脚P2.7 ////温度传感器18B20汇编程序,采用器件默认的12位转化////最大转化时间750微秒,显示温度-55到+125度,显示精度////为0.1度,显示采用4位LED共阳显示测温值////P0口为段码输入,P34~P37为位选///***************************************************/#include <reg51.h>#include <intrins.h> //_nop_();延时函数用#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7; //温度输入口sbit P07=P0^7; //LED小数点控制uint h;uint temp;//////**************温度小数部分用查表法***********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//共阳LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"uchar data temp_data[2]={0x00,0x00}; //读出温度暂放uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用///////*****************11us延时函数*************************///void delay(uint t){for (;t>0;t--);}///****************显示扫描函数***************************/scan(){char k;for(k=0;k<4;k++) //4位LED扫描控制{P0=dis_7[display[k]]; //数据显示if (k==1){P07=0;} //小数点显示P2=k; //位选delay(300);}}/////****************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);}///****************读出温度函数************************///uint 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<<=8;temp=temp|temp_data[0]; // 两字节合成一个整型变量。

C51单片机对DS18B20温度计的控制

C51单片机对DS18B20温度计的控制
//cdeFP-。熄灭
ucharaa;
ucharwei_1,wei_2,wei_3,v,wei_4;
ucharshuju;//得到的十进制温度值
uchartemp[2]={0,0};//存放DS18B20的温度寄存器值
uintvalue=0;//读字节变量
sbitL1=P1;//负温度显示指示
sbitL2=P1;
j++;
val》》=1;//写完一位,移除它
}
}
//============读取温度============
voidRead_Temperature(void)
{
uchark,i,t;
floattemple;/*存放读取的温度值将其除以16即为得到的值*/
ow_reset();//复位
k++;//延时4us
sbitL3=P1;
sbitL4=P1;
sbitDQ=P2;//数据线
sbitFM=P2;//超温控制引脚
voidReadSerialNumber(void);
voidow_reset(void);
voidtmstart(void);
voidReadSerialNumber(void);
voidRead_Temperature(void);
voidwrite_byte(charval)
{
uchari,j;
for(i=8;i》0;i--)//writesbyte,onebitatatime
{
DQ=0;//pullDQlowtostartTImeslot
j++;位开始写
delay_18B20(8);
DQ=1;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DEC A
CJNE A,#0FFH,CO10
MOV LOW2,#9
AJMP CO11
CO10: MOV LOW2,A
MOV LOW1,SET_T1
AJMP CO13
CO11: MOV A,SET_T1
DEC A
CJNE A,#0FFH,CO12
MOV LOW1,#0
DIV AB
MOV TEM_H1,A
MOV A,B
MOV B,#10
DIV AB
MOV TEM_H2,A
MOV TEM_L1,B
RET
;*****************************
SETB FIRST
CLR SET_F
SETB P3.7
SETB WARN_F
MOV WARN_N,#0
MOV CONTER,#140
MOV TMOD,#01H
MOV TH0,#0FCH
MOV TL0,#18H
MOV CTER1,#1
MOV CTER2,#123
SETB EA
SETB ET0
CLR TR0
MOV SET_T1,#3
MOV SET_T2,#6
MOV SET_T3,#0
MOV HIGH1,#3
MOV HIGH2,#6
MOV HIGH3,#5
MOV LOW1,#3
MOV LOW2,#5
MOV LOW3,#5
R_DAT EQU 40H ;从1820读出的值
SET_T1 EQU 41H ;温度设定值高位
SET_T2 EQU 42H ;温度设定值中位
SET_T3 EQU 43H ;温度设定值低位
HIGH1 EQU 44H ;高温上限
HIGH2 EQU 45H
HIGH3 EQU 46H
JNB UP,$
MOV A,SET_T3
ADD A,#5
CJNE A,#0AH,CON3
MOV SET_T3,#0
AJMP CON4
CON3: MOV SET_T3,#5
AJMP SET_T
CON4: MOV A,SET_T2
INC A
CJNE A,#0AH,CON5
AJMP CO9
CO7: MOV HIGH1,A
CO9: MOV A,SET_T3
ADD A,#5
CJNE A,#0AH,CO8
MOV LOW3,#0
MOV LOW1,SET_T1
MOV LOW2,SET_T2
AJMP CO13
CO8: MOV LOW3,#5
MOV A,SET_T2
MOV A,WARN
SUBB A,#6
MOV WARN,A
CO14: MOV A,WARN
DEC A
MOV WARN,A
ANL A,#0FH
CJNE A,#0FH,CO15
MOV A,WARN
SUBB A,#6
MOV WARN,A
CO15: RET
;*******************************
CJNE A,LOW1,JUDGE7
AJMP JUDGE8
JUDGE7: CLR C
SUBB A,LOW1
JNC JUDGE9
AJMP ADD_T
JUDGE8: MOV A,TEM_L1
CJNE A,LOW2,JUDGE10
AJMP JUDGE11
JUDGE10:CLR C
AJMP JUDGE5
JUDGE4: CLR C
SUBB A,TEM_L1
JNC JUDGE3
AJMP DOWN_T
JUDGE5: MOV A,HIGH3
CJNE A,TEM_L2,JUDGE6
AJMP JUDGE3
JUDGE6: CLR C
SUBB A,TEM_L2
MOV HIGH2,#0
AJMP CO6
CO5: MOV HIGH2,A
MOV HIGH1,SET_T1
AJMP CO9
CO6: MOV A,SET_T1
INC A
CJNE A,#0AH,CO7
MOV HIGH1,#9
MOV HIGH2,#9
MOV HIGH3,#9
CON8: MOV SET_T3,#5
CON9: MOV A,SET_T2
DEC A
CJNE A,#0FFH,CON10
MOV SET_T2,#9
AJMP CON11
CON10: MOV SET_T2,A
AJMP SET_T
CON11: MOV A,SET_T1
DEC A
JB ST,CON
JNB ST,$
MOV SET_N,#20
SETB SET_F
LCALL SET_T ;进行温度值设置
CLR SET_F
CON: LCALL DELAY1S
AJMP AGAIN
;*******************************
CONFIG: MOV A,TEM_H2
TEM_L EQU 33H ;低位读数
TEM_H EQU 34H ;高位读数
TEM_L1 EQU 35H ;显示值1
TEM_L2 EQU 36H ;显示值2
TEM_H1 EQU 37H ;显示值3
TEM_H2 EQU 38H ;显示值4
DAT EQU 39H ;将学入1820的数据
JUDGE: MOV A,HIGH1 ;判断温度是否出界
CJNE A,TEM_H2,JUDGE1CLR C
SUBB A,TEM_H2
JNC JUDGE3
AJMP DOWN_T
JUDGE2: MOV A,HIGH2
CJNE A,TEM_L1,JUDGE4
CLR ADD_L
JUDGE9: RET
;********************************
SET_T: ;MOV TEM_H1,#0 ;温度设置子程序
MOV TEM_H2,SET_T1
MOV TEM_L2,SET_T3
MOV TEM_L1,SET_T2
JNB SET_F,SET_OK
SUBB A,LOW2
JNC JUDGE9
AJMP ADD_T
JUDGE11:MOV A,TEM_L2
CJNE A,LOW3,JUDGE12
AJMP JUDGE9
JUDGE12:CLR C
SUBB A,LOW3
JNC JUDGE9
ADD_T: SETB RISE
SETB DOWN_L
MOV WARN,#33H
;LCALL ADOPT
LCALL RESET ;先转换一次
MOV DAT,#0CCH
LCALL WRITE
MOV DAT,#44H
LCALL WRITE
LCALL DELAY1S
AGAIN: CLR TR0
LCALL READ_T ;读温度
DQ EQU P3.0 ;1820数据端
ST EQU P1.1 ;设置键
UP EQU P1.2 ;加一键
DN EQU P1.0 ;减一键
RISE EQU P2.0 ;加温位
DEL_V EQU 30H ;延时值
WAIT_V EQU 31H ;
LOOP_V EQU 32H ;循环次数
JNC JUDGE3
DOWN_T: CLR RISE
CLR DOWN_L
SETB ADD_L
SETB WARN_F
MOV A,CTER2
CJNE A,CTER1,FALSE
CLR FIRST
FALSE: MOV CTER2,CTER1
INC CTER2
RET
JUDGE3: MOV A,TEM_H2
ADD A,#5
CJNE A,#0AH,CO3
MOV HIGH3,#0
AJMP CO4
CO3: MOV HIGH3,#5
MOV HIGH2,SET_T2
MOV HIGH1,SET_T1
AJMP CO9
CO4: MOV A,SET_T2
INC A
CJNE A,#0AH,CO5
SWAP A
ORL A,TEM_L1
SUBB A,WARN
JNC NORMAL
INC WARN_N ;防止误报警
CJNE WARN_N,#5,NORMAL
MOV WARN_N,#0
CLR WARN_F
NORMAL: RET
;********************************
CONTER EQU 53H ;闪烁频率调节值
SCLK EQU P1.3 ;74164时钟输入
IO EQU P3.3 ;74164数据输入
SET_F BIT 00H ;设置标志
FLASH BIT 01H ;闪烁标志
FIRST BIT 02H ;首次标志
WARN_F BIT P0.2 ;报警位
WARN_N EQU R1 ;报警位被置低的次数
ADD_L BIT P0.0 ;加温位(加温LED)
DOWN_L BIT P0.1 ;降温位(降温LED)
相关文档
最新文档