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

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

?? tcmain.c

?? 溫度傳感器用單總線DS18B20
?? C
字號:
/*-------------------------------

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

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

http://www.cdle.net
明浩 2004/9/13
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-1)) / 100;							//轉換百位值		
    			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狀態下顯示設定值
    			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一区二区三区免费野_久草精品视频
日韩欧美国产午夜精品| 午夜视频在线观看一区二区| 麻豆精品国产传媒mv男同| 在线观看区一区二| 亚洲一区二区四区蜜桃| 在线精品观看国产| 亚洲成人动漫在线免费观看| 精品视频在线看| 日韩精品一卡二卡三卡四卡无卡| 91精品国产综合久久福利| 青青草成人在线观看| 欧美精品一区二区精品网| 国v精品久久久网| 日韩伦理电影网| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 亚洲午夜电影网| 精品少妇一区二区三区在线播放| 国产精品自拍一区| 中文字幕中文在线不卡住| 91国偷自产一区二区三区观看 | 国产日韩欧美综合一区| 一区二区免费在线播放| 欧美三级三级三级爽爽爽| 日本网站在线观看一区二区三区| 91黄视频在线观看| 日本欧美韩国一区三区| 国产欧美一区二区精品仙草咪| 99久久精品99国产精品| 婷婷开心激情综合| 久久精品一区二区三区四区| 色综合久久六月婷婷中文字幕| 午夜精品一区二区三区免费视频| 亚洲精品一区二区三区福利| 成人a区在线观看| 天天综合日日夜夜精品| 国产日韩一级二级三级| 欧美日韩国产一级| 国产91高潮流白浆在线麻豆| 亚洲一区在线观看视频| 国产亚洲自拍一区| 欧美三片在线视频观看| 国产成人午夜精品影院观看视频| 一区二区三区四区视频精品免费| 欧美大胆人体bbbb| 欧美三级资源在线| thepron国产精品| 激情文学综合网| 一区二区三区视频在线看| 国产午夜三级一区二区三| 欧美男男青年gay1069videost| 成人激情开心网| 极品少妇xxxx偷拍精品少妇| 一区二区在线免费| 国产色婷婷亚洲99精品小说| 91精品国产麻豆国产自产在线| 91免费在线看| 成人精品免费看| 国产一区久久久| 日本麻豆一区二区三区视频| 亚洲色图19p| 国产精品狼人久久影院观看方式| 精品国产制服丝袜高跟| 欧美蜜桃一区二区三区| 91久久精品午夜一区二区| 成人黄色电影在线| 国产不卡在线视频| 国产成人午夜精品5599| 狠狠色丁香婷婷综合久久片| 视频在线观看国产精品| 亚洲综合色网站| 亚洲精品水蜜桃| 亚洲人午夜精品天堂一二香蕉| 中文字幕免费不卡在线| 国产日韩欧美精品在线| 久久综合给合久久狠狠狠97色69| 欧美一区二区三区电影| 欧美一区二区三区在| 欧美另类变人与禽xxxxx| 欧美日韩一区二区在线视频| 91视频观看免费| 99精品视频一区二区| 一本大道av伊人久久综合| 色狠狠一区二区三区香蕉| 日本韩国欧美三级| 在线观看一区二区视频| 欧美性猛交xxxx乱大交退制版| 色噜噜狠狠色综合中国| 91丨porny丨国产入口| 日本道色综合久久| 欧美福利一区二区| 日韩欧美一区二区三区在线| 精品国产一区a| 欧美激情一二三区| 中文字幕中文乱码欧美一区二区 | 欧美绝品在线观看成人午夜影视| 午夜不卡在线视频| 91一区一区三区| 一本到高清视频免费精品| 91麻豆产精品久久久久久| 欧美在线观看一区二区| 91精品欧美福利在线观看| 日韩视频一区二区三区在线播放 | 欧美一区二区三区小说| 亚洲精品一区二区三区精华液| 久久精品男人天堂av| 国产精品二三区| 亚洲成人av免费| 国产一二精品视频| 色婷婷亚洲综合| 91精品国产91热久久久做人人| 欧美电影免费观看高清完整版在线 | 亚洲蜜桃精久久久久久久| 夜夜揉揉日日人人青青一国产精品| 亚洲成人激情av| 国产乱子伦视频一区二区三区 | 精品一区二区免费| 国产电影一区二区三区| 色综合久久久久综合体桃花网| 欧美日韩亚洲另类| 久久久久久免费毛片精品| 国产精品久久久久久久久免费桃花 | 91亚洲永久精品| 91精品婷婷国产综合久久| 国产午夜一区二区三区| 亚洲一级电影视频| 激情五月激情综合网| 色婷婷综合久久久久中文| 欧美草草影院在线视频| 亚洲女同ⅹxx女同tv| 免费人成黄页网站在线一区二区| 成人美女视频在线观看| 91精品国产综合久久国产大片| 中文字幕乱码一区二区免费| 亚洲成av人片一区二区三区| 国内成人免费视频| 欧美日韩三级一区| 国产精品你懂的在线欣赏| 日本伊人午夜精品| 91国偷自产一区二区使用方法| 中文字幕日韩一区| 美美哒免费高清在线观看视频一区二区| 懂色av一区二区夜夜嗨| 日韩欧美国产午夜精品| 一区二区三区四区亚洲| 成人性生交大片免费看在线播放 | 国产精品无人区| 欧美在线色视频| 欧美一区二区精品| 亚洲日本在线a| 国产在线精品国自产拍免费| 欧洲视频一区二区| 国产精品情趣视频| 国产麻豆精品一区二区| 日韩一区二区精品| 午夜视频在线观看一区二区| 99r国产精品| 日本一区二区电影| 极品美女销魂一区二区三区 | 亚洲国产精品人人做人人爽| 成人在线视频一区二区| 欧美精品一区二区三区蜜桃| 婷婷开心久久网| 欧美性xxxxxx少妇| 一区二区三区**美女毛片| 91美女精品福利| 国产精品美女www爽爽爽| 国产福利91精品一区| 精品久久久久香蕉网| 麻豆91精品91久久久的内涵| 欧美精品丝袜中出| 天堂成人国产精品一区| 欧美日本一道本| 亚洲成人av中文| 欧美日韩亚洲国产综合| 夜夜爽夜夜爽精品视频| 欧美日韩视频在线第一区| 亚洲制服丝袜在线| 欧美日韩高清在线| 丝袜美腿成人在线| 欧美成人aa大片| 国内久久婷婷综合| 国产欧美日韩中文久久| 成人午夜视频在线观看| 日本一区二区三区在线不卡| 国产69精品一区二区亚洲孕妇| 中文字幕免费一区| 色婷婷精品大视频在线蜜桃视频 | 91麻豆6部合集magnet| 亚洲人成网站在线| 欧美日韩在线播放三区四区| 日韩专区欧美专区| 欧美精品一区二区三区四区| 成人午夜视频免费看| 亚洲人成7777| 欧美电影一区二区三区| 国产综合成人久久大片91| 欧美激情一区二区| 欧美网站大全在线观看| 蜜臀91精品一区二区三区| 久久久久久久久久久电影|