這個程序是磁動力明浩的,源程序是共陽輸出的,我現(xiàn)在手上只有大尺寸的共陰管,麻煩哪位高手給改一下,使源程序變成共陰輸出的。先謝謝了!
/*-------------------------------
溫度控制器V1.51 顯示為三個共陽極LED 溫度傳感器用單總線DS18B20 CPU為2051,三個按鍵,分別為UP,DOWN,SET 溫度調(diào)節(jié)上限為125度,下限為-55度 只能用于單只18B20
本軟件僅供學習與參考,引用時請注明版權(quán)
http://www.cdle.net 明浩 2004/9/13 pnzwzw@cdle.net -------------------------------*/
#include <AT89X051.H> #include <intrins.h> #define Key_UP P3_0 //上調(diào)溫度 #define Key_DOWN P3_1 //下調(diào)溫度 #define Key_SET P1_7 //設(shè)定鍵(溫度設(shè)定,長按開電源) #define RelayOutPort P3_5 //繼電器輸出 #define LEDPort P1 //LED控制口 #define LEDOneC P3_2 //LED DS1控制(百位) #define LEDTwoC P3_3 //LED DS2控制(十位) #define LEDThreeC P3_4 //LED DS3控制(個位) #define TMPort P3_7 //DS1820 DataPort
unsigned char code LEDDis[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40}; //0-9的LED筆劃,0xFF為空,0xF7為負號
static unsigned char bdata StateREG; //可位尋址的狀態(tài)寄存器 sbit DS1820ON = StateREG^0; //DS1820是否存在 sbit SetTF = StateREG^1; //是否是在溫度設(shè)置狀態(tài) sbit KeySETDown = StateREG^2; //是否已按過SET鍵標識 sbit PowTF = StateREG^3; //電源電源標識 sbit KeyTF = StateREG^4; //鍵盤是否允許
//sbit KeySETDowning = StateREG^5; //SET是否正在按下 static unsigned char bdata TLV _at_ 0x0029; //溫度變量高低位 static unsigned char bdata THV _at_ 0x0028; static signed char TMV; //轉(zhuǎn)換后的溫度值 static unsigned char KeyV,TempKeyV; //鍵值 static signed char TMRomV _at_ 0x0027; //高溫限制 static signed char TMSetV _at_ 0x0026; //溫度設(shè)定值 static unsigned char KSDNum; //SET鍵連按時的采集次數(shù) static unsigned char IntNum,IntNum2,IntNum3; //中斷發(fā)生次數(shù),IntNum用于SET長按檢測,IntNum2用于設(shè)定狀態(tài)時LED閃爍 static signed char LED_One,LED_Two,LED_Three; //LED的顯示位 LED_One為十位,LED_Two為個位 static unsigned char Sign; //負號標識
void main(void) { void InitDS1820(void); //定義函數(shù) void ROMDS1820(void); void TMVDS1820(void); void TMRDS1820(void); void TMWDS1820(void); void TMREDS1820(void); void TMERDS1820(void); void ReadDS1820(void); void WriteDS1820(void); void Delay_510(void); void Delay_110(void); void Delay_10ms(void); void Delay_4s(void); void V2ToV(void);
StateREG = 0; //初始化變量 SetTF = 1; PowTF = 1; //關(guān)電源 THV = 0; TLV = 0; TMV = 0; KeyV = 0; TempKeyV = 0; KSDNum = 0; IntNum = 0; IntNum2 = 0; IntNum3 = 0; LED_One = 0; LED_Two = 0;
InitDS1820(); //初始化 ROMDS1820(); //跳過ROM TMERDS1820(); //E2PRAM中溫度上限值調(diào)入RAM InitDS1820(); //初始化 ROMDS1820(); //跳過ROM TMRDS1820(); //讀出溫度指令 ReadDS1820(); //讀出溫度值和上限值 TMSetV = TMRomV; //拷貝保存在DS18B20ROM里的上限值到TMSetV
EA = 1; //允許CPU中斷 ET0 = 1; //定時器0中斷打開 TMOD = 0x1; //設(shè)定時器0為模式1,16位模式 TH0=0xB1; TL0=0xDF; //設(shè)定時值為20000us(20ms) TR0 = 1; //開始定時 while(1); }
//定時器0中斷外理中鍵掃描和顯示 void KeyAndDis_Time0(void) interrupt 1 using 2 { TH0=0xB1; TL0=0xDF; //設(shè)定時值為20000us(20ms)
LEDPort = 0xFF; if (!Key_UP) KeyV = 1; if (!Key_DOWN) KeyV = 2; if (!Key_SET) KeyV = 3; //KeySETDowning = 0; //清除 if (KeyV != 0) //有鍵按下 { Delay_10ms(); //延時防抖 按下10ms再測 if (!Key_UP) TempKeyV = 1; if (!Key_DOWN) TempKeyV = 2; if (!Key_SET) TempKeyV = 3; if (KeyV == TempKeyV) //兩次值相等為確定接下了鍵 { if (KeyV == 3) //按下SET鍵,如在SET狀態(tài)就退出,否則進入 { //KeySETDowning = 1; //表明SET正在按下 PowTF = 0; //電源標識開 if (!KeyTF) if (SetTF) { SetTF = 0; //標識位標識退出設(shè)定 InitDS1820(); //初始化 ROMDS1820(); //跳過ROM TMWDS1820(); //寫溫度上限指令 WriteDS1820(); //寫溫度上限到DS18B20ROM WriteDS1820(); //寫溫度上限到DS18B20ROM WriteDS1820(); //寫溫度上限到DS18B20ROM InitDS1820(); //初始化 ROMDS1820(); //跳過ROM TMREDS1820(); //溫度上限值COPY回E2PRAM } else SetTF = 1; if (!KeySETDown) //沒有第一次按下SET時,KeySETDown標識置1 KeySETDown = 1; else KSDNum = KSDNum + 1; //前一秒內(nèi)有按過SET則開始計數(shù) } if (SetTF) //在SET狀態(tài)下 { if ((KeyV == 1) && (!KeyTF)) TMSetV = TMSetV + 1; //上調(diào)溫度 if ((KeyV == 2) && (!KeyTF)) TMSetV = TMSetV - 1; //下調(diào)溫度 if (TMSetV <= -55) //限制溫度上下限 TMSetV = -55; if (TMSetV >= 125) TMSetV = 125; } if ((!KeyTF) && (IntNum3 == 0)) KeyTF = 1; //當鍵盤處于可用時,鎖定 }
if (KeySETDown) //在2秒內(nèi)按下了SET則計中斷發(fā)生次數(shù)用于長按SET時計時用 IntNum = IntNum + 1; if (IntNum > 55) //中斷發(fā)生了55次時(大約1.2秒)75為1.5秒左右 { IntNum = 0; KeySETDown = 0; if (KSDNum == 55) //如一直長按了SET1.2秒左右 { RelayOutPort = 1; //關(guān)閉繼電器輸出 PowTF = 1; //電源標識關(guān) LEDOneC = 0; LEDTwoC = 0; LEDThreeC = 0; LEDPort = 0xBF; //顯示"--" Delay_4s(); //延時 LEDOneC = 1; LEDTwoC = 1; //關(guān)顯示 LEDThreeC = 1; Delay_4s(); IntNum = 0; IntNum2 = 0; IntNum3 = 0; } KSDNum = 0; } } KeyV = 0; TempKeyV = 0; //清空變量準備下次鍵掃描
if (!PowTF) { InitDS1820(); //初始化 ROMDS1820(); //跳過ROM TMVDS1820(); //溫度轉(zhuǎn)換指令
Delay_510(); Delay_510(); //延時等待轉(zhuǎn)換完成
InitDS1820(); //初始化 ROMDS1820(); //跳過ROM TMRDS1820(); //讀出溫度指令 ReadDS1820(); //讀出溫度值
V2ToV(); //轉(zhuǎn)換顯示值 if (TMV > TMSetV) //根據(jù)采集到的溫度值控制繼電器 { RelayOutPort = 0; } else { RelayOutPort = 1; }
if (SetTF) IntNum2 = IntNum2 + 1; //用于閃爍計數(shù) if (IntNum2 > 50 ) IntNum2 = 0; if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按鍵連按 if (IntNum3 > 25) { IntNum3 = 0; KeyTF = 0; }
if ((SetTF) && (IntNum2 < 25)) goto InitEnd; //計數(shù)在后半段時顯示 LEDPort = LED_One; LEDOneC = 0; Delay_510(); LEDOneC = 1; //顯示百位數(shù) LEDPort = LED_Two; LEDTwoC = 0; Delay_510(); LEDTwoC = 1; //顯示十位數(shù) LEDPort = LED_Three; LEDThreeC = 0; Delay_510(); LEDThreeC = 1; //顯示個位數(shù) } InitEnd:; }
void V2ToV(void) //數(shù)值轉(zhuǎn)換 { TLV = TLV >> 4; THV = THV << 4; //讀出的高低位數(shù)值移位 TMV = TLV | THV; //合并高低位放入TM為實際溫度值 Sign = 0; if (SetTF || !Key_SET) Sign = TMSetV >> 7; //取符號 else Sign = TMV >> 7;
if (Sign) { if (SetTF || !Key_SET) { LED_One = (~(TMSetV-1)) / 100; //SET狀態(tài)下顯示設(shè)定值 LED_Two = ((~(TMSetV-1)) - LED_One * 100)/10; LED_Three = (~(TMSetV-1)) - LED_One * 100 - LED_Two * 10; } else { LED_One = (~(TMV-1)) / 100; //轉(zhuǎn)換百位值 LED_Two = ((~(TMV-1)) - LED_One * 100)/10; LED_Three = (~(TMV-1)) - LED_One * 100 - LED_Two * 10; } } else { if (SetTF || !Key_SET) { LED_One = (TMSetV) / 100; //SET狀態(tài)下顯示設(shè)定值 LED_Two = (TMSetV - LED_One * 100)/10; LED_Three = TMSetV - LED_One * 100 - LED_Two * 10; } else { LED_One = (TMV) / 100; //轉(zhuǎn)換百位值 LED_Two = (TMV - LED_One * 100)/10; LED_Three = TMV - LED_One * 100 - LED_Two * 10; } }
//轉(zhuǎn)LED字段 if (LED_One) //超過百時十位的處理 LED_Two = LEDDis[LED_Two]; else { if (LED_Two == 0) LED_Two = LEDDis[10]; else LED_Two = LEDDis[LED_Two]; } if (Sign) LED_One = LEDDis[11]; else { if (LED_One == 0) LED_One = LEDDis[10]; else LED_One = LEDDis[LED_One]; } LED_Three = LEDDis[LED_Three]; }
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回應(yīng) if (!TMPort) //回應(yīng)信號為低電平 DS1820ON = 1; else DS1820ON = 0; Delay_110(); //延時 Delay_110(); TMPort = 1; //拉高TMPort }
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) //溫度轉(zhuǎn)換指令 { #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 //發(fā)出4EH寫ROM指令后連發(fā)兩個字節(jié)分別為上下限 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,#3 ; 將溫度高位和低位,高溫限制位從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 }
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 }
|