#include #include sbit P3_0=P3^0; sbit P3_1=P3^1; sbit P3_2=P3^2; sbit P3_3= P3^3; sbit P3_4= P3^4; sbit P3_5= P3^5; sbit P3_6= P3^6; sbit P3_7= P3^7; #define LEDPort P1 //LED控制口 #define LEDf P3_0 //LEDf #define LED1 P3_1 //LED1 #define LED2 P3_2 //LED2 #define LED3 P3_3 //LED3 #define LED4 P3_4 //LED4 #define Key_jd P3_5 //上调温度 #define TMPort P3_7 //DS1820 DataPort unsigned char code LEDDis[]={0x5f,0x06,0x3b,0x2f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9的LED笔划,0xFF为空,0xF7为负号 static unsigned char bdata StateREG; //可位寻址的状态寄存器 sbit DS18B20ON = StateREG^0; //DS1820是否存在 sbit SetTF = StateREG^1; //是否是在温度设置状态 static signed char LED_f,LED_1,LED_2,LED_3,LED_4; //LED的显示位 LED_One为十位,LED_Two为个位 static signed char L_1,L_2,L_3,L_4,L_5; //LED的显示位 LED_One为十位,LED_Two为个位 static unsigned char Sign; //负号标识 static unsigned char sign_jd; //精度标识 static unsigned char KeyV,TempKeyV; //键值 static unsigned char bdata TLV _at_ 0x0029; //温度变量高低位 static unsigned char bdata THV _at_ 0x0028; static signed char TMV; //转换后的温度值 static signed char TM; //转换后的温度值 static signed int wd; //转换后的温度值 static signed int zd; //转换后的温度值 void Delay_10ms(void); void InitDS1820(void); void ROMDS1820(void); void TMVDS1820(void); void Delay_510(void); void TMRDS1820(void); void ReadDS1820(void); void V2ToV(void); void Delay_110(void); void main(void) { THV = 0; TLV = 0; TMV = 0; TM=0; KeyV = 0; TempKeyV = 0; zd=50; InitDS1820(); //初始化 ROMDS1820(); //跳过ROM TMRDS1820(); //读出温度指令 ReadDS1820(); //读出温度值和上限值 EA = 1; //允许CPU中断 ET0 = 1; //定时器0中断打开 TMOD = 0x1; //设定时器0为模式1,16位模式 TH0=0xB1; TL0=0xDF; //设定时值为20000us(20ms) TR0 = 1; //开始定时 while(1); } //定时器0中断外理中键扫描和显示 void KeyAndDis_Time0(void) interrupt 1 using 2 { TH0=0xb1; TL0=0xDF; //设定时值为20000us(20ms) Key_jd=1; LEDPort = 0x00; zd++; if (zd>50) { if (!Key_jd) KeyV = 1; if (KeyV != 0) //有键按下 { Delay_10ms(); //延时防抖 按下10ms再测 if (!Key_jd) TempKeyV = 1; if (KeyV == TempKeyV) //两次值相等为确定接下了键 { sign_jd=!sign_jd; zd=0; } } } KeyV = 0; TempKeyV = 0; //清空变量准备下次键扫描 if (DS18B20ON) { InitDS1820(); //初始化 ROMDS1820(); //跳过ROM TMVDS1820(); //温度转换指令 Delay_510(); Delay_510(); //延时等待转换完成 InitDS1820(); //初始化 ROMDS1820(); //跳过ROM TMRDS1820(); //读出温度指令 ReadDS1820(); //读出温度值 V2ToV(); if (LED_f==1)//转换显示值 LEDf=0; else LEDf=1; LEDPort = ~LED_1; LED1 = 0; Delay_510(); Delay_510(); LED1 = 1; //显示百位数 LEDPort = ~LED_2; LED2 = 0; Delay_510(); Delay_510(); LED2 = 1; //显示百位数 LEDPort = ~LED_3; LED3 = 0; Delay_510(); Delay_510(); LED3 = 1; //显示百位数 LEDPort = ~LED_4; LED4 = 0; Delay_510(); Delay_510(); LED4 = 1; //显示百位数 } } void V2ToV(void) //数值转换 { TM=TLV<<4; TLV = TLV >> 4; THV = THV << 4; //读出的高低位数值移位 TMV = TLV | THV; //合并高低位放入TM为实际温度值 Sign = 0; Sign = TMV >> 7; if (Sign) { L_1= (~(TMV-1)) / 100; //转换百位值 L_2= ((~(TMV-1)) - L_1 * 100)/10; L_3 = (~(TMV-1)) - L_1 * 100 - L_2 * 10; } else { L_1= (TMV) / 100; //转换百位值 L_2= (TMV - L_1 * 100)/10; L_3 = TMV - L_1 * 100 - L_2 * 10; } if (Sign) { TM=~(TM-1); LED_f=1; } else { LED_f=0; } wd=0; if (TM & 0x80){wd=wd+5000;} if (TM & 0x40){wd=wd+2500;} if (TM & 0x20){wd=wd+1250;} if (TM & 0x10){wd=wd+625;} L_4=wd/1000; L_5=(wd-L_4*1000)/100; if (sign_jd) { LED_1=LEDDis[L_2]; LED_2=LEDDis[L_3]|0x80; LED_3=LEDDis[L_4]; LED_4=LEDDis[L_5]; } else { LED_1=LEDDis[L_1]; LED_2=LEDDis[L_2]; LED_3=LEDDis[L_3]|0x80; LED_4=LEDDis[L_4]; } } void InitDS1820(void) //初始化DS1820 { TMPort=1; //拉高TMPort _nop_(); //保持一个周期 TMPort = 0; //拉低TMPort Delay_510(); //延时 DS1820复位时间要500us的低电平 TMPort = 1; //拉高TMPort _nop_(); //保持 _nop_(); _nop_(); Delay_110(); //延时110us 等待DS1820回应 if (!TMPort) //回应信号为低电平 DS18B20ON = 1; else DS18B20ON = 0; Delay_110(); //延时 Delay_110(); TMPort = 1; //拉高TMPort } void Delay_510(void) //延时510微秒 { #pragma asm MOV R0,#7DH MOV R1,#02H TSR1: DJNZ R0,TSR1 MOV R0,#7DH DJNZ R1,TSR1 #pragma endasm } void Delay_110(void) //延时110微秒 { #pragma asm MOV R0,#19H MOV R1,#02H TSR2: DJNZ R0,TSR2 MOV R0,#19H DJNZ R1,TSR2 #pragma endasm } void Delay_10ms(void) //延时10ms { #pragma asm MOV R0,#19H MOV R1,#0C8H TSR3: DJNZ R0,TSR3 MOV R0,#19H DJNZ R1,TSR3 #pragma endasm } void Delay_4s(void) //延时4s { #pragma asm MOV R2,#28H TSR5: MOV R0,#0FAH MOV R1,#0C8H TSR4: DJNZ R0,TSR4 MOV R0,#0FAH DJNZ R1,TSR4 DJNZ R2,TSR5 #pragma endasm } void ROMDS1820(void) //跳过ROM匹配 { #pragma asm MOV A,#0CCH MOV R2,#8 CLR C WR1: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR1 SETB P3_7 #pragma endasm } void TMVDS1820(void) //温度转换指令 { #pragma asm MOV A,#44H MOV R2,#8 CLR C WR2: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR2 SETB P3_7 #pragma endasm } void TMRDS1820(void) //读出温度指令 { #pragma asm MOV A,#0BEH MOV R2,#8 CLR C WR3: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR3 SETB P3_7 #pragma endasm } void TMWDS1820(void) //写入温度限制指令 { #pragma asm MOV A,#04EH MOV R2,#8 CLR C WR13: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR13 SETB P3_7 #pragma endasm } void TMREDS1820(void) //COPY RAM to E2PRAM { #pragma asm MOV A,#48H MOV R2,#8 CLR C WR33: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR33 SETB P3_7 #pragma endasm } void TMERDS1820(void) //COPY E2PRAM to RAM { #pragma asm MOV A,#0B8H MOV R2,#8 CLR C WR43: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR43 SETB P3_7 #pragma endasm } void WriteDS1820(void) //写入温度限制值 { #pragma asm MOV A,26H //发出4EH写ROM指令后连发两个字节分别为上下限 MOV R2,#8 CLR C WR23: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR23 SETB P3_7 #pragma endasm } void ReadDS1820(void) //读出温度值 { #pragma asm MOV R4,#2 ; 将温度高位和低位,高温限制位从DS18B20中读出 MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H),高温限制位存入27H(TMRomV) RE00: MOV R2,#8 RE01: CLR C SETB P3_7 NOP NOP CLR P3_7 NOP NOP NOP SETB P3_7 MOV R3,#09 RE10: DJNZ R3,RE10 MOV C,P3_7 MOV R3,#23 RE20: DJNZ R3,RE20 RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 #pragma endasm }