亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcmain.c

?? 溫度控制器V1.5 顯示為三個共陽極LED 溫度傳感器用單總線DS18B20 CPU為2051
?? C
字號:
/*-------------------------------

溫度控制器V1.5
顯示為三個共陽極LED
溫度傳感器用單總線DS18B20
CPU為2051,四個按鍵,分別為UP,DOWN,SET
溫度調節上限為125度,下限為-55度
只能用于單只18B20

本軟件僅供學習與參考,引用時請注明版權

http://www.cdle.net
明浩 2004/1/2
pnzwzw@cdle.net
-------------------------------*/

#include <AT89X051.H>
#include <intrins.h>
#define Key_UP            P3_0    //上調溫度
#define Key_DOWN          P3_1    //下調溫度
#define Key_SET           P1_7    //設定鍵(溫度設定,長按開電源)
#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[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}; //0-9的LED筆劃,0xFF為空,0xF7為負號

static unsigned char bdata StateREG;	//可位尋址的狀態寄存器
sbit DS1820ON = StateREG^0;	          //DS1820是否存在
sbit SetTF = StateREG^1;              //是否是在溫度設置狀態
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;       //轉換后的溫度值
static unsigned char KeyV,TempKeyV;      //鍵值
static signed char TMRomV _at_ 0x0027;    //高溫限制
static signed char TMSetV _at_ 0x0026;    //溫度設定值
static unsigned char KSDNum;    //SET鍵連按時的采集次數
static unsigned char IntNum,IntNum2,IntNum3;    //中斷發生次數,IntNum用于SET長按檢測,IntNum2用于設定狀態時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);   //定義函數
	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;			//關電源
	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中溫度上限值調入RAM
	InitDS1820(); //初始化
	ROMDS1820(); 	//跳過ROM
	TMRDS1820(); 	//讀出溫度指令
	ReadDS1820(); //讀出溫度值和上限值
	TMSetV = TMRomV;  //拷貝保存在DS18B20ROM里的上限值到TMSetV

	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)

	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狀態就退出,否則進入
            {
							//KeySETDowning = 1; //表明SET正在按下
              PowTF = 0;      //電源標識開
							if (!KeyTF)
              	if (SetTF)
									{
                		SetTF = 0;    //標識位標識退出設定
										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;  //前一秒內有按過SET則開始計數
            }
          if (SetTF)  //在SET狀態下
            {
              if ((KeyV == 1) && (!KeyTF))
                TMSetV = TMSetV + 1;    //上調溫度
              if ((KeyV == 2) && (!KeyTF))
                TMSetV = TMSetV - 1;    //下調溫度
              if (TMSetV <= -55)          //限制溫度上下限
                TMSetV = -55;
              if (TMSetV >= 125)
                TMSetV = 125;
            }
		if ((!KeyTF) && (IntNum3 == 0)) KeyTF = 1; //當鍵盤處于可用時,鎖定
        }

      if (KeySETDown)         //在2秒內按下了SET則計中斷發生次數用于長按SET時計時用
        IntNum = IntNum + 1;  
      if (IntNum > 55)     //中斷發生了55次時(大約1.2秒)75為1.5秒左右
        {
          IntNum = 0;
					KeySETDown = 0;
          if (KSDNum == 55)      //如一直長按了SET1.2秒左右
            {
              RelayOutPort = 1;  //關閉繼電器輸出
              PowTF = 1;         //電源標識關
              LEDOneC = 0;
              LEDTwoC = 0;
              LEDThreeC = 0;
              LEDPort = 0xBF;      //顯示"--"
              Delay_4s();        //延時
              LEDOneC = 1;
              LEDTwoC = 1;      //關顯示
              LEDThreeC = 1;
              Delay_4s();
						  IntNum = 0;
						  IntNum2 = 0;
						  IntNum3 = 0;
            }
          KSDNum = 0;
         }
    }
  KeyV = 0;
  TempKeyV = 0;   //清空變量準備下次鍵掃描

  if (!PowTF)
    {
      InitDS1820();	//初始化
      ROMDS1820(); 	//跳過ROM
      TMVDS1820();  //溫度轉換指令

      Delay_510();
      Delay_510();  //延時等待轉換完成

      InitDS1820(); //初始化
      ROMDS1820(); 	//跳過ROM
      TMRDS1820(); 	//讀出溫度指令
      ReadDS1820(); //讀出溫度值

      V2ToV();        //轉換顯示值
      if (TMV > TMSetV)   //根據采集到的溫度值控制繼電器
        {
          RelayOutPort = 0;
		    }
      else
		    {
          RelayOutPort = 1;
  		  }

      if (SetTF) IntNum2 = IntNum2 + 1; //用于閃爍計數
      if (IntNum2 > 50 ) IntNum2 = 0;
			if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按鍵連按
			if (IntNum3 > 25) 
				{
					IntNum3 = 0;
					KeyTF = 0;
				}

      if ((SetTF) && (IntNum2 < 25)) goto InitEnd;  //計數在后半段時顯示
      LEDPort = LED_One;
      LEDOneC = 0;
      Delay_510();
      LEDOneC = 1;    //顯示百位數
      LEDPort = LED_Two;
      LEDTwoC = 0;
      Delay_510();
      LEDTwoC = 1;    //顯示十位數
      LEDPort = LED_Three;
      LEDThreeC = 0;
      Delay_510();
      LEDThreeC = 1;    //顯示個位數
    }
