数字温度计程序清单 汇编

合集下载

数字温度计程序

数字温度计程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit d1=P2^0;sbit d2=P2^1;sbit d3=P2^2;sbit d4=P2^3;sbit key1=P3^0;sbit key2=P3^1;sbit key3=P3^2;sbit beep=P3^4;sbit DS=P1^2;sbit ACC_7=ACC^7;uint count=1000,alarm=300;uchar shu;uchar shi,fen,ri,yue,nian,xq,miao,ss; uint temp; // 温度变量uchar flag;uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code tab1[]=//小数点点亮{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void dsreset()//发复位{uint i;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;}uchar tmpread() //读取一字节{uchar j,k,dat;uint i;for(j=1;j<=8;j++){DS=0;i++; //延时DS=1;i++;i++;k=DS;i=8;while(i>0)i--;dat=(k<<7)|(dat>>1);//读出的数据最低位在最前面存一个字节在DAT 里}return(dat);}void tmpwritebyte(uchar dat) //写一个字节{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //写 1{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0; //写 0i=8;while(i>0)i--;DS=1;i++;i++;}}}void tmpchange() //DS18B20温度变换{dsreset();delay(1);tmpwritebyte(0xcc); //跳过读取内存romtmpwritebyte(0x44); //开始转换}uint tmp() //读取温度{float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread(); //a为低字节8位b=tmpread(); //b为高字节8位temp=b; //temp为温度值UINT 16bittemp<<=8; //两个字节组合到一起temp=temp|a;if(b>127){flag=1;ss=flag;temp=~temp+1;}tt=temp*0.0625; // temp/16 则是温度的真实值tt.7位整数,4位小数temp=tt*10+0.5; // 扩大十倍取出了第一位小数return(temp);}void displayTemp(uint temp) //显示温度程序{uchar ge,shi,bai,qian,ser;d1=0;d1=0;d3=0;d4=0;dsreset();ser=temp/10; //分离出三位要显示的数字SBUF=ser;qian=temp/1000;bai=temp/100%10; // 百位数字shi=temp/10%10; // 十位数字ge=temp%10; // 个位数字if(flag==1){flag=0;P0=0xbf;d1=1;delay(2);d1=0;}if(qian!=0){P0=tab[qian];d1=1;delay(2);d1=0;}else{P0=0xff;d1=1;delay(2);d1=0;}if(temp>99){P0=tab[bai];d2=1;delay(2);d2=0;}P0=tab1[shi];d3=1;delay(2);d3=0;P0=tab[ge];d4=1;delay(2);d4=0;}uint keyscan(){if(key1==0){delay(5);if(key1==0){while(!key1);shu++;}}if(key2==0){delay(5);if(key2==0){while(!key2);count=count+10;if(shu==2){alarm+=10;}}}if(key3==0){delay(5);if(key3==0){while(!key3);count=count-10;if(shu==2){alarm-=10;}}}return(count);}void main(){beep=0;delay(10);while( 1 ){tmpchange();tmp( );if(shu==0){displayTemp();}keyscan();if(shu==1){displayTemp(count);}if(shu==2){displayTemp(alarm);}if(shu==3){shu=0;}if(temp>count||(temp<alarm)){beep=0;}elsebeep=1;}}。

数字温度计仿真图+源程序

数字温度计仿真图+源程序

源程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intucharyear,mon,day,xinqi;ucharsecond,minute,hour;ucharReadValue;uchardown,count;uchar flag; // 加减标志位char newsec,newmin,newhour; //重写数据用的秒,分,时char newyear,newmon,newday,newxinqi;uchar q;//---------------------ucharbai,shi,ge,fen,miao;#define t_cont 0.0625#define conever 0x44#define config 0x5f#define read 0xbe#define write 0x4e#define jmp 0xcc#define copy 0x48#define recall 0xb8sbitfmq=P2^3;sbitrs = P2^0;sbitrw = P2^1;sbit e = P2^2;sbit K1=P3^4;sbit K2=P3^5;sbit K3=P3^6;sbit K4=P3^7;sbit DATA=P1^0; //位定义1302芯片的接口sbit SCLK=P1^1; //位定义1302芯片的接口sbit RST =P1^4; //位定义1302芯片的接口bit t_sign;bit flag1;sbit a=ACC^0;sbitdq=P1^5;float temp=0;//----------------------------------------//函数声明//----------------------------------------void delayus(uint n);void delayms(uint k);void mingling(uchar com);void Write1302(uchardat);uchar Read1302(void);void WriteSet1302(ucharCmd,uchardat);uchar ReadSet1302(ucharCmd);void Int1302(void);void readtime(void);void display(void);void Setdisplay(void);void menu(void);void inmenu(void);void max();void min();void funcinc();void turn_sub(ucharnewval,ucharnewaddr); void scanquit();void funcquit();//--------------------------------------------------------//函数功能:us延时//-------------------------------------------------------- void delayus(uint n){uchar i;for(i=0;i<n;i++);}void delayms(uint k){uchar i;for(i=0;i<k;i++)delayus(100);}void delaya(uint m){while(m--);}void init_1820(){uchar i=1;while(flag1==0){dq=1;delaya(8);dq=0;delaya(52);dq=1;delaya(2);while(1){i=dq;if(i==0){flag1=1;delaya(10);break;}}}flag1=0;}/*************向1820发送字节************/ void byte_1820(uchardat){uchar i=0;for(i=0;i<8;i++){dq=0;ACC=dat&0x01;dq=a;delaya(5);dq=1;dat>>=1;}}/**************读1820的数据*************/ uchar read_1820(void){uchari,indat;indat=0;for(i=0;i<8;i++){dq=0;indat>>=1;dq=1;if(dq) indat|=0x80;delaya(4);}return(indat);}/************获取TEM*****************/ void readtem(){uint y;uchar td=0;uchartg=0;uchar k;init_1820();byte_1820(jmp);byte_1820(conever);init_1820();byte_1820(jmp);byte_1820(read);td=read_1820();tg=read_1820();k=tg&0x08;if(k==0x08){t_sign=1;tg=tg&0x07;temp=(tg*256+td)*t_cont;temp=(-temp*100+52800);}else {t_sign=0;tg=tg&0x07;temp=(tg*256+td)*t_cont;temp=temp*100;}bai=(uint)temp/10000;y=(uint)temp%10000;shi=y/1000;y=(uint)y%1000;ge=y/100;y=(uint)y%100;fen=y/10;miao=(uint)y%10;}//----------------------------------------------------------------------//函数功能:向1302写一个字节数据//----------------------------------------------------------------------void Write1302(uchardat){uchar i;SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备delayus(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续写8个二进制位数据{DATA=dat&0x01; //取出dat的第0位数据写入1302delayus(2); //稍微等待,使硬件做好准备SCLK=1; //上升沿写入数据delayus(2); //稍微等待,使硬件做好准备SCLK=0; //重新拉低SCLK,形成脉冲dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位}}//-----------------------------------------------------------------------//函数功能:从1302读一个字节数据//-----------------------------------------------------------------------uchar Read1302(void){uchari,dat;delayus(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续读8个二进制位数据{dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位if(DATA==1) //如果读出的数据是1dat|=0x80; //将1取出,写在dat的最高位SCLK=1; //将SCLK置于高电平,为下降沿读出delayus(2); //稍微等待SCLK=0; //拉低SCLK,形成脉冲下降沿delayus(2); //稍微等待}return dat; //将读出的数据返回}//-----------------------------------------------------------------------//函数功能:根据命令字,向1302写一个字节数据//-----------------------------------------------------------------------void WriteSet1302(ucharCmd,uchardat){RST=0; //禁止数据传递SCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输delayus(2); //稍微等待,使硬件做好准备Write1302(Cmd); //写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}//----------------------------------------------------------------------//函数功能:根据命令字,从1302读取一个字节数据//----------------------------------------------------------------------uchar ReadSet1302(ucharCmd){uchardat;RST=0; //拉低RSTSCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302(); //读出数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递return dat; //将读出的数据返回}//----------------------------------------------------------------------//读取1302内部时间到second,minute,hour;//----------------------------------------------------------------------void readtime(void){ReadValue = ReadSet1302(0x81); //从秒寄存器读数据second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化ReadValue = ReadSet1302(0x83); //从分寄存器读minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化ReadValue = ReadSet1302(0x85); //从分寄存器读hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化ReadValue = ReadSet1302(0x87); //从分寄存器读day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x89); //从分寄存器读mon=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8d); //从分寄存器读year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8b); //从分寄存器读xinqi=(ReadValue&0x0F);}//--------------------------------------------------------------------------------//DS1302的充电设置//--------------------------------------------------------------------------------void Int1302(void){second=ReadSet1302(0x81);second=((second&0x70)>>4)*10+(second&0x0f);WriteSet1302(0x8e,0x00); //允许写入1302WriteSet1302(0x90,0xa9); //打开充电二极管WriteSet1302(0x80,(((second&0x7f)/10)<<4)|(second%10)); //保存当前秒并允许ds1302工作WriteSet1302(0x8e,0x10); //禁止写入1302}//----------------------------------------------------//调时菜单进入//----------------------------------------------------void menu(void){if(!K1){delayms(1);if(!K1){down=1;while(K1!=1); //等待按键松开,如果按键不松,while条件成立进行空的死循环count++; //记录menu按下的次数if(count>7)count=1;WriteSet1302(0x8e,0x00); //允许写入1302second=ReadSet1302(0x81);WriteSet1302(0x80,0x80|second); //按下menu键后禁止ds1302工作,把秒写回1302WriteSet1302(0x8e,0x10); //禁止写入1302}}}//----------------------------------------------------------------------//进入菜单,调时程序//----------------------------------------------------------------------void inmenu(void){switch(count){case 1:{max();min();mingling(0xc7);mingling(0x0f);//开显示显示光标scanquit();}break;case 2:{max();min();mingling(0xc4);mingling(0x0f);//开显示显示光标scanquit();}break;case 3:{max();min();mingling(0xc1);mingling(0x0f);//开显示显示光标scanquit();}break;case 4:{max();min();mingling(0x89);mingling(0x0f);//开显示显示光标scanquit();}break;case 5:{max();min();mingling(0x86);mingling(0x0f);//开显示显示光标scanquit();}break;case 6:{max();min();mingling(0x83);mingling(0x0f);//开显示显示光标scanquit();}break;case 7:{max();min();mingling(0x8d);mingling(0x0f);//开显示显示光标scanquit();}break;default:break;}}//---------------------------------------------------//---------------------------------------------------void max() //判断加{if(!K2){delayms(1);if(!K2)while(!K2);flag=1;funcinc();}}void min() //判断减{if(!K3){delayms(1);if(!K3)while(!K3);flag=0;funcinc();}}//----------------------------------------------------void funcinc(){switch(count){case 1:turn_sub(newsec,0x81);second=ReadSet1302(0x81);WriteSet1302(0x80,0x80|second);break;case 2:turn_sub(newmin,0x83);break;case 3:turn_sub(newhour,0x85);break;case 4:turn_sub(newday,0x87);break;case 5:turn_sub(newmon,0x89);break;case 6:turn_sub(newyear,0x8d);break;case 7:turn_sub(newxinqi,0x8b);break;default: break;}}//--------------------------------------------------------------- void turn_sub(ucharnewval,ucharnewaddr){newval=ReadSet1302(newaddr); //读取当前时间newval=((newval&0x70)>>4)*10+(newval&0x0f); //将bcd码转换成十进制if(flag==1)newval++;else newval--;switch(count){case 1: if(newval>59) newval=0;break;case 2: if(newval>59) newval=0;break;case 3: if(newval>23) newval=0;break;case 4: if(newval>31) newval=0;break;case 5: if(newval>12) newval=0;break;case 6: if(newval>99) newval=0;break;case 7: if(newval>6) newval=0;break;default:break;}WriteSet1302(0x8e,0x00); //允许写入1302WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10)); //将新数据写入寄存器WriteSet1302(0x8e,0x10); //禁止写入1302display(); //将修改后的值显示出来}//-----------------------------------------------------//-----------------------------------------------------void scanquit(){if(!K4){mingling(0x0c);delayms(1);if(!K4)while(!K4);funcquit();}}void funcquit(){mingling(0x0c);count=0;down=0;second=ReadSet1302(0x81);second=((second&0x70)>>4)*10+(second&0x0f);WriteSet1302(0x8e,0x00);WriteSet1302(0x80,(((second&0x7f)/10)<<4)|(second%10)); //保存当前秒并允许ds1302工作WriteSet1302(0x8e,0x10);}//---------------------------------------------------------------------- //显示程序//---------------------------------------------------------------------- //////////////命令/////////////////////void delay(uint m){uinti,j;for(i=0;i<m;i++)for(j=0;j<570;j++);}bit lcd_bz(){bit result;rs=0;rw=1;e=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);e=0;return(result);}void mingling(uchar com){while(lcd_bz());rs=0;e=0;rw=0;P0=com;e=1;e=0;delay(1);}void lcd_pos(ucharpos){mingling(pos);}//////////////数据/////////////////////void shuju(ucharshu){rs=1;rw=0;e=0;P0=shu;e=1;e=0;delay(1);}////////////初始化//////////////////////void init_1602(void){mingling(0X38);//功能设置delay(1);mingling(0X0c);//显示开关控制delay(1);mingling(0X06);//输入方式设置delay(1);mingling(0X01);//清显示delay(1);}//////////////显示//////////////////void date(void){switch(xinqi){case 0: shuju('S');shuju('u');shuju('n');break;case 1: shuju('M');shuju('o');shuju('n');break;case 2: shuju('T');shuju('u');shuju('e');break;case 3: shuju('W');shuju('e');shuju('d');break;case 4: shuju('T');shuju('h');shuju('u');break;case 5: shuju('F');shuju('r');shuju('i');break;case 6: shuju('S');shuju('a');shuju('t');break;default:break;}}void display(void){readtem();readtime();while(lcd_bz());delay(100);lcd_pos(0x80);shuju('2');shuju('0');shuju(year/10+0x30);lcd_pos(0x83);shuju(year%10+0x30);shuju('/');shuju(mon/10+0x30);shuju(mon%10+0x30);shuju('/'); shuju(day/10+0x30);shuju(day%10+0x30);lcd_pos(0xc0);shuju(hour/10+0x30);shuju(hour%10+0x30);shuju(':'); shuju(minute/10+0x30);shuju(minute%10+0x30);shuju(':'); shuju(second/10+0x30);shuju(second%10+0x30);lcd_pos(0x8c);date();lcd_pos(0xc8);if(t_sign==1){shuju(0x2d);delaya(10);if(bai!=0)shuju(0x20);shuju(shi+0x30);shuju(ge+0x30);shuju(0x2e);shuju(fen+0x30);shuju(miao+0x30);shuju(0xdf);shuju(0x43);}else{shuju(0x20);delaya(10);if(bai!=0)shuju(bai+0x30);else shuju(0x20);shuju(shi+0x30);shuju(ge+0x30);shuju(0x2e);shuju(fen+0x30);shuju(miao+0x30);shuju(0xdf);shuju(0x43);}/********/if((shi>=3&&ge>=3)||(shi<=2&&ge<=9)){fmq=0;}if((shi<=3&&ge<3)||(shi>=2&&ge>9))fmq=1;}//---------------------------------------------------------------------- //函数功能:主函数//---------------------------------------------------------------------- void main(void){Int1302();init_1602();init_1820();down=0;count=0;while(1){menu(); //检测是否调时if(down==1){inmenu(); //进入调时模式}else{while(lcd_bz());display();}}}。

