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

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

?? wendu.txt

?? 溫度控制程序 在KEIL開發環境中編寫 在C中嵌入匯編程序 執行效率較高
?? TXT
字號:
/*-------------------------------

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

-------------------------------*/

#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一区二区三区免费野_久草精品视频
色哟哟一区二区在线观看| 亚洲一区日韩精品中文字幕| 奇米亚洲午夜久久精品| 欧美日韩一级片在线观看| 亚洲影视在线播放| 精品视频在线免费看| 午夜一区二区三区在线观看| 欧美女孩性生活视频| 亚洲成av人综合在线观看| 久久精品免费在线观看| 国产盗摄女厕一区二区三区| 国产精品不卡在线| 一本色道综合亚洲| 亚洲成a人片综合在线| 7777女厕盗摄久久久| 久久99最新地址| 中文字幕欧美激情| 色综合天天综合网天天看片| 国产一区二区三区国产| 国产欧美日韩另类一区| 91一区在线观看| 亚洲第一福利视频在线| 日韩一级黄色片| 成人性视频网站| 亚洲一区av在线| 欧美v亚洲v综合ⅴ国产v| 国产一区二区三区最好精华液| 国产精品美女久久久久久久| 欧美在线免费播放| 精品在线你懂的| 亚洲欧洲在线观看av| 欧美精品一卡两卡| 国产91精品入口| 午夜精品国产更新| 亚洲国产精品二十页| 欧美又粗又大又爽| 国内精品国产三级国产a久久| 综合色天天鬼久久鬼色| 欧美一区二区私人影院日本| caoporn国产一区二区| 午夜精品久久久久久不卡8050| 国产无人区一区二区三区| 91国偷自产一区二区三区观看| 另类综合日韩欧美亚洲| 亚洲精品写真福利| 久久久亚洲高清| 欧美日韩不卡视频| 成人做爰69片免费看网站| 日本不卡一二三| 亚洲精品福利视频网站| 久久久久久久性| 欧美一区二区三区日韩| 一本久久a久久免费精品不卡| 国产麻豆欧美日韩一区| 日韩和欧美一区二区| 一区二区三区日韩在线观看| 国产精品情趣视频| 精品美女一区二区三区| 精品视频1区2区| 91麻豆自制传媒国产之光| 国产美女主播视频一区| 美女脱光内衣内裤视频久久影院| 亚洲欧美日韩电影| 日本一区二区不卡视频| 精品剧情在线观看| 欧美一区日韩一区| 欧美日韩精品电影| 在线看一区二区| 91啪亚洲精品| 成人av网站在线观看免费| 国产一区二区在线影院| 蜜桃一区二区三区在线| 日韩主播视频在线| 午夜在线电影亚洲一区| 亚洲国产人成综合网站| 亚洲一区二区精品久久av| 亚洲乱码日产精品bd| 国产精品乱码妇女bbbb| 国产精品人妖ts系列视频| 国产精品色婷婷| 国产精品美女久久久久久久久| 日本一区二区三区在线不卡| 26uuuu精品一区二区| 精品va天堂亚洲国产| 精品国精品国产| 久久免费偷拍视频| 国产亚洲欧洲997久久综合 | 粉嫩久久99精品久久久久久夜| 久久99日本精品| 精品无人区卡一卡二卡三乱码免费卡 | 欧美亚洲自拍偷拍| 91国偷自产一区二区开放时间| 在线免费观看视频一区| 精品视频免费在线| 91精品久久久久久久久99蜜臂| 69久久99精品久久久久婷婷| 欧美军同video69gay| 欧美一区二区在线看| 日韩精品一区二区三区在线观看 | 国产精品激情偷乱一区二区∴| 国产精品久久国产精麻豆99网站 | 亚洲免费观看高清完整版在线观看| 亚洲三级电影网站| 亚洲在线免费播放| 石原莉奈在线亚洲三区| 另类小说欧美激情| 国产成人av一区| 在线一区二区三区四区五区 | 欧美激情一区二区三区不卡| 亚洲日本青草视频在线怡红院| 亚洲自拍偷拍九九九| 久久99精品久久久久久久久久久久 | 欧美在线一区二区| 日韩欧美不卡一区| 中文字幕一区二区三区蜜月| 亚洲成a人片在线观看中文| 毛片不卡一区二区| 成人av在线影院| 91精选在线观看| 国产精品日韩精品欧美在线| 亚洲va天堂va国产va久| 国模少妇一区二区三区| 99精品热视频| 欧美一区中文字幕| 欧美精彩视频一区二区三区| 亚洲制服丝袜一区| 国产精一品亚洲二区在线视频| 色8久久精品久久久久久蜜| 欧美一级欧美一级在线播放| 中文字幕二三区不卡| 午夜视频一区在线观看| 成人性生交大片免费看中文网站| 在线看日本不卡| 日本一区二区三区在线观看| 日韩精品国产欧美| 成人高清免费在线播放| 日韩一区二区三区观看| 自拍偷拍国产亚洲| 国产精品一区二区在线观看网站| 欧美猛男男办公室激情| 国产精品久久看| 黄色资源网久久资源365| 欧美午夜精品一区二区蜜桃 | 丰满少妇在线播放bd日韩电影| 欧美日韩一级二级| 国产精品盗摄一区二区三区| 久久超碰97中文字幕| 欧美在线观看一区二区| 国产精品乱码一区二三区小蝌蚪| 久久99久久久久久久久久久| 欧美吞精做爰啪啪高潮| 中文字幕中文字幕一区二区| 韩国三级电影一区二区| 91精品国产一区二区三区香蕉| 亚洲激情在线激情| 99精品欧美一区| 国产精品另类一区| 国产69精品久久99不卡| 精品88久久久久88久久久| 日本成人在线网站| 欧美三级中文字| 亚洲精品欧美综合四区| 成人av电影在线网| 国产色产综合产在线视频| 麻豆一区二区三| 91精品婷婷国产综合久久竹菊| 亚洲影院在线观看| 欧美亚洲免费在线一区| 亚洲精品ww久久久久久p站| av不卡免费在线观看| 国产精品免费视频观看| 高清成人在线观看| 国产精品网站导航| 本田岬高潮一区二区三区| 国产精品国产三级国产aⅴ中文 | av资源站一区| 综合久久给合久久狠狠狠97色| 成人深夜视频在线观看| 国产精品美女久久久久久久久| 99国产精品久久久久久久久久 | 国产一区在线观看麻豆| 精品99久久久久久| 狠狠v欧美v日韩v亚洲ⅴ| 久久综合九色综合欧美98| 国产不卡视频一区二区三区| 中文字幕在线播放不卡一区| 91蝌蚪porny九色| 亚洲午夜羞羞片| 日韩一区二区在线观看视频播放| 蜜臀久久久久久久| 欧美精品一区二区三区久久久| 国产激情视频一区二区在线观看| 久久这里都是精品| 成人亚洲精品久久久久软件| 亚洲美女一区二区三区| 欧美唯美清纯偷拍| 久久99精品久久久久久国产越南 | 午夜伊人狠狠久久| 日韩欧美在线1卡| 国产高清一区日本|