InitEnd:;
}

void V2ToV(void)	//數值轉換
{
  TLV = TLV >> 4;			
  THV = THV << 4;			//讀出的高低位數值移位
  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狀態下顯示設定值
    			LED_Two = ((~(TMSetV-1)) - LED_One * 100)/10;
			    LED_Three = (~(TMSetV-1)) - LED_One * 100 - LED_Two * 10;
				}
  		else
				{
    			LED_One = (~TMV) / 100;							//轉換百位值		
    			LED_Two = ((~TMV) - LED_One * 100)/10;
			    LED_Three = (~TMV) - LED_One * 100 - LED_Two * 10;
				}
		}
	else
		{ 
  		if (SetTF || !Key_SET)
				{
    			LED_One = (TMSetV) / 100;          //SET狀態下顯示設定值
    			LED_Two = (TMSetV - LED_One * 100)/10;
			    LED_Three = TMSetV - LED_One * 100 - LED_Two * 10;
				}
  		else
				{
    			LED_One = (TMV) / 100;							//轉換百位值		
    			LED_Two = (TMV - LED_One * 100)/10;
			    LED_Three = TMV - LED_One * 100 - LED_Two * 10;
				}
		}

 //轉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回應
  if (!TMPort)  //回應信號為低電平
    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)  //溫度轉換指令
{
#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,#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
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品美国一| 亚洲精品日产精品乱码不卡| 久久久久一区二区三区四区| 亚洲码国产岛国毛片在线| 免费欧美在线视频| 91视视频在线观看入口直接观看www | 亚洲成人综合网站| 国产精品亚洲综合一区在线观看| 欧美亚洲另类激情小说| 国产午夜精品一区二区三区四区| 亚洲mv在线观看| 色婷婷综合久久久久中文一区二区 | 国产亚洲精品aa| 五月综合激情日本mⅴ| 91免费在线播放| 久久久国产午夜精品 | 亚洲一区二区精品3399| av在线一区二区三区| 久久亚洲精品小早川怜子| 日韩电影在线看| 欧美精选一区二区| 亚洲福利一区二区| 欧美日韩在线播放| 亚洲一区二区在线免费看| 99vv1com这只有精品| 国产欧美一区二区在线| 国产麻豆精品theporn| 精品久久一二三区| 极品美女销魂一区二区三区| 日韩一级大片在线观看| 日韩av在线免费观看不卡| 欧美日本一区二区三区四区| 亚洲一区在线观看免费观看电影高清| 91在线你懂得| 亚洲精品ww久久久久久p站| 91蝌蚪porny| 亚洲精品福利视频网站| 欧美三级三级三级| 日韩精品乱码免费| 精品国产乱码久久久久久牛牛| 久久精品久久99精品久久| 久久影院电视剧免费观看| 国产精品一区二区三区网站| 国产蜜臀av在线一区二区三区| 国产精品影视在线观看| 国产欧美一区二区精品性| 成人avav影音| 亚洲午夜三级在线| 欧美日韩国产另类一区| 日韩电影一区二区三区四区| 日韩欧美123| 国产69精品久久久久毛片| 国产精品色在线| 色综合久久精品| 午夜在线电影亚洲一区| 日韩亚洲欧美综合| 国产精品一品二品| 亚洲免费观看在线视频| 欧美日免费三级在线| 免费成人深夜小野草| 国产亚洲一二三区| 久久一区二区视频| 成人在线视频首页| 亚洲一级电影视频| 欧美精品一区二区久久婷婷| 成人免费看黄yyy456| 视频精品一区二区| 国产精品天天看| 欧美日韩国产大片| 丁香天五香天堂综合| 亚洲国产欧美日韩另类综合| 亚洲精品一线二线三线| 99re8在线精品视频免费播放| 石原莉奈在线亚洲二区| 国产精品久久网站| 日韩一区二区免费在线电影| 99久久久精品免费观看国产蜜| 日本不卡的三区四区五区| 国产精品乱人伦中文| 666欧美在线视频| 色综合久久久久综合99| 国内外成人在线视频| 亚洲一区日韩精品中文字幕| 国产亚洲综合性久久久影院| 欧洲av一区二区嗯嗯嗯啊| 国产麻豆精品视频| 青青青伊人色综合久久| 亚洲乱码日产精品bd| 久久亚洲精品小早川怜子| 精品视频在线看| 97成人超碰视| 国产成人精品网址| 美女视频免费一区| 天天亚洲美女在线视频| 最新国产成人在线观看| 欧美—级在线免费片| 日韩欧美亚洲国产另类| 欧美在线影院一区二区| 91蜜桃传媒精品久久久一区二区| 国产麻豆视频一区| 久久er99热精品一区二区| 日韩精品免费专区| 天天做天天摸天天爽国产一区| 亚洲欧洲综合另类在线| 亚洲欧美综合在线精品| 国产精品天天摸av网| 国产欧美视频一区二区三区| 精品国产a毛片| 精品三级在线看| 欧美成人乱码一区二区三区| 欧美片网站yy| 9191国产精品| 欧美日韩久久不卡| 91精品国产品国语在线不卡| 欧美日韩不卡一区| 欧美一区二区三区人| 日韩午夜激情电影| 欧美xxxxx牲另类人与| 日韩欧美中文字幕制服| 精品国产凹凸成av人网站| 久久久久久黄色| 国产精品久久久久影院老司| 亚洲欧洲国产专区| 亚洲天堂久久久久久久| 亚洲欧美激情插| 亚洲已满18点击进入久久| 午夜亚洲福利老司机| 日本欧美肥老太交大片| 久久草av在线| 成人激情免费视频| 色婷婷av一区二区| 欧美喷潮久久久xxxxx| 日韩欧美国产综合一区 | 欧美日本一区二区| 在线综合+亚洲+欧美中文字幕| 欧美一区二区三区在线观看| 精品国产一区二区三区av性色| 久久久精品免费网站| 亚洲免费观看高清完整版在线| 午夜视黄欧洲亚洲| 韩国av一区二区| 色综合久久99| 91精品国产一区二区人妖| 久久久天堂av| 亚洲美女免费视频| 精品一区精品二区高清| 不卡电影一区二区三区| 欧美日韩不卡一区二区| 国产欧美精品一区二区色综合| 亚洲综合网站在线观看| 久久电影网电视剧免费观看| av成人免费在线观看| 91精品在线观看入口| 中文字幕免费不卡在线| 亚洲福利视频三区| 成人小视频免费在线观看| 欧美色综合网站| 国产清纯白嫩初高生在线观看91 | 欧美色涩在线第一页| 久久久久久电影| 日韩精品一二三| av一区二区三区黑人| 欧美一级片在线看| 亚洲少妇30p| 激情六月婷婷久久| 欧美美女一区二区在线观看| 亚洲国产精品成人综合色在线婷婷| 亚洲国产精品一区二区久久| 国产不卡视频一区| 日韩一区二区三区视频| 亚洲永久免费av| jizz一区二区| 欧美精品一区二区三区一线天视频 | 一本色道综合亚洲| 久久综合精品国产一区二区三区| 亚洲一级二级三级| 99久久精品国产麻豆演员表| 久久奇米777| 日本不卡一区二区三区| 91黄色免费版| 中文av一区二区| 国产成人自拍网| 欧美成人video| 日韩va欧美va亚洲va久久| 欧美日韩精品是欧美日韩精品| ●精品国产综合乱码久久久久| 国产成人综合亚洲网站| 精品久久久影院| 久久精品国产99国产| 欧美一区二区三区公司| 午夜国产精品一区| 欧美人牲a欧美精品| 亚洲一区中文日韩| 欧美日韩精品欧美日韩精品一综合 | 丝袜亚洲另类欧美| 欧美在线短视频| 亚洲第一久久影院| 欧美日韩和欧美的一区二区| 亚洲香肠在线观看| 欧美三级电影一区|