数字温度程序

数字温度程序

数字温度计程序清单S1OK EQU 5FHTEMPUTER EQU 39HTEMPH EQU 5EHTEMPL EQU 5DHMS50EQU 5CHSIGN EQU 5BHS1 BIT P1.0S2 BIT P1.1S3 BIT P1.2S4 BIT P1.3ORG 0000HLJMP MAINORG 000BHLJMP TOITORG 0030HMAIN: MOV SP, #60HMOV TMOD, #01HMOV TH0, #3CHMOV TL0, #0B0HSETB ET0SETB TR0SETB EAMOV TEMPH, #30MOV TEMPL, #9MOV TEMPUTER, #15 ;温度最始值MOV S1OK, #00HMOV SIGN, #00HMOV 38H, #0BHMOV 37H, #0CHMOV 36H, #0BHACALL DISPACALL T1S; ***************************************** ; 主程序START: JB S1, NET1ACALL T12MSJB S1, NET1JNB S1, $INC SIGNMOV A, SIGNCJNE A, #1, TIAOACALL TIAOTLTIAO:CJNE A, #2, NET1MOV SIGN, #0ACALL TIAOTH; ***************************************** NET1: MOV A, S1OKCJNE A, #1, STARTMOV A, TEMPUTERSUBB A, TEMPHJNB ACC.7, ALEMMOV A, TEMPUTERSUBB A, TEMPLJB ACC.7, ALEMSETB P2.1ACALL WENDUACALL DISPMOV S1OK, #00HAJMP STARTALEM: MOV 36H, #0CHMOV 37H, #0CHMOV 38H, #0CHCLR P2.1ACALL DISPACALL T1SLCALL WENDULCALL DISPMOV S1OK, #00HSJMP START;***************************************** TIAOTL:MOV 50H, TEMPUTERMOV 37H, TEMPLACALL BIN_BCDACALL DISPACALL T12MSACALL T12MSACALL T12MSACALL T12MSMOV 36H, #0AHMOV 37H, #0AHMOV 38H, #0AHACALL DISPACALL T12MSACALL T12MSACALL T12MSACALL T12MSJB S2, ADD1ACALL T12MSJB S2, ADD1JNB S2, $INC TEMPLMOV A, TEMPLCJNE A, #100, ADD1MOV TEMPL, #0ADD1: JB S3, ADD2ACALL T12MSJB S3, ADD2JNB S3, $DEC TEMPLMOV A, TEMPLCJNE A, #00 , ADD2MOV TEMPL,#100ADD2: JB S4, TIAOTLACALL T12MSJB S4, TIAOTLJNB S4, $MOV TEMPUTER, 50HLJMP START; 高位调整; ***************************************** TIAOTH:MOV 50H, TEMPUTERMOV 37H, TEMPHACALL BIN_BCDACALL DISPACALL T12MSACALL T12MSACALL T12MSACALL T12MSMOV 36H, #0AHMOV 37H, #0AHMOV38H, #0AHACALL DISPACALL T12MSACALL T12MSACALL T12MSACALL T12MSJB S2, ADD11ACALL T12MSJB S2, ADD11JNB S2, $INC TEMPHMOV A, TEMPHCJNE A, #100, ADD11MOV TEMPH, #0ADD11: JB S3, ADD22ACALL T12MSJB S3, ADD22JNB S3, $DEC TEMPHMOV A, TEMPHCJNE A, #00 , ADD22MOV TEMPH,#100ADD22: JB S4, TIAOTHACALL T12MSJB S4, TIAOTHJNB S4, $MOV TEMPUTER, 50HLJMP START; 一秒定时中段; ***************************************** TOIT: PUSH PSWPUSH ACCMOV TH0, #3CHMOV TL0, #0B0HINC MS50MOV A, MS50CJNE A, #14H, RETURNMOV S1OK, #1MOV MS50, #00HRETURN:POP ACCPOP PSWRETI; ***************************************** ;温度总子程序; ***************************************** wendu: ACALL INIT_1820ACALL RE_CONFIGACALL GET_TEMPERACALL TEMPER_COVRET; ***************************************** ;DS18B20初始化程序; ***************************************** INIT_1820:SETB P2.0NOPCLR P2.0MOV R0,#06BHMOV R1,#03HTSR1:DJNZ R0,TSR1 ; 延时MOV R0,#6BHDJNZ R1,TSR1SETB P2.0NOPNOPNOPMOV R0,#25HTSR2:JNB P2.0,TSR3DJNZ R0,TSR2LJMP TSR4 ; 延时TSR3:SETB 20H.1 ; 置标志位,表示DS1820存在LJMP TSR5TSR4:CLR 20H.1 ; 清标志位,表示DS1820不存在LJMP TSR7TSR5:MOV R0,#06BHMOV R1,#03HTSR6:DJNZ R0,TSR6 ; 延时MOV R0,#6BHDJNZ R1,TSR6TSR7:SETB P2.0RET; *****************************************; 重新写DS18B20暂存存储器设定值; *****************************************RE_CONFIG:JB 20H.1,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,#1FH ; 选择9位温度分辨率LCALL WRITE_1820RET; *****************************************; 读出转换后的温度值; *****************************************GET_TEMPER:SETB P2.0 ; 定时入口LCALL INIT_1820JB 20H.1,TSS2RET ; 若DS18B20不存在则返回TSS2:MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820LCALL INIT_1820MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200MOV 37H,A ; 将读出的温度数据保存RET; *****************************************; 写DS18B20的程序; *****************************************WRITE_1820:MOV R2,#8CLR CWR1:CLR P2.0NOPNOPNOPNOPRRC AMOV P2.0,CMOV R3,#35DJNZ R3,$SETB P2.0NOPDJNZ R2,WR12SETB P2.0RET; *****************************************; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据; ***************************************** READ_18200:MOV R4,#2 ; 将温度高位和低位DS18B20中读RE00:MOV R2,#8RE01:CLR CSETB P2.0NOPNOPCLR P2.0NOPNOPNOPSETB P2.0NOPNOPMOV C,P2.0MOV R3,#35RE20:DJNZ R3,RE20RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET; *****************************************; 将从DS18B20中读出的温度数据进行转换; ***************************************** TEMPER_COV:MOV A,#0F0HANL A,36H ; 舍去温度低位中小数点SWAP AMOV 37H,AMOV A,36HJNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值INC 37HTEMPER_COV1:MOV A,35HANL A,#07HSWAP AADD A,37HMOV 37H,A ; 保存变换后的温度数据LCALL BIN_BCDDISP: SETB RS0MOV R0, #36HMOV R7, #3LOOPP:MOV A, @R0MOV DPTR, #TABMOVC A, @A+DPTRMOV SBUF, AJNB TI, $CLR TIINC R0DJNZ R7, LOOPPCLR RS0RETTAB: DB 11H, 0D7H, 32H, 92H, 0D4H, 98H, 18H, 0D1H, 10H, 90H ,0FFH, 070H, 0FEH; 延时子程序T12MS: SETB RS1MOV R7, #18HTM: MOV R6, #0FFHTM6: DJNZ R6, TM6DJNZ R7, TMCLR RS1RET; 开机延时程序T1S: SETB RS1MOV R6, #3LSP:ACALL T12MSDJNZ R6, LSPCLR RS1RETEND3。

C51单片机数字温度计汇编程序及说明书

C51单片机数字温度计汇编程序及说明书

1绪论1.1选题背景随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。

温度测量在物理实验、医疗卫生、食品生产等领域,尤其在热学试验(如:物体的比热容、汽化热、热功当量、压强温度系数等教学实验)中,有特别重要的意义。

