基本要求:利用單片機AT89C51基于數字溫度傳感器設計數字溫度計,能對模擬信號進行檢測,能將所測量的溫度在LED顯示器上顯示。測量范圍為20℃~ 120℃
創新:具有方便的鍵盤操作功能;溫度超出界限時具有報警功能等。
批注 2020-06-30 205516.png (33.75 KB, 下載次數: 63)
下載附件
2020-6-30 20:55 上傳
仿真
批注 2020-06-30 205951.png (35.05 KB, 下載次數: 55)
下載附件
2020-6-30 21:00 上傳
程序如下:
- TEMP_ZH DATA 24H
- TEMPL DATA 25H
- TEMPH DATA 26H
- TEMP_TH DATA 27H
- TEMP_TL DATA 28H
- TEMPHC DATA 29H
- TEMPLC DATA 2AH
- K1 EQU P1.4
- K2 EQU P1.5
- K3 EQU P1.6
- K4 EQU P1.7
- BEEP EQU P3.6
- RELAY EQU P3.7
- LCD_X EQU 2FH
- LCD_RS EQU P2.0
- LCD_RW EQU P2.1
- LCD_EN EQU P2.2
- flag1 EQU 20H.0
- KEY_UD EQU 20H.1
- date_line EQU P3.3
- ;========================================================================
- ORG 0000H
- JMP MAIN
- MAIN:
- MOV SP,#60H;
- MOV A,#00H;
- MOV R0,#20H;
- MOV R1,#10H;
- CLEAR:
- MOV @R0,A;
- INC R0;
- DJNZ R1,CLEAR;
- CALL SET_LCD;
- CALL RE_18B20;
-
-
- start:
- CALL RESET;
- JNB flag1,START1;
- CALL MENU_OK;
- CALL READ_E2;
- CALL TEMP_BJ;
- JMP START2;
- START1:
- CALL MENU_ERROR;
- CALL TEMP_BJ;
- JMP $;
- START2:
- CALL RESET;
- JNB FLAG1,START1;
- MOV A,#0CCH;
- CALL WRITE;
- MOV A,#44H;
- CALL WRITE;
- CALL RESET;
- MOV A,#0CCH;
- CALL WRITE;
- MOV A,#0BEH;
- CALL WRITE;
- CALL READ;
- call CONVTEMP;
- Call DISPBCD;
- CALL CONV;
- CALL TEMP_COMP;
- CALL PROC_KEY;
-
- SJMP START2;
-
- PROC_KEY:
- JB K1,PROC_K1;
- CALL BEEP_BL;
- JNB K1,$;
- MOV DPTR,#M_ALAX1;
- MOV A,#1;
- CALL LCD_PRINT;
- CALL LOOK_ALARM;
- JB K3,$;
- CALL BEEP_BL;
- JMP PROC_K2;
- PROC_K1:
- JB K2,PROC_END;
- CALL BEEP_BL;
- JNB K2,$;
- MOV DPTR,#RESET_A1;
- MOV A,#1;
- CALL LCD_PRINT;
- CALL SET_ALARM;
- CALL RE_18B20;
- CALL WRITE_E2;
- PROC_K2:
- CALL MENU_OK;
- CALL TEMP_BJ;
- PROC_END:
- RET
- ;============================================================
- SET_ALARM:
- CALL RESET_ALARM;
- CALL LOOK_ALARM;
- AS0:
- JB K1,AS00;
- CALL BEEP_BL;
- JNB K1,$;
- CPL 20H.1;
- AS00:
- JB 20H.1,ASZ01;
- JMP ASJ01;
- ASZ01:
- JB K2,ASZ02;
- CALL BEEP_BL;
- INC TEMP_TH;
- MOV A,TEMP_TH;
- CJNE A,#120,ASZ011;
- MOV TEMP_TH,#0;
- ASZ011:
- CALL LOOK_ALARM;
- MOV R5,#10;
- CALL DELAY;
- JMP ASZ01;
- ASZ02:
- JB K3,ASZ03;
- CALL BEEP_BL;
- INC TEMP_TL;
- MOV A,TEMP_TL;
- CJNE A,#99,ASZ021;
- MOV TEMP_TL,#00H;
- ASZ021:
- CALL LOOK_ALARM;
- MOV R5,#10;
- CALL DELAY;
- JMP ASZ02;
- ASZ03:
- JB K4,AS0;
- CALL BEEP_BL;
- JNB K4,$;
- RET
- ASJ01:
- JB K2,ASJ02;
- CALL BEEP_BL;
- DEC TEMP_TH;
- MOV A,TEMP_TH;
- CJNE A,#0FFH,ASJ011;
- JMP ASJ022;
- ASJ011:
- CALL LOOK_ALARM;
- MOV R5,#10;
- CALL DELAY;
- JMP AS0;
- ASJ02:
- JB K3,ASJ03;
- CALL BEEP_BL;
- DEC TEMP_TL;
- MOV A,TEMP_TL;
- CJNE A,#0FFH,ASJ021;
- JMP ASJ022;
- ASJ021:
- CALL LOOK_ALARM;
- MOV R5,#10;
- CALL DELAY;
- JMP AS0;
- ASJ022:
- CPL 20H.1;
- JMP ASZ01;
- ASJ03:
- JMP ASZ03;
- RET
- RESET_ALARM:
- MOV DPTR,#RESET_A1;
- MOV A,#1;
- CALL LCD_PRINT;
- RET
- RESET_A1:
- DB "RESET ALERT CODE";
- ;==================================================================
- TEMP_COMP:
- MOV A,TEMP_TH;
- SUBB A,TEMP_ZH;
- JC CHULI1;
- MOV A,TEMP_ZH;
- SUBB A,TEMP_TL;
- JC CHULI2;
- MOV DPTR,#BJ5;
- CALL TEMP_BJ3;
- CLR RELAY;
- RET
- CHULI1:
- MOV DPTR,#BJ3;
- CALL TEMP_BJ3;
- SETB RELAY;
- CALL BEEP_BL;
- RET
- CHULI2:
- MOV DPTR,#BJ4;
- CALL TEMP_BJ3;
- CALL BEEP_BL;
- RET
- ;-------------------------------
- TEMP_BJ3:
- MOV A,#0CEH;
- CALL WCOM;
- MOV R1,#0;
- MOV R0,#2;
- BBJJ3:
- MOV A,R1;
- MOVC A,@A+DPTR;
- CALL WDATA;
- INC R1;
- DJNZ R0,BBJJ3;
- RET
- BJ3:
- DB ">H";
- BJ4:
- DB "<L";
- BJ5:
- DB "!";
- ;====================================================================
- TEMP_BJ:
- MOV A,#0CBH;
- CALL WCOM;
- MOV DPTR,#BJ1;
- MOV R1,#0;
- MOV R0,#2;
- BBJJ1:
- MOV A,R1;
- MOVC A,@A+DPTR;
- CALL WDATA;
- INC R1;
- DJNZ R0,BBJJ1;
- RET
- BJ1:
- DB 00H,"C";
- ;==================================
- MENU_OK:
- MOV DPTR,#M_OK1;
- MOV A,#1;
- CALL LCD_PRINT;
- MOV DPTR,#M_OK2;
- MOV A,#2;
- CALL LCD_PRINT;
- RET
- M_OK1:
- DB "DS18B20 OK",0
- M_OK2:
- DB "TEMP:",0
- ;------------------------------------
- MENU_ERROR:
- MOV DPTR,#M_ERROR1;
- MOV A,#1;
- CALL LCD_PRINT;
- MOV DPTR,#M_ERROR2;
- MOV A,#2;
- CALL LCD_PRINT;
- RET
- M_ERROR1:
- DB "DS18B20 ERROR",0;
- M_ERROR2:
- DB "TEMP:----",0;
- ;====================================
- reset:
- setb date_line;
- nop
- clr date_line;
- mov r0,#6bh;
- mov r1,#04h;
- tsr1:
- djnz r0,$;
- mov r0,#6bh;
- djnz r1,tsr1;
- setb date_line;
- nop
- nop
- nop
- mov r0,#32h;
- tsr2:
- jnb date_line,tsr3;
- djnz r0,tsr2;
- jmp tsr4;
- tsr3:
- setb flag1;
- jmp tsr5;
- tsr4:
- clr flag1;
- jmp tsr7;
- tsr5:
- mov r0,#06bh;
- tsr6:
- djnz r0,$;
- tsr7:
- setb date_line;
- ret
- ;====================================
- RE_18B20:
- JB FLAG1,RE_18B20A;
- RET
- RE_18B20A:
- CALL RESET;
- MOV A,#0CCH;
- LCALL WRITE;
- MOV A,#4EH;
- LCALL WRITE;
- MOV A,TEMP_TH;
- LCALL WRITE;
- MOV A,TEMP_TL;
- LCALL WRITE;
- MOV A,#7FH;
- LCALL WRITE;
- RET
- ;------------------------------------
- WRITE_E2:
- CALL RESET;
- MOV A,#0CCH;
- LCALL WRITE;
- MOV A,#48H;
- CALL WRITE;
- RET
- ;------------------------------------
- READ_E2:
- CALL RESET;
- MOV A, #0CCH;
- LCALL WRITE;
- MOV A, #0B8H;
- CALL WRITE;
- RET
- ;------------------------------------------------------------------------
- STORE_DATA:
- MOV A,#40H;
- CALL WCOM;
- MOV R2,#08H;
- MOV DPTR,#D_DATA;
- MOV R3,#00H;
- S_DATA:
- MOV A,R3;
- MOVC A,@A+DPTR;
- CALL WDATA;
- INC R3;
- DJNZ R2,S_DATA;
- RET
- D_DATA:
- DB 0CH,12H,12H,0CH,00H,00H,00H,00H;10h,06h,09h,08h,08h,09h,06h,00h;
- ;======================================================================
- write:
- mov r2,#8;
- CLR C;
- wr1:
- clr date_line;
- mov r3,#07;
- djnz r3,$;
- rrc a;
- mov date_line,c;
- mov r3,#3CH;
- djnz r3,$;
- setb date_line;
- nop
- djnz r2,wr1;
- setb date_line;
- ret
- ;-------------------------------------
-
- read:
- mov r4,#4;
- mov r1,#TEMPL;
- re00:
- mov r2,#8;
- re01:
- clr cy;
- setb date_line;
- nop
- nop
- clr date_line;
- nop
- nop
- nop
- setb date_line;
- mov r3,#09;
- djnz r3,$;
- mov c,date_line;
- mov r3,#3CH;
- djnz r3,$;
- rrc a;
- djnz r2,re01;
- mov @r1,a;
- inc r1;
- djnz r4,re00;
- ret
- ;**************************************************************************************
- CONVTEMP:
- MOV A,TEMPH;
- ANL A,#80H;
- JZ TEMPC1;
- CLR C;
- MOV A,TEMPL;
- CPL A;
- ADD A,#01H;
- MOV TEMPL,A;
- MOV A,TEMPH;
- CPL A;
- ADDC A,#00H;
- MOV TEMPH,A;
- SJMP TEMPC11;
-
- TEMPC1:
- MOV TEMPHC,#0AH;
- TEMPC11:
- MOV A,TEMPHC;
- SWAP A;
- MOV TEMPHC,A;
- MOV A,TEMPL;
- ANL A,#0FH;
- MOV DPTR,#TEMPDOTTAB;
- MOVC A,@A+DPTR;
- MOV TEMPLC,A;
-
-
- MOV A,TEMPL;
- ANL A,#0F0H;
- SWAP A;
- MOV TEMPL,A;
- MOV A,TEMPH;
- ANL A,#0FH;
- SWAP A;
- ORL A,TEMPL;
- MOV TEMP_ZH,A;
- LCALL HEX2BCD1;
- MOV TEMPL,A;
- ANL A,#0F0H;
- SWAP A;
- ORL A,TEMPHC;
- MOV TEMPHC,A;
- MOV A,TEMPL;
- ANL A,#0FH;
-
- SWAP A;
- ORL A,TEMPLC;
- MOV TEMPLC,A;
- MOV A,R4;
- JZ TEMPC12;
- ANL A,#0FH;
- SWAP A;
- MOV R4,A;
- MOV A,TEMPHC;
- ANL A,#0FH;
- ORL A,R4;
- MOV TEMPHC,A;
- TEMPC12:
- RET
- ;------------------------------------
- HEX2BCD1:
- MOV B,#064H;
- DIV AB;
- MOV R4,A;
- MOV A,#0AH;
- XCH A,B;
- DIV AB;
- SWAP A;
- ORL A,B;
- RET
- ;--------------------------------------------------------------------------
- TEMPDOTTAB:
- 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;
- CALL LCD_PRINT;
- MOV A,#0C6H;
- CALL TEMP_BJ1;
- MOV A,TEMP_TH;
- MOV LCD_X,#3;
- CALL SHOW_DIG2H;
-
-
- MOV A,#0CEH;
- CALL TEMP_BJ1;
- MOV A,TEMP_TL;
- MOV LCD_X,#12;
- CALL SHOW_DIG2L;
- RET
- ;------------------------------------
- M_ALAX1:
- DB "LOOK ALERT CODE",0;
- M_ALAX2:
- DB "TH: TL: ",0;
- ;----------------------------------------------------------
- TEMP_BJ1:
- CALL WCOM;
- MOV DPTR,#BJ2;
- MOV R1,#0;
- MOV R0,#2;
- BBJJ2:
- MOV A,R1;
- MOVC A,@A+DPTR;
- CALL WDATA;
- INC R1;
- DJNZ R0,BBJJ2;
- RET
- BJ2:
- DB 00H,"C"
- ;-------------------------------------
- SHOW_DIG2H:
- MOV B,#100;
- DIV AB;
- ADD A,#30H;
- PUSH B;
- MOV B,LCD_X;
- CALL LCDP2;
- POP B;
- MOV A,#0AH;
- XCH A,B;
- DIV AB;
- ADD A,#30H;
- INC LCD_X;
- PUSH B;
- MOV B,LCD_X;
- CALL LCDP2;
- POP B;
- INC LCD_X;
- MOV A,B;
- MOV B,LCD_X;
- ADD A,#30H;
- CALL LCDP2;
- RET
- SHOW_DIG2L:
- MOV B,#100;
- DIV AB;
- MOV A,#0AH;
- XCH A,B;
- DIV AB;
- ADD A,#30H;
- PUSH B;
- MOV B,LCD_X;
- CALL LCDP2;
- POP B;
- INC LCD_X;
- MOV A,B;
- MOV B,LCD_X;
- ADD A,#30H;
- CALL LCDP2;
- RET
- ;-----------------------------------------------------------------------
- DISPBCD:
- MOV A,TEMPLC;
- ANL A,#0FH;
- MOV 70H,A;
- MOV A,TEMPLC;
- SWAP A;
- ANL A,#0FH;
- MOV 71H,A;
- MOV A,TEMPHC;
- ANL A,#0FH;
- MOV 72H,A;
- MOV A,TEMPHC;
- SWAP A;
- ANL A,#0FH;
- MOV 73H,A;
- MOV A,TEMPHC;
- ANL A,#0F0H;
- CJNE A,#010H,DISPBCD0;
- SJMP DISPBCD2;
- DISPBCD0:
- MOV A,TEMPHC;
- ANL A,#0FH;
- JNZ DISPBCD2;
- MOV A,TEMPHC;
- SWAP A;
- ANL A,#0FH;
- MOV 73H,#0AH;
- MOV 72H,A;
- DISPBCD2:
- RET
- ;========================================================================
- CONV:
- MOV A,#73H;
- MOV LCD_X,#6;
- CJNE A,#1,CONV1;
- JMP CONV2;
- CONV1:
- MOV A,#'*';
- MOV B,LCD_X;
- CALL LCDP2;
- JMP CONV3;
- CONV2:
- CALL SHOW_DIG2;
- CONV3:
- INC LCD_X;
- mov a,73h;
- CALL SHOW_DIG2;
- INC LCD_X;
- mov a,72h;
- CALL SHOW_DIG2;
- inc LCD_X;
- mov a,71h;
- CALL SHOW_DIG2;
- inc LCD_X;
- MOV A,#'.';
- MOV B,LCD_X;
- CALL LCDP2;
- MOV A,70h;
- INC LCD_X;
- CALL SHOW_DIG2;
- RET
- ;-------------------------------------
- SHOW_DIG2:
- ADD A,#30H;
- MOV B,LCD_X;
- CALL LCDP2;
- RET
- ;-------------------------------------
- LCDP2:
- PUSH ACC;
- MOV A,B;
- ADD A,#0C0H;
- CALL WCOM;
- POP ACC;
- CALL WDATA;
- RET
- ;-------------------------------------
- SET_LCD:
- CLR LCD_EN;
- CALL INIT_LCD;
- CALL STORE_DATA;
- RET
- INIT_LCD:
- MOV A,#38H;
- CALL WCOM;
- call delay1;
- MOV A,#38H;
- CALL WCOM;
- call delay1;
-
-
- MOV A,#38H;
- CALL WCOM;
- call delay1;
- MOV A,#0CH;
- CALL WCOM;
- call delay1;
- MOV A,#01H;
- CALL WCOM;
- call delay1;
- RET
- ;====================================
- CLR_LINE1:
- MOV A,#80H;
- CALL WCOM;
- MOV R0,#24;
- C1:
- MOV A,#'*';
- CALL WDATA;
- DJNZ R0,C1;
- RET
- ;====================================
- LCD_PRINT:
- CJNE A,#1,LINE2;
- LINE1:
- MOV A,#80H;
- CALL WCOM;
- CALL CLR_LINE;
- MOV A,#80H;
- CALL WCOM;
- JMP FILL;
- LINE2:
- MOV A,#0C0H;
- CALL WCOM;
- CALL CLR_LINE;
- MOV A,#0C0H;
- CALL WCOM;
- FILL:
- CLR A
- MOVC A,@A+DPTR;
- CJNE A,#0,LC1;
- RET
- LC1:
- CALL WDATA;
- INC DPTR;
- JMP FILL;
- RET
- ;====================================
- CLR_LINE:
- MOV R0,#24;
- CL1:
- MOV A,#'*';
- CALL WDATA;
- DJNZ R0,CL1;
- RET
- DE:
- MOV R7,#250;
- DJNZ R7,$;
- RET
- ;====================================
- WCOM:
- MOV P0,A;
- CLR LCD_RS;
- CLR LCD_RW;
- SETB LCD_EN;
- ACALL DELAY1;
- CLR LCD_EN;
- RET
- ;====================================
- WDATA:
- MOV P0,A;
- SETB LCD_RS;
- CLR LCD_RW;
- SETB LCD_EN;
- CALL DE;
- CLR LCD_EN;
- CALL DE;
- RET
- ;====================================
- ;PRINT A CHAR ON LINE 1
- ;A=ASC DATA,B=LINE X POS
- ;====================================
- LCDP1:
- PUSH ACC;
- MOV A,B;
- ADD A,#80H;
- CALL WCOM;
- POP ACC;
- CALL WDATA;
- RET
- ;====================================
- BEEP_BL:
- MOV R6,#100;
- BL2:
- CALL DEX1;
- CPL BEEP;
- DJNZ R6,BL2;
- MOV R5,#10;
- CALL DELAY;
- RET
- DEX1:
- MOV R7,#180;
- DE2:
- NOP
- DJNZ R7,DE2;
- RET
- DELAY:
- MOV R6,#50;
- DL1:
- MOV R7,#100;
- DJNZ R7,$;
- DJNZ R6,DL1;
- DJNZ R5,DELAY;
- RET
- DELAY1:
- MOV R6,#25;
- DL2:
- MOV R7,#100;
- DJNZ R7,$;
- DJNZ R6,DL2;
- RET
- ;====================================
- END
復制代碼 |