现在所使用的温度计通常都是精度为1℃和0.1℃的水银、煤油或酒精温度计。

这些温度计的刻度间隔通常都很密,不容易准确分辨,读数困难,而且他们的热容量还比较大,达到热平衡所需的时间较长,因此很难读准,并且使用非常不方便。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确等优点,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。

因此本课题就尝试通过编程与芯片的结合来解决传统数字温度计的弊端,设计出新型数字温度计。

1.2课题现状分析及研究意义温度传感器的发展现状:温度传感器使用范围广,数量多,居各种传感器之首,其发展大致经历了以下3个阶段:①传统的分立式温度传感器(含敏感元件)——热电偶传感器,主要是能够进行非电量和电量之间转换。

②模拟集成温度传感器/控制器。

集成传感器是采用硅半导体集成工艺制成的,因此亦称硅传感器或单片集成温度传感器。

③智能温度传感器。

它是微电子技术、计算机技术和自动测试技术(ATE_)的结晶。

智能温度传感器内部包含温度传感器、A/D传感器、信号处理器、存储器(或寄存器)和接口电路。

本课题的研究可以应用领域生产、生活等很多领域。

对于家用电器从洗衣机、微波炉到音响等等到处都可以用到温度控制器来方便大家的日常生活。

开发此产品后也可方便应用安装在小至家庭大到工厂车间,小至一个芯片大到一个机械设备。

例如在家庭客厅卧室等必要地方显示室温,可防止家里食物是否变质及早采取措施。

数字温度汇编程序

数字温度汇编程序

数字温度汇编程序概述:数字温度汇编程序是一种用于将温度数据转换为数字形式的计算机程序。

它可以接收各种温度输入,如摄氏度、华氏度或开尔文度,并将其转换为数字格式,以便于存储、处理和分析。

程序设计:数字温度汇编程序的设计主要包括输入模块、转换模块和输出模块。

1. 输入模块:输入模块负责接收用户输入的温度数据。

可以通过命令行参数、文本文件或图形用户界面等方式进行输入。

程序应该能够处理不同单位的温度输入,如摄氏度、华氏度或开尔文度。

2. 转换模块:转换模块负责将输入的温度数据转换为数字格式。

根据输入的单位,程序应该能够进行相应的转换计算。

例如,将摄氏度转换为华氏度的公式为:华氏度 = 摄氏度 * 9/5 + 32。

3. 输出模块:输出模块负责将转换后的数字温度数据进行输出。

可以将结果显示在命令行界面、保存到文本文件或通过网络发送给其他系统。

输出的格式应该清晰易读,并且包含必要的单位信息。

示例代码:下面是一个简单的数字温度汇编程序的示例代码:```assembly; 输入模块input:; 读取用户输入的温度值; 可以通过命令行参数或其他方式获取输入; 转换模块convert:; 判断输入的温度单位,并进行相应的转换计算; 如果输入的是摄氏度,则进行摄氏度到华氏度的转换; 如果输入的是华氏度,则进行华氏度到摄氏度的转换; 如果输入的是开尔文度,则进行开尔文度到摄氏度的转换; 输出模块output:; 将转换后的温度值进行输出; 可以将结果显示在命令行界面或保存到文件```示例数据:假设用户输入的温度为摄氏度,数值为25°C。

程序将进行摄氏度到华氏度的转换,计算结果为77°F。

最后,程序将输出转换后的温度值:77°F。

总结:数字温度汇编程序是一种用于将温度数据转换为数字形式的计算机程序。

它通过输入模块接收用户输入的温度数据,然后通过转换模块将其转换为数字格式,最后通过输出模块将转换后的温度值进行输出。

数字温度计的c语言程序

数字温度计的c语言程序
*************************************************************************/
void Read_Temperature()
{
if(Init_DS18B20( )==1)
DS18B20_IS_OK=0; //DS18B20故障
Temp_Value[1]=ReadOneByte(); //温度高8位
Alarm_Temp_HL[0]=ReadOneByte();
Alarm_Temp_HL[1]=ReadOneByte();
DS18B20_IS_OK=1;
}
}
///设置报警值
void Set_Alarm_Temp_Value()
程序名称:在数码管上显示温度
*************************************************************************/
void Display_Temperture()
{
uchar i;
uchar t=150; //延时值
uint Time0_Count=0;
/*******************************************************************************************************************************/
#include &lt;reg51.h&gt;
#include &lt;intrins.h&gt;
#define uchar unsigned char

数字温度计C程序

数字温度计C程序

/*在使用这个例子时,要将J11插针短接到2、3两脚,引入温感数据脚到P33*/#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit greenled=P3^1; //定义绿灯的控制端口sbit redled=P3^0; //定义红灯的控制端口sbit DS=P1^0; //定义DS18B20接口sbit speaker=P1^1; //定义蜂鸣器的控制端口sbit k1=P3^2; //定义功能键的控制键sbit k2=P3^3; //定义温度定位键sbit k3=P3^4; //定义温度加的控制键sbit k4=P3^5; //定义蜂鸣器减停止按键float m1=2,n1=10,q1=0; //最高温度显示位H20.0float m2=1,n2=10,q2=0; //最低温度显示位L10.0int temp;int temp1=0; //key1引起的外部中断0char zancun1=1;char zancun2=0;uchar flag1;void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc 为显示的个数void delay();//延时子函数,5个空指令code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, // 0-90xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef, // 10-190x40,// 20 符号位"-"0x39,// 21 符号c0x00,// 22 空表0x76,// 23 高温H0x38};// 24 低温L//共阴数码管显示数的组成是"0-9""0-9有小数点的" "-" "C" "空表" "H " " L" unsigned char l_tmpdate[4]={0,0,0,0};//定义数组变量,int tmp(void);void tmpchange(void);void tmpwritebyte(uchar dat);uchar tmpread(void);bit tmpreadbit(void);void dsreset(void);void delayb(uint count);void main() //主函数{EA=1; //首先开启总中断EX0=1; //开启外部中断0IT0=1; // 设置成下降沿触发方式redled=1;greenled=1;while(1){if(temp1==0)//正常温度显示{while(1){uchar i;int l_tmp;tmpchange(); //温度转换l_tmp=tmp(); //读取温度值if(l_tmp<0) //负数处理{ l_tmpdate[0]=20;l_tmp--;l_tmp--;l_tmp=~l_tmp;l_tmp=l_tmp%1000;l_tmpdate[1]=l_tmp/100;//获取十位if(l_tmpdate[1]==0)l_tmpdate[1]=22;l_tmp=l_tmp%100;l_tmpdate[2]=l_tmp/10;//获取个位再l_tmpdate[2]+=10;//加入小数点,查表可得出有小数点的排在后10位,所以加10l_tmpdate[3]=l_tmp%10;//获取小数第一位}else //正数的处理{l_tmpdate[0]=l_tmp/1000; //显示百位if(l_tmpdate[0]==0)l_tmpdate[0]=22;//判断温度为正温度且没有上百,前面不显示,查表第12是空l_tmp=l_tmp%1000;l_tmpdate[1]=l_tmp/100; //显示十位if(l_tmpdate[0]==22&&l_tmpdate[1]==0) //百位和十位同时为0 则不显示l_tmpdate[1]=22;l_tmp=l_tmp%100;l_tmpdate[2]=l_tmp/10;//获取个位再l_tmpdate[2]+=10;//加入小数点,查表可得出有小数点的排在后10位,所以加10l_tmpdate[3]=l_tmp%10;//获取小数第一位}if(l_tmpdate[1]==22)//对于低温限制为小于10度的处理{if(m1*10+n1+q1*0.1>=(l_tmpdate[1]-22)*10+l_tmpdate[2]+l_tmpdate[3]*0.1&&m2*10+n2+q2*0.1<=(l_tmpdate[1]-22)*10+l_tmpdate[2]+l_tmpdate[3]*0.1){greenled=0;//温度高于最低限和最高限绿灯亮,红灯灭,蜂鸣器不报警redled=1;speaker=1;}else{greenled=1;//温度高于最低限和最高限绿灯灭,红灯亮,蜂鸣器报警redled=0;speaker=zancun2;}}else//对于低温为两位数字的处理{if(m1*10+n1+q1*0.1>=l_tmpdate[1]*10+l_tmpdate[2]+l_tmpdate[3]*0.1&&m2*10+n2+q2*0.1<=l_tmpdate[1]*10+l_tmpdate[2]+l_tmpdate[3]*0.1){greenled=0;///温度高于最低限和最高限绿灯亮,红灯灭,蜂鸣器不报警redled=1;speaker=1;}else{greenled=1;//温度高于最低限和最高限绿灯灭,红灯亮,蜂鸣器报警redled=0;speaker=zancun2;}}if(k4==0){ while(k4==0)//消抖程序{_nop_();}zancun2++;if(zancun2==2){zancun2=0;}}for(i=0;i<100;i++)//循环输出45次,提高亮度仿真时使用100 比较稳定{display(l_tmpdate,4);}if(zancun1==0){ zancun1=1;break;}}}if(temp1==1)//高温设置{ int i,n=0,m=0;l_tmpdate[0]=23;l_tmpdate[1]=m1;l_tmpdate[2]=n1;l_tmpdate[3]=q1;while(1){for(i=0;i<30;i++)//循环输出40次,提高亮度{display(l_tmpdate,4);if(k2==0)//确定调试第几个数码管{n++;if(n>=3)n=0;while(k2==0)//消抖程序{_nop_();}}if(n==0)// 第一位数码管的设置{if(k3==0){while(k3==0)//消抖程序{_nop_();}m1++;if(m1==10) //如果第一位数码管是9,则变为- m1=20;if(m1==21) //如果第一位数码管是-,则变为0 m1=0;l_tmpdate[1]=m1;l_tmpdate[2]=n1;l_tmpdate[3]=q1;}}if(n==1)//第二位数码管的设置{if(k3==0){while(k3==0)//消抖程序{_nop_();}n1++;if(n1>=20)n1=10;l_tmpdate[1]=m1;l_tmpdate[2]=n1;l_tmpdate[3]=q1;}}if(n==2)//第三位数码管的设置{if(k3==0){while(k3==0)//消抖程序{_nop_();}q1++;if(q1>=10)q1=0;l_tmpdate[1]=m1;l_tmpdate[2]=n1;l_tmpdate[3]=q1;}}}if(zancun1==0)// 当从中断程序回来时,可以跳出程序{ zancun1=1;break;}}}if(temp1==2)//低温设置{int i,n=0,m=0;l_tmpdate[0]=24;l_tmpdate[1]=m2;l_tmpdate[2]=n2;l_tmpdate[3]=q2;while(1){for(i=0;i<30;i++)//循环输出40次,提高亮度{display(l_tmpdate,4);if(k2==0)//确定调试第几个数码管{n++;if(n>=3)n=0;while(k2==0)//消抖程序{_nop_();}}if(n==0)// 第一位数码管的设置{if(k3==0){while(k3==0)//消抖程序{_nop_();}m2++;if(m2==10) //如果第一位数码管是9,则变为- m2=20;if(m2==21) //如果第一位数码管是-,则变为0 m2=0;l_tmpdate[1]=m2;l_tmpdate[2]=n2;l_tmpdate[3]=q2;}}if(n==1)//第二位数码管的设置{if(k3==0){while(k3==0)//消抖程序{_nop_();}n2++;if(n2>=20)n2=10;l_tmpdate[1]=m2;l_tmpdate[2]=n2;l_tmpdate[3]=q2;}}if(n==2)//第三位数码管的设置{if(k3==0){while(k3==0)//消抖程序{_nop_();}q2++;if(q2>=10)q2=0;l_tmpdate[1]=m2;l_tmpdate[2]=n2;l_tmpdate[3]=q2;}}}if(zancun1==0){ zancun1=1;break;}}}}}void key_scan1() interrupt 0{temp1++;if(temp1==3)temp1=0;zancun1=0;}void display(unsigned char *lp,unsigned char lc)//显示{unsigned char i; //定义变量P0=0x00; //端口2为输出P2=0xf7; //将P2口的输出1111 0111,对应第一个数码管for(i=0;i<lc;i++){ //循环显示P0=table[lp[i]]; //查表法得到要显示数字的数码段delay();delay();delay();P0=0x00; //清0端口,准备显示下位P2>>=1; //下一位数码管if(i==3) //检测显示完4位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据break;}}void delay(void) //空5个指令{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }void delayb(uint count) //delay{uint i;while(count){i=200;while(i>0)i--;count--;}}/*。

51单片机程序(数字温度计)

51单片机程序(数字温度计)

数字温度计1、LCD.c#include <reg51.h>#include<LCD.h>unsigned char code number_X[]={ //宽x高=8x16,纵向字节倒序0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //00x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, //10x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, //20x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, //30x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, //40x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, //50x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, //60x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, //70x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, //80x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //90x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // .0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, //-0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //nop 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, //:0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};void LCD_WriteCommandE1(unsigned char com) {while(CRADD1 & 0x80);CWADD1 = com;}void LCD_WriteDataE1(unsigned char dat)while(CRADD1 & 0x80);DWADD1 = dat;}void LCD_WriteCommandE2(unsigned char com) {while(CRADD2 & 0x80);CWADD2 = com;}void LCD_WriteDataE2(unsigned char dat){while(CRADD2 & 0x80);DWADD2 = dat;}void LCD_Init(){LCD_WriteCommandE1(0xe2);LCD_WriteCommandE2(0xe2);LCD_WriteCommandE1(0xa4);LCD_WriteCommandE2(0xa4);LCD_WriteCommandE1(0xa9);LCD_WriteCommandE2(0xa9);LCD_WriteCommandE1(0xa0);LCD_WriteCommandE2(0xa0);LCD_WriteCommandE1(0xc0);LCD_WriteCommandE2(0xc0);LCD_WriteCommandE1(0xaf);LCD_WriteCommandE2(0xaf);}void LCD_Clear(void){unsigned char i,j;for(i=0;i<4;i++){LCD_WriteCommandE1(i+0xb8);LCD_WriteCommandE2(i+0xb8);LCD_WriteCommandE1(0x00);LCD_WriteCommandE2(0x00);for(j=0;j<0x50;j++){LCD_WriteDataE1(0x00);LCD_WriteDataE2(0x00);}}void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p) {unsigned int seg,i,j;unsigned char a,L,n;switch(lin){case 0: n=0xba;break;case 1: n=0xb8;break;}for(i=0;i<len;i++){for(j=0;j<2;j++){L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg<16;seg++){if (L < 61){a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(*p++);}else{a = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(*p++);}L++;}}col=col+16;}}void display_number(unsigned char lin,unsigned int col,unsigned char num){unsigned int seg,i,j;unsigned char a,L,n,k;switch(lin){case 0: n=0xba;break;case 1: n=0xb8;break;}k=num*16;for(j=0;j<2;j++){L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg<8;seg++){if (L < 61){a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(number_X[k++]);}else{a = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(number_X[k++]);}L++;}}}void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat) {unsigned int seg;unsigned char k[4];k[3]=dat%10;k[2]=((dat/10)%10);k[1]=((dat/100)%10);k[0]=((dat/1000)%10);if(k[0]==0) {k[0]=12;}if((k[0]==12)&&(k[1]==0)){ k[0]=12;k[1]=12;}if((k[0]==12)&&(k[1]==12)&&(k[2]==0)){k[0]=12;k[1]=12;k[2]=12;}for(seg=0;seg<4;seg++){display_number(lin,col,k[seg]);col=col+10;}}void display_signed_int(unsigned char lin,unsigned int col,signed int dat){unsigned int seg;unsigned char k[5],a;k[0]=12;if(dat<0){dat=(~dat)+1;k[0]=11;}k[4]=dat%10;k[3]=((dat/10)%10);k[2]=((dat/100)%10);k[1]=((dat/1000)%10);a=k[0];if(k[1]==0) {k[0]=12;k[1]=a;}if((k[1]==a)&&(k[2]==0)){ k[0]=12;k[1]=12;k[2]=a;}if((k[1]==12)&&(k[2]==a)&&(k[3]==0)){k[0]=12;k[1]=12;k[2]=12;k[3]=a;}for(seg=0;seg<5;seg++){display_number(lin,col,k[seg]);col=col+10;}}void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat) {unsigned int seg;unsigned char k[3];k[1]=dat%10;k[0]=((dat/10)%10);for(seg=0;seg<2;seg++){display_number(lin,col,k[seg]);col=col+10;}}2、LCD.h#include <reg51.h>#include <absacc.h>#ifndef __LCD__#define __LCD__#define CWADD1 XBYTE[0x8000]#define DWADD1 XBYTE[0x8001]#define CRADD1 XBYTE[0x8002]#define DRADD1 XBYTE[0x8003]#define CWADD2 XBYTE[0x8004]#define DWADD2 XBYTE[0x8005]#define CRADD2 XBYTE[0x8006]#define DRADD2 XBYTE[0x8007]extern void LCD_Init();extern void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p);extern void display_signed_int(unsigned char lin,unsigned int col,signed int dat);extern void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat);extern void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat);extern void LCD_Clear(void);#endif3、DS18B20.c#include <reg51.h>#include "string.h"#include "intrins.h"#include "DS18B20.h"sbit DQ=P1^0;void delay(unsigned int uSeconds){for(;uSeconds>0;uSeconds--);}unsigned char ow_reset(void){unsigned char xdata presence;DQ = 0;delay(48);DQ = 1;delay(7);presence = DQ;delay(48);return(presence);}unsigned char read_byte(void){unsigned char i;unsigned char value = 0;for (i=8;i>0;i--){value>>=1;DQ = 0; // pull DQ low to start read timeslotDQ = 1; // then rlease DQ_nop_();_nop_();_nop_();_nop_();_nop_(); // read DQ data at 1 to 15us,here delay 6us;if(DQ)value|=0x80;delay(7); // wait for rest of timeslot,72us }return(value);}void write_byte(char val){unsigned char i;for (i=8; i>0; i--) // writes byte, one bit at a time{DQ = 0; // pull DQ low to start timeslotDQ = val&0x01;delay(7); // hold value for remainder of timeslot,here 72us DQ = 1;val=val/2;}delay(5);}float Read_Temperature(void){unsigned char Hdata,Ldata,b;int a;bit flag;float x,y,z;ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0xBE); // Read Scratch Paddelay(100);Ldata=read_byte(); // Low byte firstHdata=read_byte(); // High byte afterow_reset();write_byte(0xCC); //Skip ROMwrite_byte(0x44); // Start Conversiona=Hdata*256+Ldata;x=(float)(Ldata&0x0f);x=x/16;if(a<0)flag=1;else flag=0;b=a>>4;z=(float)(b);if(flag==1){b=~b+1;z=(float)(b);z=0-z;}y=z+x;return y;}4、DS18B20.h#ifndef __DS18B20__#define __DS18B20__extern float Read_Temperature(void); #endif5、main.c#include <reg51.h>#include<LCD.h>#include<main.h>#include "DS18B20.h"void wait(unsigned int x){unsigned int i;i=0;for(i=0;i<x;i++);}void main(void){float F;signed int a;LCD_Init();LCD_Clear();display_cn(0,20,5,szwdj);display_cn(1,0,3,wdz);while(1){F=Read_Temperature( );a=(signed int)F;display_signed_int(1,40,a);wait(5000);}}6、main.h#ifndef MAIN_H__#define MAIN_H__// 中文字模库16x16点阵code unsigned char szwdj[]={ //纵向字节倒序。

数字温度计设计汇编源程序

数字温度计设计汇编源程序

;================================================================ ;DS18B20温度计;采用4位LED共阳显示器显示测温值,显示精度0.1℃,测温范围-55~+125℃;用AT89C51单片机,12MHz晶振;DS1302时钟芯片实现日历年月日时分秒的显示;============================常数定义============================= TIMEL EQU 0E0H ;20ms,定时器0时间常数TIMEH EQU 0B1HSECOND EQU 30HMINUTE EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HWEEK EQU 35HYEAR EQU 36HTEMPHEAD EQU 38HTEMP_UPPER EQU 2AHTEMP_LOWER EQU 2BH;==========================工作内存定义============================ BITST DATA 20HTIME1SOK BIT BITST.1TEMPL DATA 26HTEMPH DATA 27HTEMPHC DATA 28HTEMPLC DATA 29H;============================= 引脚定义=========================== TEMPDIN B IT P3.7ALARMDIN BIT P1.6RST BIT P1.2CLK BIT P1.1IO BIT P1.0;============================= 中断向量区========================= ORG 0000HLJMP STARTORG 000BHLJMP T0IT;=============================系统初始化========================== ORG 0100HSTART: MOV SP,#60HCLSMEM: MOV R0,#20HMOV R1,#60HCLSMEM1: MOV @R0,#00HINC R0DJNZ R1,CLSMEM1MOV TMOD,#00010001B ;定时器0工作方式1(16BIT)MOV TH0,#TIMEHMOV TL0,#TIMEL ;20msMOV SECOND,#00HMOV MINUTE,#00HMOV HOUR,#14HMOV DAY,#17HMOV MONTH,#01HMOV WEEK,#01HMOV YEAR,#13HMOV TEMP_UPPER,#0AHMOV TEMP_LOWER,#8AHSETB ET0SETB EAMOV PSW,#00H;================================================================= ;============================= 主程序============================= ;=================================================================LCALL SETDS1302START1: LCALL R EAD_TEMP ;读出温度值子程序LCALL CONVTEMP ;温度BCD码计算处理子程序LCALL REFBCD ;显示区BCD码温度值刷新子程序LCALL GETDS1302SETB TR0LCALL ALARM_JUDGEJNB F0,MAINLCALL ALARM_BEEPMAIN: LCALL DISP_TEMP ;调用显示子程序LCALL DISPLAY_TIMEJNB TIME1SOK,MAINCLR TIME1SOK ;测温每1s一次MAIN1: LCALL DISP_TEMP ;调用显示子程序LCALL DISPLAY_DA TEJNB TIME1SOK,MAIN1CLR TIME1SOK ;测温每1s一次LJMP START1;====================== 定时器0中断服务程序=======================T0IT: PUSH PSWMOV PSW,#10HMOV TH0,#TIMEHMOV TL0,#TIMELINC R7CJNE R7,#50,T0IT1MOV R7,#00HSETB TIME1SOK ;1s定时到标志T0IT1: POP PSWRETI;================================================================= ;============================= 子程序区=========================== ;=================================================================;=============================初始化DS18B20======================= INITDS1820:SETB TEMPDINNOPNOPCLR TEMPDINMOV R6,#0A0HDJNZ R6,$MOV R6,#0A0HDJNZ R6,$SETB TEMPDINMOV R6,#32HDJNZ R6,$MOV R6,#3CHLOOP1820: MOV C,TEMPDINJC INITDS1820OUTDJNZ R6,LOOP1820MOV R6,#064HDJNZ R6,$SJMP INITDS1820INITDS1820OUT: SETB TEMPDINRET;====== 读DS18B20的程序,从DS18B20中读出一个字节的数据============= READDS1820: MOV R7,#08HSETB TEMPDINNOPNOPREADDS1820LOOP: CLR TEMPDINNOPNOPNOPSETB TEMPDINMOV R6,#07H ;DELAY 15usDJNZ R6,$MOV C,TEMPDINMOV R6,#3CH ;DELAY 120usDJNZ R6,$RRC ASETB TEMPDINDJNZ R7,READDS1820LOOPMOV R6,#3CH ;DELAY 120 usDJNZ R6,$RET;======== 写DS18B20的程序,从DS18B20中写一个字节的数据============= WRITEDS1820: MOV R7,#08HSETB TEMPDINNOPNOPWRITEDS1820LOP: CLR TEMPDINMOV R6,#07H ;DELAY 15usDJNZ R6,$RRC AMOV TEMPDIN,CMOV R6,#34H ;DELAY 104usDJNZ R6,$SETB TEMPDINDJNZ R7,WRITEDS1820LOPRET;========================= READ TEMP =========================== READ_TEMP: LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820 ;SKIP ROMMOV R6,#34H ;DELAY 104usDJNZ R6,$MOV A,#44HLCALL WRITEDS1820 ;START CONVERSIONMOV R6,#34H ;DELAY 104DJNZ R6,$READTEMP1: LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820 ;SKIP ROMMOV R6,#34H ;DELAY 104usDJNZ R6,$MOV A,#0BEHLCALL WRITEDS1820 ;SCRATCHPADMOV R6,#34H ;DELAY 104usDJNZ R6,$MOV R5,#09HMOV R0,#TEMPHEADMOV B,#00HREADTEMP2: LCALL READDS1820MOV @R0,AINC R0DJNZ R5,READTEMP2MOV A,TEMPHEAD+0MOV TEMPL,AMOV A,TEMPHEAD+1MOV TEMPH,AREADTEMPOUT: RET;================== 处理温度BCD码子程序========================== CONVTEMP: MOV A,TEMPHANL A,#80HJZ TEMPC1CLR CMOV A,TEMPLCPL AADD A,#01HMOV TEMPL,AMOV A,TEMPH ;-CPL AADDC A,#00HMOV TEMPH,A ;TEMPHC HI=符号位MOV TEMPHC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH ;+TEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;乘0.0625MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分BCDMOV A,TEMPL ;整数部分ANL A,#0F0HSWAP AMOV TEMPL,AMOV A,TEMPHANL A,#0FHSWAP AORL A,TEMPLLCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHC LOW=十位数BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI=个位数BCDORL A,TEMPLCMOV TEMPLC,AMOV A,R7JZ TEMPC12ANL A,#0FHSWAP AMOV R7,AMOV A,TEMPHC ;TEMPLC HI=百位数BCDANL A,#0FHORL A,R7MOV TEMPHC,ATEMPC12: RET;========================= 小数部分码表=========================== TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06HDB 06H,07H,08H,08H,09H,09H;====================== 刷新BCD码温度值子程序=============== REFBCD: MOV A,TEMPLCANL A,#0FHMOV 70H,AMOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,AMOV A,TEMPHCANL A,#0FHMOV 72H,AMOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,AMOV A,TEMPHCANL A,#0F0HCJNE A,#010H,REFBCD0SJMP REFBCD2REFBCD0: MOV A,TEMPHCANL A,#0FHJNZ REFBCD2 ;十位数是0MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,#0AH ;符号位不显示MOV 72H,A ;十位数显示符号REFBCD2: RET;======================= 即时温度显示子程序===============================;显示数据在70H~73H单元内,用4位LED共阳数码管显示,P0口输出段码数据,;P3口做扫描控制,每个LED数码管亮1ms时间再逐位循环。

数字温度计论文 C语言+汇编语言

数字温度计论文 C语言+汇编语言

前言温度的测量对人类日常生活、工业生产、气象预报、物资仓储等都起着极其重要的作用,因此研究温度的测量方法和装置具有重要的意义。

近年来,温度检测领域发展迅速,并且随着数字技术的发展,温度的测控芯片也相应的登上历史的舞台,能够在工业、农业等各个领域中广泛使用。

温度的测量的关键之处是温度传感器,其往往决定着一个温度检测系统的性能。

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

热敏电阻虽成本低,但需信号处理电路,电路复杂,可靠性较低,测温准确度及抗干扰能力也有一定的不足。

近年来,传感器正处于传统型向新型传感器转型的发展阶段。

新型的温度传感器的特点是微型化、数字化、智能化、多功能化、系统化、网络化,它提高了抗干扰能力和可靠性,而且使系统结构更简洁,维护方便,缩小了空间。

单片机具有集成度高、功能强、体积小、价格低、抗干扰能力等优于一般CPU的优点,因此往往采用单片机作为数字控制器取代模拟控制器。

温度控制系统在国内各行各业的应用虽然已经十分广泛,但从国内生产的温度控制器来讲,总体发展水平仍然不高,同日本、美国、德国等先进国家相比,仍然有着较大的差距。

成熟的温控产品主要以“点位”控制及常规的PID控制器为主,它们只能适应一般温度系统控制,而用于较高控制场合的智能化、自适应控制仪表,国内技术还不十分成熟,形成商品化并广泛应用的控制仪表较少。

随着我国经济的发展及加入WTO,我国政府及企业对此都非常重视,对相关企业资源进行了重组,相继建立了一些国家、企业的研发中心,开展创新性研究,使我国仪表工业得到了迅速的发展。

[关键字]AT89C52、DS28B20温度传感器目录正文 (1)1 设计目的及意义 (1)1.1 设计意义 (1)1.2设计目的 (1)2 目标与总体方案 (1)2.1设计目标 (1)2.2设计总体方案 (2)3 设计方法与内容 (2)3.1 系统组成 (2)3.2 AT89C52简介 (3)3.3 DS18B20温度传感器简介 (7)4 程序流程设计 (12)4.1 主程序 (12)4.2 DS18B20 复位子程序 (13)4.3 读温度子程序 (13)4.4 写DS18B20命令子程序 (14)4.5 数据处理子程序 (14)结论 (15)参考文献 (15)附录一 (16)附录二 (19)正文1 设计目的及意义1.1 设计意义随着新技术的不断开发与应用,近年来单片机发展十分迅速,一个以微机应用为主的新技术革命浪潮正在蓬勃兴起,单片机的应用已经渗透到电力、冶金、化工、建材、机械、食品、石油等各个行业。

数字温度传感器DS18B20汇编程序例子

数字温度传感器DS18B20汇编程序例子

;DS18B20温度传感器和7个LED数码显示程序(原创程序,请支持)ORG 0000H;LED数码管采用动态,P0口接八个数据口,P2.0-P2.2采用3-8译码器控制七个LED TX BIT P2.3 ;DS18B20数据口接P2.3FLAG BIT 10HTEMH EQU 50H ;整数部分TEML EQU 51H ;小数部分MOV SP,#60HCLR EAAJMP MAINORG 0200HMAIN:;MOV R0,#10LCALL TMP;温度传感器设置LCALL CHANG;温度转换为十进制STR:LCALL DISPLAY;温度显示;DJNZ R0,STRAJMP MAIN;//////////////////////////TMP:;温度传感器DS18B20LCALL RESERTMOV A,#0CCHLCALL WRITEMOV A,#44HLCALL WRITE;LCALL DELAY750;延时750MsLCALL RESERTMOV A,#0CCHLCALL WRITEMOV A,#0BEHLCALL WRITELCALL READMOV 30H,ALCALL READMOV 31H,ARETDELAY750:;750USDELAYSETB RS0MOV R0,#20MS2:MOV R1,#20MS1:MOV R2,#20DJNZ R2,$DJNZ R1,MS1DJNZ R0,MS2CLR RS0RET;////////////////////////////CHANG:;温度转换为十进制PUSH APUSH BMOV A,31HANL A,#07HSWAP AMOV B,AMOV A,30HANL A,#0F0HSWAP AADD A,BMOV TEMH,AMOV A,30HANL A,#0FHMOV TEML,AMOV A,31HJNB ACC.3,POSI;区分正负温度;//////////////负温度转化MOV A,TEMLSWAP ACPL AANL A,#0F0HADD A,#10HSWAP AMOV 1FH,CMOV TEML,AMOV A,TEMHCPL ASUBB A,#80HMOV C,1FHADDC A,#0MOV 70H,#20AJMP NEGPOSI:MOV A,TEMHMOV B,#100DIV ABMOV 70H,AMOV A,BNEG:MOV B,#10DIV ABMOV 71H,AMOV A,BADD A,#10MOV 72H,A;整数部分分离MOV A,TEMLMOV B,#5MUL ABMOV B,#10DIV ABMOV 76H,BMOV 75H,AMOV A,TEMLMOV B,#2MUL ABADD A,75HMOV B,#10DIV ABMOV 75H,BMOV 74H,AMOV A,TEMLMOV B,#6MUL ABADDC A,74HMOV B,#10DIV ABMOV 74H,BMOV 73H,A;小数部分分离POP BPOP ARET;//////////////////////DISPLAY:;温度显示70H---76H XXX.XXXX;采用默认的12位,精度0.0625,-55~~+125 SETB RS0MOV R0,#70HMOV R1,#7MOV R2,#0MOV DPTR,#TABLE DIS:MOV A,@R0MOVC A,@A+DPTR MOV P2,R2MOV P0,AINC R2INC R0LCALL DELAY1MS DJNZ R1,DISCLR RS0RET;/////////////////////////DELAY1MS:SETB RS1MOV R0,#100MS:MOV R1,#20DJNZ R1,$DJNZ R0,MSCLR RS1RET;//////////////////// RESERT:;DS18B20初始化;SETB RS0SETB TXNOPCLR TXMOV R0,#240;RST:CLR TXDJNZ R0,$;DELAY480US SETB TXMOV R1,#30;DELAY 60US DJNZ R1,$JNB TX,RE1CLR FLAGSETB TXRETRE1:SETB FLAGMOV R2,#200DJNZ R2,$ ;DELAY 400us SETB TXRET;///////////WRITE:;DS18B20写字节;SETB RS0CLR CMOV R0,#8WW:MOV R1,#6MOV R2,#23RRC ACLR TXDJNZ R1,$;DELAY 12USMOV TX,CDJNZ R2,$;DELAY 46USSETB TXNOPDJNZ R0,WWSETB TX;CLR RS0RET;///////////READ:;DS18B20读字节;SETB RS0CLR CMOV R0,#8;八位RE:SETB TXMOV R1,#10;延时20usMOV R2,#15 ;延时30usCLR TXNOPSETB TX;此句最重要,读取数据的时候一定要释放总线,否则读不出暂存器数据DJNZ R1,$MOV C,TXDJNZ R2,$RRC ADJNZ R0,RESETB TX;CLR RS0RET;//////////////TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0-9 需要加点应用ADD 80H即可DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH;0.-9.DB 40H ;-END。

数字温度计(三)汇编

数字温度计(三)汇编

江苏省盐城技师学院教案首页编号:YJQD-0507-07 版本:B/O 流水号:编制:审核:批准:课题:数字显示温度计设计、安装与调试任务三系统编程与调试教学目的、要求:1、能设计温度控制系统程序2、掌握系统软件的调试方法,能分析并排除故障教学重点、难点:1、温度控制系统程序的编写2、系统调试、排故授课方法:任务驱动型教学、现场教学、启发式教学教学参考及教具(含电教设备):多媒体设备、实训指导书、单片机实训装置授课执行情况及分析:板书设计或授课提纲:课题:数字显示温度计设计、安装与调试任务三系统编程与调试课前准备:1、场地:单片机应用实训室、2、设备:预装Protel 99 SE、伟福、Proteus等软件的网络教室组织教学:检查学生人数、标志牌佩戴、工作服、绝缘鞋及工具准备情况。

知识回顾(复习提问):简述制作印制电路板的流程。

任务引入:1、温度传感器能进行温度检测,数码管实时显示温度值2、温度达到上限值时,报警器报警,LED亮任务分析:数字温度计的硬件电路只是起到支持作用,作为自动化控制的大部分功能,只能采取软件程序来实现,而且软件程序的优点是显而易见的。

它既经济又灵活方便,而且易于模块化和标准化。

同时,软件程序所占用的空间和时间相对来说比硬件电路的开销要小得多。

而且与硬件不同,软件有不致磨损、复制容易、易于更新或改造等特点,但由于它所要处理的问题往往远较硬件复杂,因而软件的设计、开发、调试及维护往往要花费巨大的经历及时间。

但相比之下,这些代价所取得的功能远优于仅依靠硬件电路所实现的功能。

相关知识:(1)单片机汇编语言编程基础89C51内部提供两个十六位的定时器/计数器T0和T1,T0和T1分别由两个独立的专用寄存器组成,即T0 由TH0和TL0组成,T1 由TH1和TL1组成。

用于存放定时/计数器的初值。

它们既可以用作硬件定时,也可以对外部脉冲计数。

a、计数功能计数功能是指对外部脉冲进行计数。

DS18B20数字温度计的主程序

DS18B20数字温度计的主程序

主程序ORG 0000HLJMP STARTSTART: MOV DISBUF4,#00H ;开始,初始化MOV DISBUF5, #00HMAIN: ;主程序LCAAL KEY ;调按键预置数子程序CLR RS1CLR RS0LCALL RESET ;调复位子程序MOV A,#0CCH ;跳过ROM匹配------0CCLCALL WRITE ;调DS18B20子程序MOV A,#44H ;发出温度转换命令LCALL WRITE ;调DS18B20子程序LCALL RESET ;调复位子程序MOV A,#0CCH ;跳过ROM匹配LCALL WRITE ;调DS18B20子程序MOV A,#0BEH ;发出读取温度值命令LCALL WRITE ;调DS18B20子程序LCALL READ ;调DS18B20子程序MOV A, 3DHMOV 29H,ALCALL READMOV A, 3DHMOV 28H,AMOV R0, #34HMOV A, 28HRLC AMOV 47H,CJNB 47H, BTOD1 ;28H中的最高位是不是为1(温度<0);小于0的温度值不处置,大于0顺序执行BTOD1: MOV A, 28HRRC AMOV 40H,CRRC AMOV 41H,CRRC AMOV 42H,CRRC AMOV 43H,CMOV A, 29HMOV 27H, AMOV C,40H ;将28H中的最低位移入C,40H41H42H43H ;为28H中的位地址RRC A ;将28H中的低4位移到A的高4位MOV C, 41HRRC AMOV C, 42HRRC AMOV C, 43HRRC AMOV 29H,A ;将28H中的低4位放入29H中MOV A, 29H ;将29H中的十六进制数转换成10进制MOV B, #100DIV ABMOV @R0, A ;百位存于34HMOV @R0, #11H ;百位不显示DEC R0MOV A, #10XCH A, BDIV ABMOV @R0, A ;十位存于33HDEC R0MOV @R0, B ;个位存于32HDEC R0ANL 27H, #0FH ;小数点后一名进制转换MOV A, 27HMOV B, #06HMUL ABMOV B, #10DIV ABMOV @R0, A ;小数点后一名存于31HMOV DISBUF0,33H ;十位MOV DISBUF1,32H ;个位MOV DISBUF2,31H ;小数位MOV DISBUF3, #0H ;置0MOV DISBUF6, #0HMOV DISBUF7, #0HLCALL CMP ;调比较报警子程序LCALL DISPLAY ;调显示子程序LJMP MAIN ;转到MAINDS18B20复位子程序RESET: NOPL0: CLR ;拉低数据线MOV R2,#200 ;发出600us的复位脉冲L1: NOPDJNZ R2, L1SETB ;主机释放数据线MOV R2,#30 ;DS18B20等待60usL4: DJNZ R2, L4CLR CORL C, ;DS18B20数据变低(存在脉冲)吗?JC L3 ;DS18B20未预备好,从头初始化MOV R6, #80L5: ORL C,JC L3 ;DS18B20数据变高,初始化成功DJNZ R6,L5 ;数据线低电平可持续3us*80=240us SJMP L0 ;初始化失败,从头初始化L3: MOV R2, #250L2: DJNZ R2,L2 ;DS18B20应答500usRET读DS18B20子程序READ: MOV R6,#8 ;循环8次,读一个字节RE1: CLRMOV R4, #6NOPNOPSETBRE2: DJNZ R4,RE2 ;等待8USMOV C, ;读DS18B20的数据RRC A ;读取的数据移入AMOV R5, #30DJNZ R6,RE1 ;读完一个字节的数据MOV 3DH,A ;数据存入3DH中SETB ;把数据线拉高RET写DS18B20子程序;写DS18B20的子程序, 从DS18B20中写出一个字节的数据WRITE: MOV R3,#8 ;循环8次,写一个字节WR1: SETB ;拉高数据线MOV R4, #8RRC A ;写入位从A中移到CYCLRWR2: DJNZ R4,WR2 ;等待16USMOV ,C ;命令字按位依次送给DS18B20MOV R4, #20WR3: DJNZ R4,WR3 ;保证写进程持续40USDJNZ R3,WR1 ;未写完一个字节转WR1继续SETB ;写完一个字节,数据线置高RET比较报警子程序CMP: MOV A,DISBUF0 ;实际测量温度值放在DISBUF8中SWAP AMOV DISBUF8, AMOV A, DISBUF1ORL A, DISBUF8MOV DISBUF8, AMOV A,DISBUF4 ;预置温度值放在DISBUF9中SWAP AMOV DISBUF9, AMOV A, DISBUF5ORL A, DISBUF9MOV DISBUF9, ACLR CMOV A, DISBUF8SUBB A, DISBUF9JNC KK ;没有借位,即实际温度值大于;预置温度值转KKCLR ;有借位,即实际温度值小于预置温度值;置0,不发报警信号RETKK: SETB ;置1,即发出报警标志发光二极管亮RET按键子程序KEY: JNB , YZBWJNB , YZSWLJMP KEYRET YZBW: LCALL DELAY1JB , KEYRETJNB , $INC DISBUF5MOV A, DISBUF4CJNE A, #10,KEYRETMOV DISBUF4, #0LJMP KEYRETYZSW: LCALL DELAY1JB , KEYRETJNB , $INC DISBUF5MOV A, DISBUF5CJNE A, #10,KEYRETMOV DISBUF5, #0 KEYRET: RET显示子程序DISPLAY: MOV A, DISBUF0MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00000001BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF1MOV DPTR, #SEGMOVC A, @A+DPTRORL A, #80HMOV P1, AMOV P2, #00000010BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF2MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00000100BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF3MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00001000BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF4MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00010000BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF5MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00100000BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF6MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00000000BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF7MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00000000BLCALL DELAY1MOV P2, #00000000BRET; (00) (01) (02) (03) (04)SEG: DB 03FH, 06H, 05BH, 04FH, 066H ; (05) (06) (07) (08) (09)DB 06DH, 07DH, 007H, 07FH, 06FH ;延时子程序DELAY1: MOV R1, #0A0HDEL11: NOPDJNZ R1, DEL11RETEND;工作内存概念:DISBUF0 EQU 10H DISBUF1 EQU 11H DISBUF2 EQU DISBUF1+1 DISBUF3 EQU DISBUF2+1 DISBUF4 EQU DISBUF3+1 DISBUF5 EQU DISBUF4+1 DISBUF6 EQU DISBUF5+1 DISBUF7 EQU DISBUF6+1 DISBUF8 EQU DISBUF7+1 DISBUF9 EQU DISBUF8+1。

小明汇编语言版数字温度控制源程序

小明汇编语言版数字温度控制源程序

数字温度控制源程序TEMP_ZH EQU 24H ;实测温度存放单元TEMPL EQU 25HTEMPH EQU 26HTEMP_TH EQU 27H ;高温报警值存放单元TEMP_TL EQU 28H ;低温报警值存放单元TEMPHC EQU 29H ;正负温度值标记TEMPLC EQU 2AHTAMPFC 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 2FH ;LCD字符显示位置LCD_RS EQU P2.0 ;LCD寄存器选择信号LCD_RW EQU P2.1 ;LCD读写信号LCD_EN EQU P2.3 ;LCD允许信号FLAG1 EQU 20H.1 ;DS18B20是否存在标志KEY_UD EQU 20H.1 ;设定按键的增减标志DQ EQU P3.3 ;DS18B20数据信号ORG 0000HLJMP MAINORG 0030HMAIN: MOV SP,#60H ;堆栈指针MOV A,#00HMOV R0,#20H ;将20H—2FH单元清零MOV R1,#10HCLEAR: MOV @R0,AINC R0DJNZ R1,CLEARLCALL SET_LCDLCALL RE_18B20START: LCALL RSTJNB FLAG1,START1 ;DS18B20不存在LCALL MENU_OK ;DS18B20存在MOV TEMP_TH,#055H ;设置TH初值为85°CMOV, TEMP_TL ,#019H ;设置TL初值为25°CLCALL RE_18B20A ;调用暂存器操作子程序LCALL WRITE_E2 ;写入DS18B20LCALL TEMP_BJ ;显示温度标记JMP START2START1: LCALL MENU_ERROR ;调用显示出错子程序LCALL TEMP_BJ ;显示温度标记SJMP $START2: LCALL RST ;调用DS18B20复位子程序JNB FLAG1 START1 ; DS18B20不存在MOV A,#0CCH ;跳过ROM匹配命令LCALL WRITEMOV A,#44H ;温度转换命令LCALL WRITELCALL RSTMOV A,#0CCH ;跳过ROM匹配命令LCALL WRITEMOV A,#0BEH ;读温度命令LCALL WRITELCALL READ ;调用DS18B20数据读取操作子程序LCALL CONVTEMP ;调用温度数据BCD码处理子程序LCALL DISPBCD ;调用温度处理显示子程序LCALL CONV ;调用LCD显示处理子程序LCALL TEMP_COMP ;调用实测温度值与温度值比较子程序LCALL PROC_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 BE_18B20 ;将设定的TH、TL值写入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,#10LCALL DELAYJMP ASZ01ASZ02: JB K3,ASZ03 ;TL值增加LCALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#09,ASZ021MOV TEMP_TL,#00HASZ021: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP ASZ02ASZ03: JB K4,AS0 ;确定调整LCALL BEEP_BLJNB K4,$RETASJ01: JB K2,ASJ02 ;TH值调整(减少)LCALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ01JMP 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_ALARMMOV R5,#10LCALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRST_A1: DB “SET ALERT CODE” ,0;**********实测温度值与设定温度的报警值比较子程序*********** TEMP_COMP:MOV A,TEMP_THSUBB A,TEMP_ZH;减数>被减数,则JC CHULI1 ;借位标志C=1,转MOV A,TEMPFCCJNE A,#0BH,COMPSJMP CHULI2COMP: MOV A,TEMP_ZHSUBB A,TEMP_TL ;减数>被减数,则JC CHULI2 ;借位标志C=1,转MOV DPTR,BJ5LCALL TEMP_BJ3CLR DELAY ;点亮指示灯RETCHULI1: MOV DPTR,#BJ3LCALL TEMP_BJ3SETB RELAY ;熄灭指示灯LCALL BEEP_BL ;蜂鸣器响RETCHULI2: MOV DPTR,#BJ4LCALL TEMP_BJ3SETB RELAY ;熄灭指示灯LCALL BEEP_BL ;蜂鸣器响RETTEMP_BJ3:MOV A,#0CEHLCALL WCOMMOV R1 ,#0MOV R0 ,#2BBJJ3: MOV A,R1MOVC A,@+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3: DB “>H”BJ4: DB “<L”BJ5: BD “ !”;**********显示温度标记子程序子程序*********** 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,#2LCALL 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 ;指针指到显示消息MOV A,# 2 ;显示在第一行LCALL LCD_PRINTRETM_OK1: DB “DS18B20 OK ”,0M_OK2: 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,TSR3 ;等待DS18B20回应DJNZ R0,TSR2JMP TSR4 ;延时TSR3: SETB FLAG1 ;置1标志位,表示DS18B20存在JMP TSR5TSR4: CLR FLAG1 ;清0标志位,表示DS10B20不存在JMP TSR7TSR5: 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 ;把报警器里温度报警值复制到EEROMLCALL 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: M OV A ,R3MOVC A ,@A+DPTRLCALL WDATA ;写入数据INC R3DJNZ R2,S_DA TARETD_TADA: DB 0CH,12H,12H,0CH,00H,00H,00H,00H;**********DS18B20数据写入操作子程序***********WRITE: MOV R2,#8 ;一共8位数据CLR CWR1: CLR DQ ;开始写入DS18B20总线要处于复位低状态MOV R3,#07HDJNZ R3,$ ;总线复位保持16us以上RRC A ;把一个字节DATA分成8个BIT环移给CMOV DQ,C ;写入下一位MOV R3,#3CHDJNZ R3,$ ;等待200usSETB DQ ;重新释放总线NOPDJNZ R2,WR1 ;写入下一位SETB DQRET;**********DS18B20数据读取操作子程序***********READ: MOV R4 #4 ;将温度低位高位TH、TL从DS18B20读出MOV R1,#TEMPL ;存入25H,26H,27H,28H单元RE00: MOV R2,#8RE01:CLR CYSETB DQNOPNOPCLR DQ ;读前总线保持为低NOPNOPNOPSETB DQ ;开始读总线释放MOV R3,#09 ;延时18usDJNZ R3,$MOV C,DQ ;从DS18B20总线读得一位MOV R3,#3CHDJNZ R3,$ ;等待100usRRC A ;把读得的位值环移给ADJNZ R2,RE01 ;读取下一位MOV @R1,AINC R1DJNZ R4,RE00RET;**********温度值BCD码处理子程序*********** CONVTEMP:MOV A,TEMPH ;判断温度是否为0下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 ;乘以0.0625MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC ,A ;TEMPLC LOW=小数部BCDMOV A,TEMPL ;整数部分ANL A ,#0F0H ;取出高四位ANL A,#0FHSWAP AMOV TEMPL,AMOV A,TEMPH ;取出低四位SWAP AORL A,TEMPL ;重新组合MOV TEMP_ZH ,ALCALL HEX2BCD1MOV TEMPL ,AANL A ,#0F0HSWAP AORL A,TEMPHC ;TEMPHC LOW=十位数部BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI=个位数数部BCDORL A,TEMPLCMOV TEMPLC,AMOV A,R4JZ TEM PC12ANL A,#0FHSWAP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI=百位数部BCDANL A,#0FHORL A,R4MOV TEMPHC,ATEMP12:RET;**********二-十进制转换子程序***********HEX2BCD1:MOV B ,#064HDIV ABMOV R4,AMOV A,#0AHXCH A,BDIV ABS WAP A,BRETDEMPDOTTAB: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,#3 ;设置显示位置LCALL SHOW_DIG2H ;显示数据MOV A ,#0CEHLCALL TEMP_BJ1MOV A,TEMP_TL ;加载TL数据MOV LCD_X,#12 ;设置显示位置LCALL SHOW_DIG2L ;显示数据RETM_ALAX1: DB “LOOK ALERT CODE”,0M_ALAX2: DB “TH: TL: ”,0TEMP_BJ1:LCALL WCOMMOV DPTR ,#BJ2 ;指针指到显示信息区MOV R1,#0MOV R0,#2BBJJ2: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC 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 LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RETSHOW_DIG2L:MOV B,#100DIV ABXCH 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,73H ;加载百位数据MOV LCD_X ,#6 ;设置位置CJNE A,#1,CONV1JMP CONV2CONV1: CJNE A,#0BH,CONV11MOV A,#“-”;“—”号显示JMP CONV111CONV11:MOV A,#“”;“+”不显示CONV111:MOV B,LCD_XLCALL LCDP2JMP CONV3CONV2: LCALL SHOW_DIG2 ;显示数据CONV3: INC LCD_XMOV A,72H ;十位LCALL SHOW_DIG2INC LCD_XMOV A,71H ;个位LCALL SHOW_DIGINC 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_DA TA ;将自定义的字符存入LCD的CGROMRET;**********LCD初始化***********INIT_LCD:MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#0CH ;开显示,显示光标,光标不闪烁LCALL WCOMLCALL DELAY1MOV A,#01H ;清除LCD显示屏LCALL WCOMLCALL DELAY1RET;**********清除LCD第一行字符***********CLR_LINE1:MOV A,#08H ;设置LCD第一行地址LCALL WCOMMOV R0 ,#24 ;设置计数值C1: MOV A,#‘’;载入空格到LCDLCALL WDATA ;输入字符到LCDDJNZ R0 ,C1 ;计数结束RET;********** LCD第一行或第二行显示字符***********LCD_PRINT:CJNE A,#1,LINE2LINE1: MOV A,#08H ;设置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 WCOM ;写入命令FILL: CLR A ;填入字符MOVC A, @A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1:LCALL WDATA ;写入数据INC DPTR ;指针加入JMP FILL ;继续填入字符RET;**********清除一行LCD字符***********CLR_LINE:MOV R0 ,#24CL1:MOV A,#‘’LCALL WDATADJNZ R0 ,CL1RETDE: MOV R7,#250DJNZ R7,$RET;**********LCD间接控制方式命令写入*********** WCOM: MOV P0 ,ACLR LCD_RSCLR LCD_RWSETB LCD_ENLCALL DELAY1CLR LCD_ENRET;**********LCD间接控制方式数据写入*********** WDATA: MOV P0,ASETB LCD_RSCLR LCD_RWSETB LCD_ENLCALL DECLR LCD_ENLCALL DERET;**********在LCD第一行显示字符***********LCDP1: PUSH ACCMOV A,BADD A,#80HLCALL WCOMPOP ACCLCALL WDATARET;**********声光报警子程序***********BEEP_BL:MOV R6,#100BL2:LCALL DEX1CPL BEEPCPL RELAYDJNZ R6,BL2MOV R5,#10LCALL,DELAYRETREX1: MOV R7,#180DE2:NOPDJNZ R7,DE2RET;**********延时子程序*********** DELAY: MOV R6,#50DL1:MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R7,DELAYRETDELAY1: MOV R6,#25 ;延时5ms DL2:MOV R7,#100DJNZ R7,$DJNZ R6,DL2RETEND。

数字温度汇编程序

数字温度汇编程序

数字温度汇编程序数字温度汇编程序是一种用于将温度值从摄氏度转换为华氏度或其他温度单位的程序。

这个程序可以通过输入一个摄氏度的数值,然后计算并输出对应的华氏度值。

为了编写数字温度汇编程序,我们可以按照以下步骤进行:1. 程序开始:- 在程序开始处,我们需要初始化相关的变量和寄存器,以确保程序正常运行。

- 可以使用汇编语言中的数据段和堆栈段来声明和分配内存空间。

2. 输入温度值:- 程序需要提示用户输入一个摄氏度的数值。

- 可以使用汇编语言中的输入函数或系统调用来获取用户的输入。

3. 温度转换计算:- 接下来,程序需要将输入的摄氏度值转换为华氏度或其他温度单位。

- 可以使用以下公式进行摄氏度到华氏度的转换:华氏度 = 摄氏度 * 9 / 5 + 32。

- 在汇编语言中,可以使用乘法、除法和加法指令来执行这个计算。

4. 输出结果:- 计算完成后,程序需要将转换后的温度值输出给用户。

- 可以使用汇编语言中的输出函数或系统调用来显示结果。

5. 程序结束:- 在程序结束时,需要清理和释放之前分配的内存空间,并恢复寄存器的初始状态。

- 可以使用汇编语言中的退出函数或系统调用来结束程序的执行。

编写数字温度汇编程序的关键是熟悉汇编语言的指令和寄存器的使用。

在开始编写程序之前,建议先了解所使用的汇编语言的基本语法和指令集。

以下是一个简单的示例程序,用于演示如何实现数字温度汇编程序:```section .datamessage db '请输入摄氏度值:', 0result db '华氏度值为:', 0section .bsscelsius resb 4fahrenheit resb 4section .textglobal _start_start:; 显示提示信息mov eax, 4mov ebx, 1mov ecx, messageint 0x80; 获取用户输入mov eax, 3mov ebx, 0mov ecx, celsiusmov edx, 4int 0x80; 将输入的摄氏度值转换为华氏度 mov eax, dword [celsius]imul eax, 9idiv dword 5add eax, 32mov dword [fahrenheit], eax; 显示转换后的结果mov eax, 4mov ebx, 1mov ecx, resultmov edx, 12int 0x80mov eax, 4mov ecx, fahrenheitmov edx, 4int 0x80; 程序结束mov eax, 1xor ebx, ebxint 0x80```以上示例程序使用Linux系统的汇编语言(x86架构)。

数字温度计—单片机课设(真实的汇编程序和proteus仿真)

数字温度计—单片机课设(真实的汇编程序和proteus仿真)

微机原理课程设计报告温度计姓名:WW学号:班级:电气1005学院:电气工程学院合作者:WY上课教师:杨少兵指导老师:***时间:2013年3月20日微机原理课程设计成绩评定表指导教师签字:2013年 3 月20 日微机原理课程设计任务书学生姓名:指导教师:王健强一、课程设计题目:数字温度计选用温度传感器AD590实现温度采集、摄氏温度显示,温度精度达到0.1度,测量范围零下10度到零上100度。

二、课程设计要求1. 根据具体设计课题的技术指标和给定条件,独立进行方案论证和电路设计,要求概念清楚、方案合理、方法正确、步骤完整;2. 查阅有关参考资料和手册,并能正确选择有关元器件和参数,对设计方案进行仿真;3. 完成预习报告,报告中要有设计方案,设计电路图,还要有仿真结果;4. 进实验室进行编程和电路调试,边调试边修正方案;5. 撰写课程设计报告——最终的电路图、调试过程中遇到的问题和解决问题的方法。

三、进度安排1.时间安排序号内容学时安排(天)1 方案论证和系统设计 12 完成电路仿真,写预习报告 13 电路调试 24 写设计总结报告与答辩 1合计 5设计调试地点:电气楼4062.执行要求课程设计共多个选题,每组不得超过2人,要求学生在教师的指导下,独力完成所设计的详细电路(包括计算和器件选型)。

严禁抄袭,严禁两篇设计报告雷同。

摘要随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术。

本文主要介绍了一个基于STC89C52单片机的测温系统,详细描述了利用温度传感器AD590开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示。

它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。

数字温度汇编程序

数字温度汇编程序

数字温度汇编程序数字温度汇编程序是一种用于将温度数据转换为数字形式的计算机程序。

它可以将从传感器或其他温度测量设备获取的模拟信号转换为数字信号,以便计算机可以对其进行处理和分析。

本文将详细介绍数字温度汇编程序的原理、功能和实现方法。

一、原理数字温度汇编程序的核心原理是将模拟温度信号转换为数字形式。

这个过程通常涉及到模数转换(ADC)技术。

传感器测量到的温度信号是模拟信号,需要经过ADC转换为数字信号,才能被计算机处理。

ADC将连续的模拟信号转换为离散的数字信号,通过对模拟信号进行采样和量化来实现。

二、功能1. 温度测量:数字温度汇编程序可以准确测量温度,并将其转换为数字形式。

通过传感器获取温度信号,程序可以将其转换为计算机可以理解和处理的数字信号。

2. 数据处理:数字温度汇编程序可以对测量到的温度数据进行处理和分析。

它可以实现温度数据的存储、计算、统计和显示等功能。

通过对温度数据的处理,可以得出温度的变化趋势、平均值、最大值、最小值等信息。

3. 报警功能:数字温度汇编程序可以设置温度报警功能。

当温度超过或低于设定的阈值时,程序可以触发报警,通知用户或其他系统进行相应的处理。

4. 数据通信:数字温度汇编程序可以通过串口、网络或其他通信方式将温度数据传输给其他设备或系统。

这样,其他设备或系统可以实时监测和接收温度数据,进行进一步的处理和分析。

三、实现方法1. 硬件准备:实现数字温度汇编程序需要一些基本的硬件设备,包括温度传感器、模数转换器、微控制器或单片机等。

温度传感器用于测量温度,模数转换器用于将模拟信号转换为数字信号,微控制器或单片机用于控制和处理温度数据。

2. 程序编写:使用汇编语言编写数字温度汇编程序。

程序需要包括温度测量、数据处理、报警和数据通信等功能的实现。

编写程序时需要考虑温度传感器的特性和模数转换器的工作原理,以确保数据的准确性和稳定性。

3. 硬件连接:将温度传感器和模数转换器连接到微控制器或单片机上。

数字测温仪程序

数字测温仪程序

;数字测温仪程序编制说明;-------杨叶珍;本程序工作过程如下:;1、开机后首先进行初始化,初始化后显示“P”1秒,提示系统进入测试工作状态,显;示完成后,进行温度测试。

;2、温度测试的过程是这样的:;* T0置为计数方式,对T0脚(即P3.5)的脉冲计数,工作方式2,初值为255;* 将T1置为定时方式,工作方式2,初值为0;* 从P3.4口送单稳触发脉冲,使555输出单稳脉冲(正脉冲),该脉冲宽度随热敏;电阻阻值而变化。

;* 开T0、T1中断,启动T0、T1。

此时T1自动对内部机器周期计数,当TL1溢;出时,产生T1中断。

在T1中断处理程序中,将RAM 21H单元加1(即21H单;元存放脉冲宽计数值高位)后返回主程序。

;* 当来自P3.5的单稳脉冲结束(即下降沿到来)时,TL0计数器加1并溢出,产;生T0中断。

在T0中断处理程序中,关T0、T1中断,并将TL1中的的内容读;到RAM 20H单元(20H单元存放脉宽计数值的低位)。

;* 查表求温度值;NTTAB是脉宽计数值与温度的对照表,按低温到高温的次序存放,即第一、第;二单元存放-100C时的脉宽计数值,依此类推,第121和122单元则存放+500C ;时的脉宽计数值。

;将20H、21H中的计数值与NTTAB中的计数值依次进行比较,直至20H、21H ;中的值小于NTTAB中的计数值为止。

而比较的次数就对应温度的整数值,二计;数值之差与对照表相邻两计数值的商即为小数位。

;3、程序中除了对-100C到+500C进行测试外,还有开路(计数值过大)、短路检测(计;数值过小)、负超温检测、正超温检测,并有相应的显示。

;4、将检测值(温度值或其他结果)显示1秒,然后再重复温度检测。

;需要说明的是:本程序虽包括了测温的全过程,但未考虑软硬件的自检,软件滤波等部;分。

;关于99年第51期电路图中元件参数说明;1、C5为0.1μ。

;2、电容C4、热敏电阻RT的参数决定单稳脉冲的宽度,而最终的计数值除了与单稳;脉冲的宽度有关外,还与晶振频率有关,因而在RT的型号确定后要根据系统对精;度和分辨率等的要求选择C4的值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LJMP TSR5
ACALL T12MS
LCALL INIT_1820
TSR4:CLR 20H.1
MOV A,#0CCH
; 清标志位,表示DS1820不存在
; 跳过ROM匹配
LJMP TSR7
LCALL WRITE_1820
TSR5: MOV R0,#06BH
MOV A,#0BEH
MOV R1,#03H
DJNZ R3,$
; TH(报警上限)中写入00H
SETB P2.0
LCALL WRITE_1820
NOP
MOV A,#00H
DJNZ R2,WR1
; TL(报警下限)中写入00H
SETB P2.0
LCALL WRITE_1820
RET
MOV A,#1FH
**********************************
; 发出读温度命令
TSR6:DJNZ R0,TSR6 ; 延时
LCALL WRITE_1820
MOV R0,#6BH
LCALL READ_18200
DJNZ R1,TSR6
MOV 37H,A
TSR7:SETB P2.0
; 将读出的温度数据保存
RET
RET
;******************************** *****************************
LJMP START ; 高位调整 ;******************************** TIAOTH:MOV 50H, TEMPUTER MOV 37H, TEMPH ACALL BIN_BCD ACALL DISP ACALL T12MS ACALL T12MS ACALL T12MS ACALL T12MS MOV 36H, #0AH MOV 37H, #0AH MOV 38H, #0AH ACALL DISP ACALL T12MS ACALL T12MS ACALL T12MS ACALL T12MS JB S2, ADD11 ACALL T12MS JB S2, ADD11 JNB S2, $ INC TEMPH MOV A, TEMPH CJNE A, #100, ADD11 MOV TEMPH, #0 ADD11: JB S3, ADD22 ACALL T12MS JB S3, ADD22 JNB S3, $ DEC TEMPH MOV A, TEMPH CJNE A, #00 , ADD22 MOV TEMPH,#100 ADD22: JB S4, TIAOTH
CLR C
RET
WR1:CLR P2.0
RE_CONFIG1:
NOP
MOV A,#0CCH
NOP
; 发SKIP ROM命令
NOP
LCALL WRITE_1820
NOP
MOV A,#4EH
RRC A
; 发写暂存存储器命令
MOV P2.0,C
LCALL WRITE_1820
MOV R3,#35
MOV A,#00H
; 重新写DS18B20暂存存储器设定值
; 写DS18B20的程序
********************************* ******************************
RE_CONFIG:JB 20H.1,RE_CONFIG1 WRITE_1820:MOV R2,#8
; 若DS18B20存在,转RE_CONFIG1
SIGN EQU 5BH S1 BIT P1.0 S2 BIT P1.1 S3 BIT P1.2
S4 BIT P1.3 ORG 0000H LJMP MAIN ORG 000BH LJMP TOIT ORG 0030H MAIN: MOV SP, #60H MOV TMOD, #01H MOV TH0, #3CH MOV TL0, #0B0H SETB ET0 SETB TR0 SETB EA MOV TEMPH, #30 MOV TEMPL, #9 MOV TEMPUTER, #15
温度值取补码置“—”标志
计算小数位温度BCD值
计算整数位温度BCD值 结束 置“+”标志 N Y
发DS18B20复位命令 发跳过ROM命令
发温度转换开始命令 结束
图3 温度转换流程图
图4 计算温度流程图
显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操 作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图5。
; 选择9位温度分辨率
; 读DS18B20的程序,从DS18B20中读
LCALL WRITE_1820
出两个字节的温度数据
RET
**********************************
;********************************
READ_18200:
; 读出转换后的温度值
MOV R4,#2
*********************************
; 将温度高位和低位DS18B20中读
GET_TEMPER:
RE00:MOV R2,#8
SETB P2.0 ; 定时入口
RE01:CLR C
L1,TSS2
Y 发DS18B20复位命令
发跳过ROM命令 发读取温度命令 读取操作,CRC校验 9字节完? CRC校验正?确?
移入温度暂存器 结束 N N Y 初始化 调用显示子程序 1S到? 初次上电
读出温度值温度计算处理显示数据刷新
发温度转换开始命令 N Y N Y
图1 主程序流程图 图2读温度流程图 开始 温度零下?
MOV S1OK, #1 MOV MS50, #00H RETURN:POP ACC POP PSW RETI ;******************************** ;温度总子程序 ********************************* wendu: ACALL INIT_1820 ACALL RE_CONFIG ACALL GET_TEMPER ACALL TEMPER_COV RET ;******************************** ;DS18B20初始化程序 ********************************* INIT_1820: SETB P2.0 NOP
TAB: DB 11H, 0D7H, 32H, 92H, 0D4H, 98H, 18H, 0D1H, 10H, 90H ,0FFH, 070H, 0FEH
; 延时子程序 T12MS: SETB RS1
JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
INC 37H TEMPER_COV1: MOV A,35H
CJNE A, #1, START MOV A, TEMPUTER
SUBB A, TEMPH JNB ACC.7, ALEM MOV A, TEMPUTER SUBB A, TEMPL JB ACC.7, ALEM SETB P2.1 ACALL WENDU ACALL DISP MOV S1OK, #00H AJMP START ALEM: MOV 36H, #0CH MOV 37H, #0CH MOV 38H, #0CH CLR P2.1 ACALL DISP ACALL T1S LCALL WENDU LCALL DISP MOV S1OK, #00H SJMP START
ANL A,#07H SWAP A
ADD A,37H MOV 37H,A ; 保存变换后的温度数 据 LCALL BIN_BCD RET ********************************* ; 将16进制的温度数据转换成压缩 BCD码 ; 38H中放百位,37十位,36个位 ;******************************** BIN_BCD:MOV 39H,37H
MOV 37H, TEMPL ACALL BIN_BCD ACALL DISP ACALL T12MS ACALL T12MS ACALL T12MS ACALL T12MS MOV 36H, #0AH MOV 37H, #0AH MOV 38H, #0AH ACALL DISP ACALL T12MS ACALL T12MS ACALL T12MS ACALL T12MS JB S2, ADD1 ACALL T12MS JB S2, ADD1 JNB S2, $ INC TEMPL MOV A, TEMPL CJNE A, #100, ADD1 MOV TEMPL, #0 JB S4, TIAOTH JNB S4, $ MOV TEMPUTER, 50H LJMP START ; 一秒定时中段 ******************************** TOIT: PUSH PSW PUSH ACC MOV TH0, #3CH MOV TL0, #0B0H INC MS50 MOV A, MS50 CJNE A, #14H, RETURN
MOV 36H,B RET
DISP: SETB RS0 MOV R0, #36H MOV R7, #3
LOOPP:MOV A, @R0 MOV DPTR, #TAB MOVC A, @A+DPTR MOV SBUF, A JNB TI, $ CLR TI INC R0 DJNZ R7, LOOPP CLR RS0 RET
温度数据移入显示寄存器 十位数0? 百位数0? 十位数显示符号百位数不显示 百位数显示数据(不显示符号) 结束 N N Y Y
图5 显示数据刷新流程图
数字温度计程序清单:
S1OK EQU 5FH TEMPUTER EQU 39H
TEMPH EQU 5EH TEMPL EQU 5DH MS50 EQU 5CH
相关文档
最新文档