基於51單片機DS18B20測溫LCD1602顯示可設時設溫調時的項目


一、前言

1、基於51單片機DS18B20測溫LCD1602顯示可設時設溫調時的項目包括用Keil軟件編寫單片機C語言程序和用Proteus軟件仿真單片機外圍電路

2、基於51單片機DS18B20測溫LCD1602顯示可設時設溫調時的項目構思

(1)、聲明程序變量思維導圖

(2)、程序子函數思維導圖

在這里插入圖片描述

(3)、程序主函數思維導圖

二、基於51單片機DS18B20測溫LCD1602顯示可設時設溫調時的項目的Keil軟件編寫的單片機C語言程序

   1 #include<reg52.h>//聲明51單片機內部寄存器頭文件
   2 #define uchar unsigned char //自定義uchar為unsigned char(即無符號字符型數據,數據范圍:0到255。)
   3 #define uint unsigned int//自定義uint為unsigned int(即無符號整數型數據,數據范圍:0到65535。)
   4 sbit RS=P0^7;//位定義LCD1602字符型液晶顯示器的數據/命令選擇引腳                 
   5 sbit RW=P0^6;//位定義LCD1602字符型液晶顯示器的讀寫引腳                        
   6 sbit EN=P0^5; //位定義LCD1602字符型液晶顯示器的使能引腳
   7 sbit DQ=P1^6;//位定義DS18B20溫度傳感器數據端口
   8 sbit FengNingQi=P3^1;//位定義蜂鳴器口
   9 sbit S=P3^2;//位定義啟停按鍵S
  10 sbit S0=P3^3;//位定義設時按鍵S0
  11 sbit S1=P3^4;//位定義設溫按鍵S1
  12 sbit S2=P3^5;//位定義調時按鍵S2
  13 sbit S3=P3^6;//位定義增加按鍵S3
  14 sbit S4=P3^7;//位定義減少按鍵S4
  15 uchar count,Snum,S0num,S1num,S2num,S3numflag,S4numflag,TR0flag,setsecondflag,setminutanflag,sethourflag,miaoflag,fenflag,shiflag,settemperatureflag;//定時器0中斷次數變量、啟停按鍵按下次數變量、設時按鍵按下次數變量、設溫按鍵下次數變量、調時按鍵按下次數變量、增加鍵標志位變量、減少鍵標志位變量、定時器0標志位變量、設時秒鍾標志位變量、設時分鍾標志位變量、設時時鍾標志位變量、秒鍾標志位變量、分鍾標志位變量、時鍾標志位變量、設溫標志位變量
  16 uchar miao,fen,shi;//走時秒鍾變量、走時分鍾變量、走時時鍾變量
  17 uchar setsecond,setminutan,sethour;//設時秒鍾變量、設時分鍾變量、設時時鍾變量
  18 uchar setsecondge,setsecondshi;//設時秒鍾個位變量、設時秒鍾十位變量
  19 uchar setminutange,setminutanshi;//設時分鍾個位變量、設時分鍾十位變量
  20 uchar sethourge,sethourshi;//設時時鍾個位變量、設時時鍾十位變量
  21 uchar secondge,secondshi; //調時秒鍾個位變量、調時秒鍾十位變量
  22 uchar minutange,minutanshi;//調時分鍾個位變量、調時分鍾十位變量
  23 uchar hourge,hourshi;//調時時鍾個位變量、調時時鍾十位變量
  24 uchar qitingflag,temperaturedisplayflag,lcd1602displaytimeflag,settimedisplayflag,settemperaturedisplayflag,tiaotimedisplayflag,timebaojingflag,temperatruebaojingflag;//啟停鍵標志位變量、溫度顯示標志位變量、液晶顯示器顯示時間標志位變量、設時顯示標志位變量、設溫顯示標志位變量、調時顯示標志位變量、時間報警標志位變量、溫度報警標志位變量
  25 uint temperature,t;//讀溫度變量
  26 uint temperatureflag;//負溫度標志位變量
  27 uint wendu,wenduxiaoshu,xiaoshudian,wenduge,wendushi,wendubai,fuhaowei,setwendu,setwenduxiaoshu,setwenduge,setwendushi,setwendubai,settemperature;//測溫變量、測溫小數變量、測溫小數點變量、測溫個位變量、測溫十位變量、測溫百位變量、溫度符號位變量、設溫變量、設溫小數變量、設溫個位變量、設溫十位變量、設溫百位變量、總設溫變量
  28 //uchar table0[]="00:00:00";//LCD1602字符型液晶顯示器第一行初始顯示
  29 uchar table1[]="00:00:00";//LCD1602字符型液晶顯示器顯示第二行走時初始化數組變量
  30   void Delay(uint z)//毫秒延時程序
  31 {
  32    uint x,y;
  33    for(x=z;x>0;x--)
  34     for(y=110;y>0;y--);
  35  }
  36   void DS18B20_Delay(uint i)//DS18B20溫度傳感器微妙延時函數
  37 {
  38    while(i--);
  39  }
  40   void LCD1602WriteCommand(uchar command)//LCD1602字符型液晶顯示器寫指令函數
  41 {
  42    RS=0;//LCD1602字符型液晶顯示器指令寄存器命令選擇引腳置低電平
  43    RW=0;//LCD1602字符型液晶顯示器寫指令操作寫引腳置低電平
  44    P2=command;//LCD1602字符型液晶顯示器寫指令函數寫指令到單片機P2組端口,再輸送到LCD1602字符型液晶顯示器指令寄存器中執行。
  45    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  46    EN=1;//LCD1602字符型液晶顯示器使能端引腳置高電平  
  47    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  48    EN=0;//LCD1602字符型液晶顯示器使能端引腳置低電平
  49  }
  50   void LCD1602WriteData(uchar information)//LCD1602字符型液晶顯示器寫數據函數
  51 {  
  52    RS=1;//LCD1602字符型液晶顯示器數據寄存器數據選擇引腳置高電平
  53    RW=0;//LCD1602字符型液晶顯示器寫數據操作寫引腳置低電平
  54    P2=information;//LCD1602字符型液晶顯示器寫數據函數寫數據到單片機P2組端口,再輸送到LCD1602字符型液晶顯示器上顯示。
  55    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  56    EN=1;//LCD1602字符型液晶顯示器使能端引腳置高電平 
  57    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  58    EN=0;//LCD1602字符型液晶顯示器使能端引腳置低電平
  59  }
  60   void LCD1602Init()//LCD1602字符型液晶顯示器初始化函數
  61 {
  62    LCD1602WriteCommand(0x38);//設置LCD1602字符型液晶顯示器16x2顯示,5*7或5*8點陣,8位數據並口,簡稱顯模。
  63    LCD1602WriteCommand(0x08);//設置LCD1602字符型液晶顯示器顯示開,簡稱亮屏。
  64    LCD1602WriteCommand(0x01);//設置清除LCD1602字符型液晶顯示器屏上所有內容,並讓光標復位到LCD1602字符型液晶顯示器屏左上角,簡稱清屏。
  65    LCD1602WriteCommand(0x06);//設置開光標(或字符)地址指針自增1,光標右移動一個字符位,整屏顯示不移動。
  66    LCD1602WriteCommand(0x0c);//設置開LCD1602字符型液晶顯示器顯示,關光標,關光標(字符)閃爍。
  67  }
  68   void LCD1602DisplayInitTime()//LCD1602字符型液晶顯示器顯示初始化時間函數
  69 {
  70    uchar j;//j表示數組元素個數變量
  71 //   WriteCommand(0x80+0x00);//LCD1602字符型液晶顯示器第一行第一個位置顯示
  72 //   for(j=0;j<8;j++)//有10個字符,要循環10次。
  73 //  {
  74 //    WriteData(table0[j]);//顯示字符串
  75 //    Delay(5);
  76 //   }
  77    LCD1602WriteCommand(0x80+0x40);//LCD1602字符型液晶顯示器第二行第一個位置顯示
  78    for(j=0;j<8;j++)//有8個字符,要循環8次。
  79   { 
  80     LCD1602WriteData(table1[j]);//顯示走時
  81     Delay(5);//毫秒延時
  82    }
  83  }
  84   void LCD1602DisplayTimeFenJie(uchar address,uchar num)//LCD1602字符型液晶顯示器顯示走時時間兩位數分解函數
  85 {
  86    uchar ge,shi;//聲明走時時間個位變量、走時時間十位變量
  87    ge=num%10;//走時時間個位變量分解
  88    shi=num/10;//走時時間十位變量分解
  89    LCD1602WriteCommand(0x80+0x40+address);//LCD1602字符型液晶顯示器第二行某個顯示位
  90    LCD1602WriteData(0x30+shi);//0x30表示字符庫的數字0,整個代碼表示走時時間十位變量可顯示0到9的數字。
  91    LCD1602WriteData(0x30+ge);//0x30表示字符庫的數字0,整個代碼表示走時時間個位變量可顯示0到9的數字。
  92  }
  93   void LCD1602DisplayGeDigitResolve(uchar address,uchar num)//LCD1602字符型液晶顯示器顯示調時時間個位數分解函數
  94 {
  95    uchar ge;//調時時間個位變量
  96    ge=num%10;//調時時間個位變量分解
  97    LCD1602WriteCommand(0x80+0x40+address);//LCD1602字符型液晶顯示器第二行某個顯示位
  98    LCD1602WriteData(0x30+ge);//0x30表示字符庫的數字0,整個代碼表示調時時間個位變量可顯示0到9的數字。
  99  }
 100   void LCD1602DisplayShiDigitResolve(uchar address,uchar num)//LCD1602字符型液晶顯示器顯示調時時間十位變量分解函數
 101 {
 102    uchar shi;//調時時間十位變量
 103    shi=num%10;//調時時間十位變量分解
 104    LCD1602WriteCommand(0x80+0x40+address);//LCD1602字符型液晶顯示器第二行某個顯示位
 105    LCD1602WriteData(0x30+shi);//0x30表示字符庫的數字0,整個代碼表示調時時間十位變量可顯示0到9的數字。
 106  }
 107   bit DS18B20Init()//DS18B20溫度傳感器初始化函數
 108 {
 109    uchar x=0;//聲明一個表示低電平變量
 110    DQ = 1;//單片機將DS18B20通信端口DQ拉高復位  
 111    DS18B20_Delay(8);//稍做DS18B20溫度傳感器延時
 112    DQ = 0;//單片機將DS18B20通信端口DQ拉低 
 113    DS18B20_Delay(80);//DS18B20溫度傳感器延時在480us與960us之間
 114    DQ = 1;//單片機將DS18B20通信端口DQ拉高
 115    DS18B20_Delay(4);//DS18B20溫度傳感器延時在15us與60us之間
 116    x=DQ;//稍做延時后,如果x=0,則初始化成功,若x=1則初始化失敗。
 117    DS18B20_Delay(20);//DS18B20溫度傳感器延時在60us與240us之間
 118    return x;//返回低電平變量
 119  }
 120   void DS18B20_WriteOneByte(uchar j)//DS18B20溫度傳感器寫一個字節函數
 121 {
 122    uchar i=0;//聲明一個循環變量
 123    for (i=8; i>0; i--)//單片機向DS18B20溫度傳感器寫入數據
 124   {
 125     DQ = 0;//單片機將DS18B20溫度傳感器通信端口DQ從高電平拉至低電平時,單片機向DS18B20溫度傳感器寫數據開始。
 126     DQ = j&0x01;//單片機按將字節低位寫入DS18B20溫度傳感器
 127     DS18B20_Delay(5);//DS18B20溫度傳感器延時在60us與120us之間
 128     DQ = 1;//單片機將DS18B20溫度傳感器通信端口DQ拉高 
 129     j>>=1;//變量j右移一位,最高位補零。例如當j=1,換成二進制是0000 0001,右移一位就是0000 000。擴展:單片機無符號或有符號數左移幾位,高位就依次補幾位0,低位也依次去掉幾位,讓左移幾位依次代替低位去掉的幾位。單片機有符號數,如果是正數,右移幾位,先是確定最高位用0,低位也依次去掉幾位,讓右移幾位依次代替低位去掉的幾位,如果是負數,右移幾位,先是確定最高位用1,低位也依次去掉幾位,讓右移幾位依次代替低位去掉的幾位。       
 130    }
 131  }
 132   uchar DS18B20_ReadOneByte()//DS18B20溫度傳感器讀一個字節函數
 133 {
 134    uchar i=0;//聲明一個循環變量
 135    uchar j = 0;//聲明一個移位變量
 136    for (i=8;i>0;i--)//單片機讀取DS18B20溫度傳感器采集的溫度數值轉換成一個字節
 137   {
 138     DQ = 0;//單片機將DS18B20溫度傳感器通信端口DQ從高電平拉成低電平時,單片機讀取DS18B20溫度傳感器所采集到溫度數值開始。
 139     j>>=1;//變量j右移一位,最高位補零。例如當j=1,換成二進制是0000 0001,右移一位就是0000 000。擴展:單片機無符號或有符號數左移幾位,高位就依次補幾位0,低位也依次去掉幾位,讓左移幾位依次代替低位去掉的幾位。單片機有符號數,如果是正數,右移幾位,先是確定最高位用0,低位也依次去掉幾位,讓右移幾位依次代替低位去掉的幾位,如果是負數,右移幾位,先是確定最高位用1,低位也依次去掉幾位,讓右移幾位依次代替低位去掉的幾位。
 140     DQ = 1;//單片機將DS18B20溫度傳感器通信端口DQ拉高
 141     if(DQ)//判斷DS18B20溫度傳感器數據端口DQ是否等於1
 142     j|=0x80;//若DQ=1,則讓當前j最高位為1,在下次循環中移位至次高位,最后達到從低位到高位接收的目的;若DQ=0,則可跳過此語句,直接在下次循環對byte進行移位補0。  
 143     DS18B20_Delay(4);//稍做DS18B20溫度傳感器延時
 144   }
 145    return j;
 146 }
 147   uint DS18B20_ReadTemperature()//單片機讀取DS18B20溫度傳感器溫度函數
 148 {
 149    uchar L=0;//定義低8位溫度變量值
 150    uchar H=0;//定義高8位溫度變量值    
 151    DS18B20Init( );//DS18B20溫度傳感器初始化函數
 152    DS18B20_WriteOneByte(0xcc);//單片機只連一個DS18B20溫度傳感器時,可寫該段代碼,表示單片機向DS18B20溫度傳感器寫入跳過讀DS18B20溫度傳感器序列號指令。
 153    DS18B20_WriteOneByte(0x44);//單片機向DS18B20溫度傳感器九字節暫存器(包括兩個字節儲溫溫度寄存器、一字節高溫觸發器、一字節低溫觸發器、一字節溫度精度轉換配置寄存器、三個字節的保留位、一字節DS18B20溫度傳感器的64位ROM前56位編碼校驗CRC發生器)中前兩個字節溫度寄存器寫入啟動DS18B20溫度傳感器溫度轉換指令
 154 //   DS18B20_Delay(100);//稍作延時
 155    DS18B20Init( );//DS18B20溫度傳感器初始化函數
 156    DS18B20_WriteOneByte(0xcc);//單片機只連一個DS18B20溫度傳感器時,可寫該段代碼,表示單片機向DS18B20溫度傳感器寫入跳過讀DS18B20溫度傳感器序列號指令。
 157    DS18B20_WriteOneByte(0xbe);//單片機向DS18B20溫度傳感器九字節暫存器(包括兩個字節儲溫溫度寄存器、一字節高溫觸發器、一字節低溫觸發器、一字節溫度精度轉換配置寄存器、三個字節的保留位、一字節DS18B20溫度傳感器的64位ROM前56位編碼校驗CRC發生器)中前兩個字節溫度寄存器寫入DS18B20溫度傳感器讀取溫度的指令
 158 //   DS18B20_Delay(100);//稍作延時
 159    L=DS18B20_ReadOneByte( );//單片機向DS18B20溫度傳感器發送讀取溫度值低8位指令,把讀到的溫度值低8位賦給低8位溫度變量值
 160    H=DS18B20_ReadOneByte( );//單片機向DS18B20溫度傳感器發送讀取溫度值高8位指令,把讀到的溫度值高8位賦給高8位溫度變量值
 161    temperature = H;//DS18B20溫度傳感器讀到的高8位溫度變量值賦給溫度變量值,變成高8位溫度變量值,此時其還不是一個溫度變量值,由於一個溫度變量值是由高8位低8位共16位組成。
 162    temperature = temperature << 8;//溫度變量值高8位左移8位,就可以變成一個只有高8位低8位全0的溫度變量值。
 163    temperature = temperature | L;//只有高8位低8位全0的溫度變量值與溫度變量值低8位或運算后就變成一個真正有高8位低8位共16位的溫度變量值 
 164    if(temperature>0x0fff)//判斷表示溫度寄存器16位二進制數的溫度變量值是否大於表示溫度寄存器16位二進制數的正溫度值,假若大於且當表示溫度寄存器16位二進制數的溫度變量值的前5位二進制數全為1時,該溫度變量值表示負溫度值。
 165   {
 166     temperature = ~temperature+2;//負溫度變量值
 167     temperatureflag=1;//負溫度標志變量置1
 168    }
 169    else
 170   {      
 171     temperatureflag=0;//負溫度標志變量等於0
 172    }
 173    temperature = temperature*0.0625*10;//擴大10倍的溫度變量數值
 174    return temperature;//返回擴大10倍的溫度變量數值   
 175  }
 176   void SetTimeInit()//設時初始化函數
 177 {
 178    LCD1602WriteCommand(0x80+0x00);//LCD1602字符型液晶顯示器第一行第0個(從第零開始數)顯示位
 179    LCD1602WriteData(0x30+sethourshi);//0x30表示字符庫的數字0,整個代碼表示設時時鍾十位變量可顯示0到9的數字。
 180    LCD1602WriteData(0x30+sethourge);//0x30表示字符庫的數字0,整個代碼表示設時時鍾個位變量可顯示0到9的數字。
 181    LCD1602WriteData(0x3a);//0x3a表示字符庫中冒號
 182    LCD1602WriteData(0x30+setminutanshi);//0x30表示字符庫的數字0,整個代碼表示設時分鍾十位變量可顯示0到9的數字。
 183    LCD1602WriteData(0x30+setminutange);//0x30表示字符庫的數字0,整個代碼表示設時分鍾個位變量可顯示0到9的數字。
 184    LCD1602WriteData(0x3a);//0x3a表示字符庫中冒號
 185    LCD1602WriteData(0x30+setsecondshi);//0x30表示字符庫的數字0,整個代碼表示設時秒鍾十位變量可顯示0到9的數字。
 186    LCD1602WriteData(0x30+setsecondge);//0x30表示字符庫的數字0,整個代碼表示設時秒鍾個位變量可顯示0到9的數字。     
 187   }
 188   void SetTimeKeyScan()//設時按鍵掃描函數
 189 {
 190    if(S0==0)//判斷設時按鍵是否按下
 191   {
 192       Delay(5);//毫秒延時
 193     if(S0==0)//再次判斷設時按鍵是否按下
 194    {
 195      settemperatureflag=0;//設溫標志位變量置0,在溫度報警函數執行后但不報警的情況下,溫度報警函數里邊余留settemperatureflag==1和TR0=1,當操作設時按鍵掃描函數時,計時依然在執行,導致計時不恰當,因此在設時按鍵掃描函數里邊添加settemperatureflag=0和TR0=0,執行設時按鍵掃描函數后,溫度報警函數里邊settemperatureflag==1和TR0=1被置換成settemperatureflag=0和TR0=0,很好地解決了在操作設時按鍵掃描函數時,計時依然在執行,導致計時不恰當的問題。
 196      S0num++;//設時按鍵按下次數變量加加
 197      while(!S0);//等待設時按鍵彈起
 198      switch(S0num)//設時按鍵按下次數變量選擇位
 199     {
 200       case 1://設時按鍵第一次按下
 201              TR0=0;//關定時器0
 202              TR0flag=0;//定時器0標志位變量置0,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留TR0flag==1,當再次操作設時按鍵掃描函數設時時,會發生在設時過程中觸發設時報警條件而報警,因此在設時按鍵掃描函數里邊添加TR0flag=0,再次執行設時按鍵掃描函數后,溫度報警函數里邊TR0flag==1被置換成TR0flag=0,很好地解決了再次操作設時按鍵掃描函數設時時,在設時過程中觸發設時報警條件而報警的問題。
 203              tiaotimedisplayflag=1;//調時顯示標志位變量置1,在操作設時按鍵掃描函數的情況下,不能操作調時按鍵掃描函數。
 204              settemperaturedisplayflag=1;//設溫顯示標志位變量置1,在操作設時按鍵掃描函數的情況下,不能操作設溫按鍵掃描函數。
 205              lcd1602displaytimeflag=1;//液晶顯示器顯示時間標志位變量置1,在操作設時按鍵掃描函數的情況下,不受時鍾兩位數分解函數和分鍾兩位數分解函數和秒鍾兩位數分解函數影響。
 206              temperaturedisplayflag=1;//溫度顯示標志位變量置1,在操作設時按鍵掃描函數的情況下,不受溫度分解函數和溫度顯示函數影響。
 207              LCD1602WriteCommand(0x80+0x00+0x07);//LCD1602字符型液晶顯示器第一行第7個(從第0開始數)位置的顯示位
 208              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 209              break;
 210       case 2://設時按鍵第二次按下 
 211              LCD1602WriteCommand(0x80+0x00+0x06);//LCD1602字符型液晶顯示器第一行第6個(從第0開始數)個位置的顯示位
 212              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 213              break;
 214       case 3://設時按鍵第三次按下
 215              LCD1602WriteCommand(0x80+0x00+0x04);//LCD1602字符型液晶顯示器第一行第4個(從第0開始數)位置的顯示位
 216              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 217              break;
 218       case 4://設時按鍵第四次按下
 219              LCD1602WriteCommand(0x80+0x00+0x03);//LCD1602字符型液晶顯示器第一行第3個(從第0開始數)位置的顯示位
 220              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 221              break;
 222       case 5://設時按鍵第五次按下
 223              LCD1602WriteCommand(0x80+0x00+0x01);//LCD1602字符型液晶顯示器第一行第1個(從第0開始數)位置的顯示位
 224              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 225              break;
 226       case 6://設時按鍵第六次按下
 227              LCD1602WriteCommand(0x80+0x00+0x00);//LCD1602字符型液晶顯示器第一行第0個(從第0開始數)位置的顯示位
 228              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 229              break;
 230       case 7://設時按鍵第七次按下
 231              LCD1602WriteCommand(0x80+0x00+0x07);//LCD1602字符型液晶顯示器第一行第7個(從第0開始數)位置的顯示位
 232              LCD1602WriteCommand(0x0c);//LCD1602字符型液晶顯示器關光標(或字符)閃爍。
 233              TR0=1;//開定時器0
 234              TR0flag=1;//定時器0標志位變量置1,為了在操作設時按鍵掃描函數進行設時后,可以執行時間報警函數。
 235              S0num=0;//設時按鍵按下次數變量清零,可以反復操作設時按鍵。
 236              settemperaturedisplayflag=0;//設溫顯示標志位變量置0,讓設時按鍵掃描函數執行后,可允許設溫按鍵掃描函數執行。
 237              tiaotimedisplayflag=0;//調時顯示標志位變量置0,讓設時按鍵掃描函數執行后,可允許調時按鍵掃描函數執行。
 238              lcd1602displaytimeflag=0;//液晶顯示器顯示時間標志位變量等於0,讓設時按鍵掃描函數執行后,可允許時鍾兩位數分解函數和分鍾兩位數分解函數和秒鍾兩位數分解函數執行。
 239              temperaturedisplayflag=0;//溫度顯示標志位變量等於0,讓設時按鍵掃描函數執行后,可允許溫度分解函數和溫度顯示函數執行。
 240              break;
 241      default:
 242              S0num=0;//設溫按鍵按下次數變量清零,可以反復操作設時按鍵。
 243              break;  
 244       }
 245      }
 246     }
 247     if(S0num!=0)//判斷設時按鍵按下次數變量是否不為0
 248   {
 249      if(S3==0)//判斷增加按鍵是否按下
 250     {
 251       Delay(5);//毫秒延時
 252       if(S3==0)//再次判斷增加按鍵是否按下
 253      {
 254        S3numflag=1;//增加鍵標志位變量置1,可以在時間報警函數內進行設時報警。
 255        while(!S3);//等待增加按鍵彈起
 256        switch(S0num)//設時按鍵按下次數變量選擇位
 257       {
 258         case 1://設時按鍵第一次按下
 259                setsecondflag=1;//設時秒鍾標志位變量置1,表示設時秒鍾變量數值修改。
 260                setsecondge++;//設時秒鍾個位變量加加
 261                if(setsecondge==10)//判斷設時秒鍾個位變量是否達到10
 262                setsecondge=0;//設時秒鍾個位變量置零
 263                LCD1602WriteCommand(0x80+0x00+0x07);//寫入LCD1602字符型液晶顯示器第一行第7個(從第0個開始數)位置的設時秒鍾個位變量顯示位
 264                LCD1602WriteData(0x30+setsecondge);//0x30表示字符庫的數字0,整個代碼表示設時秒鍾個位變量可顯示0到9的數字。
 265                LCD1602WriteCommand(0x80+0x00+0x07);//寫入LCD1602字符型液晶顯示器第一行第7個(從第0個開始數)位置的設時秒鍾個位變量顯示位
 266                setsecond=setsecondshi*10+setsecondge;//設時秒鍾變量求和表達式
 267                break;
 268         case 2://設時按鍵第二次按下
 269                setsecondflag=1;//設時秒鍾標志位變量置1,表示設時秒鍾變量數值修改。
 270                setsecondshi++;//設時秒鍾十位變量加加
 271                if(setsecondshi==6)//判斷設時秒鍾十位變量是否達到6
 272                setsecondshi=0;//設時秒鍾十位變量置零
 273                LCD1602WriteCommand(0x80+0x00+0x06);//寫入LCD1602字符型液晶顯示器第一行第6個(從第0個開始數)位置的設時秒鍾十位變量顯示位
 274                LCD1602WriteData(0x30+setsecondshi);//0x30表示字符庫的數字0,整個代碼表示設時秒鍾十位變量變量可顯示0到9的數字。
 275                LCD1602WriteCommand(0x80+0x00+0x06);//寫入LCD1602字符型液晶顯示器第一行第6個(從第0個開始數)位置的設時秒鍾十位變量顯示位
 276                setsecond=setsecondshi*10+setsecondge;//設時秒鍾變量求和表達式
 277                break;
 278            case 3://設時按鍵第三次按下
 279                setminutanflag=1;//設時分鍾標志位變量置1,表示設時分鍾變量數值修改。
 280                setminutange++;//設時分鍾個位變量加加
 281                if(setminutange==10)//判斷設時分鍾個位變量是否達到10
 282                setminutange=0;//設時分鍾個位變量置零
 283                LCD1602WriteCommand(0x80+0x00+0x04);//寫入LCD1602字符型液晶顯示器第一行第4個(從第0個開始數)位置的設時分鍾個位變量顯示位
 284                LCD1602WriteData(0x30+setminutange);//0x30表示字符庫的數字0,整個代碼表示設時分鍾個位變量可顯示0到9的數字。
 285                LCD1602WriteCommand(0x80+0x00+0x04);//寫入LCD1602字符型液晶顯示器第一行第4個(從第0個開始數)位置的設時分鍾個位變量顯示位
 286                setminutan=setminutanshi*10+setminutange;//設時分鍾變量求和表達式
 287                break;
 288         case 4://設時按鍵第四次按下
 289                setminutanflag=1;//設時分鍾標志位變量置1,表示設時分鍾變量數值修改。
 290                setminutanshi++;//設時分鍾十位變量加加
 291                if(setminutanshi==6)//判斷設時分鍾十位變量設定值是否達到6
 292                setminutanshi=0;//設時分鍾十位變量置零
 293                LCD1602WriteCommand(0x80+0x00+0x03);//寫入LCD1602字符型液晶顯示器第一行第3個(從第0個開始數)位置的設時分鍾十位變量顯示位
 294                LCD1602WriteData(0x30+setminutanshi);//0x30表示字符庫的數字0,整個代碼表示設時分鍾十位變量可顯示0到9的數字。
 295                LCD1602WriteCommand(0x80+0x00+0x03);//寫入LCD1602字符型液晶顯示器第一行第3個(從第0個開始數)位置的設時分鍾十位變量顯示位
 296                setminutan=setminutanshi*10+setminutange;//設時分鍾變量求和表達式
 297                break;
 298            case 5://設時按鍵第五次按下
 299                sethourflag=1;//設時時鍾標志位變量置1,表示設時時鍾變量數值修改。
 300                sethourge++;//設時時鍾個位變量加加
 301                if(sethourge==4)//判斷設時時鍾個位變量是否達到4
 302                sethourge=0;//設時時鍾個位變量置零
 303                LCD1602WriteCommand(0x80+0x00+0x01);//寫入LCD1602字符型液晶顯示器第一行第1個(從第0個開始數)位置的設時時鍾個位變量顯示位
 304                LCD1602WriteData(0x30+sethourge);//0x30表示字符庫的數字0,整個代碼表示設時時鍾個位變量可顯示0到9的數字。
 305                LCD1602WriteCommand(0x80+0x00+0x01);//寫入LCD1602字符型液晶顯示器第一行第1個(從第0個開始數)位置的設時時鍾個位變量顯示位
 306                sethour=sethourshi*10+sethourge;//設時時鍾變量求和表達式
 307                break;
 308         case 6://設時按鍵第六次按下
 309                sethourflag=1;//設時時鍾標志位變量置1,表示設時時鍾變量數值修改。
 310                sethourshi++;//設時時鍾十位變量加加
 311                if(sethourshi==3)//判斷設時時鍾十位是否達到3
 312                sethourshi=0;//設時時鍾十位變量置零
 313                LCD1602WriteCommand(0x80+0x00+0x00);//寫入LCD1602字符型液晶顯示器第一行第0個(從第0個開始數)位置的設時時鍾十位變量顯示位
 314                LCD1602WriteData(0x30+sethourshi);//0x30表示字符庫的數字0,整個代碼表示設時時鍾十位變量可顯示0到9的數字。
 315                LCD1602WriteCommand(0x80+0x00+0x00);//寫入LCD1602字符型液晶顯示器第一行第0個(從第0個開始數)位置的設時時鍾十位變量顯示位
 316                sethour=sethourshi*10+sethourshi;//設時時鍾變量求和表達式
 317                break;
 318        }
 319       }
 320      }
 321     }
 322     if(S0num!=0)//判斷設時按鍵按下次數變量是否不為0
 323   {
 324      if(S4==0)//判斷減少按鍵是否按下
 325     {
 326       Delay(5);//延時
 327       if(S4==0)//再次判斷減少按鍵是否按下
 328      {
 329        S4numflag=1;//減少鍵標志位變量,可以在時間報警函數內進行設時報警。
 330        while(!S4);//等待減少按鍵彈起
 331        switch(S0num)//設時按鍵按下次數變量選擇位
 332       {
 333         case 1://設時按鍵第一次按下
 334                setsecondflag=1;//設時秒鍾標志位變量置1,表示設時秒鍾變量數值修改。
 335                setsecondge--;//設時秒鍾個位變量減減
 336                if(setsecondge==-1)//判斷設時秒鍾個位變量是否達到-1
 337                setsecondge=9;//設時秒鍾個位變量置9
 338                LCD1602WriteCommand(0x80+0x00+0x07);//寫入LCD1602字符型液晶顯示器第一行第7個(從第0個開始數)位置的設時秒鍾個位變量顯示位
 339                LCD1602WriteData(0x30+setsecondge);//0x30表示字符庫的數字0,整個代碼表示設時秒鍾個位變量可顯示0到9的數字。
 340                LCD1602WriteCommand(0x80+0x00+0x07);//寫入LCD1602字符型液晶顯示器第一行第7個(從第0個開始數)位置的設時秒鍾個位變量顯示位
 341                setsecond=setsecondshi*10+setsecondge;//設時秒鍾變量求和表達式
 342                break;
 343         case 2://設時按鍵第二次按下
 344                setsecondflag=1;//設時秒鍾標志位變量置1,表示設時秒鍾數值修改。
 345                setsecondshi--;//設時秒鍾十位變量減減
 346                if(setsecondshi==-1)//判斷設時秒鍾十位變量是否達到-1
 347                setsecondshi=5;//設時秒鍾十位變量數置5
 348                LCD1602WriteCommand(0x80+0x00+0x06);//寫入LCD1602字符型液晶顯示器第一行第6個(從第0個開始數)位置的設時秒鍾十位變量顯示位
 349                LCD1602WriteData(0x30+setsecondshi);//0x30表示字符庫的數字0,整個代碼表示設時秒鍾十位變量變量可顯示0到9的數字。
 350                LCD1602WriteCommand(0x80+0x00+0x06);//寫入LCD1602字符型液晶顯示器第一行第6個(從第0個開始數)位置的設時秒鍾十位變量顯示位
 351                setsecond=setsecondshi*10+setsecondge;//設時秒鍾變量求和表達式
 352                break;
 353            case 3://設時按鍵第三次按下
 354                setminutanflag=1;//設時分鍾標志位變量置1,表示設時分鍾變量數值修改。
 355                setminutange--;//設時分鍾個位變量減減
 356                if(setminutange==-1)//判斷設時分鍾個位變量是否達到-1
 357                setminutange=9;//設時分鍾個位變量置9
 358                LCD1602WriteCommand(0x80+0x00+0x04);//寫入LCD1602字符型液晶顯示器第一行第4個(從第0個開始數)位置的設時分鍾個位變量顯示位
 359                LCD1602WriteData(0x30+setminutange);//0x30表示字符庫的數字0,整個代碼表示設時分鍾個位變量可顯示0到9的數字。
 360                LCD1602WriteCommand(0x80+0x00+0x04);//寫入LCD1602字符型液晶顯示器第一行第4個(從第0個開始數)位置的設時分鍾個位變量顯示位
 361                setminutan=setminutanshi*10+setminutange;//設時分鍾變量求和表達式
 362                break;
 363         case 4://設時按鍵第四次按下
 364                setminutanflag=1;//設時分鍾標志位變量置1,表示設時分鍾變量數值修改。
 365                setminutanshi--;//設時分鍾十位變量減減
 366                if(setminutanshi==-1)//判斷設時分鍾十位變量是否達到-1
 367                setminutanshi=5;//設時分鍾十位變量置9
 368                LCD1602WriteCommand(0x80+0x00+0x03);//寫入LCD1602字符型液晶顯示器第一行第3個(從第0個開始數)位置的設時分鍾十位變量顯示位
 369                LCD1602WriteData(0x30+setminutanshi);//0x30表示字符庫的數字0,整個代碼表示設時分鍾十位變量可顯示0到9的數字。
 370                LCD1602WriteCommand(0x80+0x00+0x03);//寫入LCD1602字符型液晶顯示器第一行第3個(從第0個開始數)位置的設時分鍾十位變量顯示位
 371                setminutan=setminutanshi*10+setminutange;//設時分鍾變量求和表達式
 372                break;
 373            case 5://設時按鍵第五次按下
 374                sethourflag=1;//設時時鍾標志位變量置1,表示設時時鍾變量數值修改。
 375                sethourge--;//設時時鍾個位變量減減
 376                if(sethourge==-1)//判斷設時時鍾個位變量是否達到-1
 377                sethourge=3;//設時時鍾個位變量置3
 378                LCD1602WriteCommand(0x80+0x00+0x01);//寫入LCD1602字符型液晶顯示器第一行第1個(從第0個開始數)位置的設時時鍾個位變量顯示位
 379                LCD1602WriteData(0x30+sethourge);//0x30表示字符庫的數字0,整個代碼表示設時時鍾個位變量可顯示0到9的數字。
 380                LCD1602WriteCommand(0x80+0x00+0x01);//寫入LCD1602字符型液晶顯示器第一行第1個(從第0個開始數)位置的設時時鍾個位變量顯示位
 381                sethour=sethourshi*10+sethourge;//設時時鍾變量求和表達式
 382                break;
 383         case 6://設時按鍵第六次按下
 384                sethourflag=1;//設時時鍾標志位變量置1,表示設時時鍾變量數值修改。
 385                sethourshi--;//設時時鍾十位變量減減
 386                if(sethourshi==-1)//判斷設時時鍾十位變量是否達到-1
 387                sethourshi=2;//設時時鍾十位變量置2
 388                LCD1602WriteCommand(0x80+0x00+0x00);//寫入LCD1602字符型液晶顯示器第一行第0個(從第0個開始數)位置的設時時鍾十位變量顯示位
 389                LCD1602WriteData(0x30+sethourshi);//0x30表示字符庫的數字0,整個代碼表示設時時鍾十位變量可顯示0到9的數字。
 390                LCD1602WriteCommand(0x80+0x00+0x00);//寫入LCD1602字符型液晶顯示器第一行第0個(從第0個開始數)位置的設時時鍾十位變量顯示位
 391                sethour=sethourshi*10+sethourge;//設時時鍾變量求和表達式
 392                break;
 393        }
 394       }
 395      }
 396     }
 397   } 
 398   void SetTemperatrueInit()//設溫初始化函數
 399 {
 400    LCD1602WriteCommand(0x80+0x08);//LCD1602字符型液晶顯示器第一行第九個(從第零開始數)顯示位
 401    LCD1602WriteData(fuhaowei);//符號位顯示。
 402    LCD1602WriteData(0x30+setwendubai);//0x30表示字符庫的數字0,整個代碼表示設溫百位變量可顯示0到9的數字。
 403    LCD1602WriteData(0x30+setwendushi);//0x30表示字符庫的數字0,整個代碼表示設溫十位變量可顯示0到9的數字。
 404    LCD1602WriteData(0x30+setwenduge);//0x30表示字符庫的數字0,整個代碼表示設溫個位變量可顯示0到9的數字。
 405    LCD1602WriteData(0x2e);//小數點
 406    LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符庫的數字0,整個代碼表示設溫小數位變量可顯示0到9的數字。
 407    LCD1602WriteData(0xdf);//0xdf表示字符庫中攝氏度左上角的符號
 408    LCD1602WriteData(0x43);//0x43表示字符庫中大寫字母C
 409   }
 410   void TemperatureFenJie()//溫度分解函數   
 411 {
 412    wendu=DS18B20_ReadTemperature();//DS18B20讀到的溫度值賦給溫度值變量
 413    if(temperatureflag==1)//判斷負溫度標志變量是否等於1
 414   {    
 415     fuhaowei=0x2d;//負符號
 416     wendubai=wendu/1000;//溫度百位變量分解
 417     wendushi=wendu%1000/100;//溫度十位變量分解
 418     wenduge=wendu%100/10;//溫度個位變量分解
 419     xiaoshudian=0x2e;//小數點
 420     wenduxiaoshu=wendu%10;//溫度小數位變量分解
 421    }
 422    else
 423   {
 424      fuhaowei=0x2b;//正符號
 425     if(wendu==0)//判斷溫度變量是否等於0
 426    {
 427         fuhaowei=0x20;//無符號
 428     }
 429     wendubai=wendu/1000;//溫度百位變量分解
 430     wendushi=wendu%1000/100;//溫度十位變量分解
 431     wenduge=wendu%100/10;//溫度個位變量分解
 432     xiaoshudian=0x2e;//小數點
 433     wenduxiaoshu=wendu%10;//溫度小數位變量分解
 434    }         
 435  }
 436   void TemperatureDisplay()//溫度顯示函數   
 437 { 
 438    LCD1602WriteCommand(0x80+0x48);//LCD1602字符型液晶顯示器第二行第九個(從第零開始數)顯示位
 439    LCD1602WriteData(fuhaowei);//符號位顯示。
 440    LCD1602WriteData(0x30+wendubai);//0x30表示字符庫的數字0,整個代碼表示溫度百位變量可顯示0到9的數字。
 441    LCD1602WriteData(0x30+wendushi);//0x30表示字符庫的數字0,整個代碼表示溫度十位變量可顯示0到9的數字。
 442    LCD1602WriteData(0x30+wenduge);//0x30表示字符庫的數字0,整個代碼表示溫度個位變量可顯示0到9的數字。
 443    LCD1602WriteData(xiaoshudian);//小數點
 444    LCD1602WriteData(0x30+wenduxiaoshu);//0x30表示字符庫的數字0,整個代碼表示小數位變量可顯示0到9的數字。
 445    LCD1602WriteData(0xdf);//0xdf表示字符庫中攝氏度左上角的符號
 446    LCD1602WriteData(0x43);//0x43表示字符庫中大寫字母C    
 447  }   
 448   void SetTemperatureKeyScan()//設溫按鍵掃描函數
 449 {
 450    if(S1==0)//判斷設溫按鍵是否按下
 451   {
 452       Delay(5);//毫秒延時
 453     if(S1==0)//再次判斷設溫按鍵是否按下
 454    {
 455      settemperatureflag=0;//設溫標志位變量置0,在溫度報警函數執行后但不報警的情況下,余留settemperatureflag==1,當再次操作設溫按鍵掃描函數設溫時,會發生在設溫過程中觸發設溫報警條件而報警,因此在設溫按鍵掃描函數里邊添加settemperatureflag=0,再次執行設溫按鍵掃描函數后,溫度報警函數里邊settemperatureflag==1被置換成settemperatureflag=0,很好地解決了再次操作設溫按鍵掃描函數設溫時,在設溫過程中觸發設溫報警條件而報警的問題。
 456      TR0flag=0;//定時器0標志位變量置0,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留TR0flag==1,假若時間報警函數里邊存在TR0=1,當操作設溫按鍵掃描函數時,計時依然在執行,導致計時不恰當,因此在設溫按鍵掃描函數里邊添加TR0flag=0,執行設溫按鍵掃描函數后,時間報警函數里邊TR0flag==1被置換成TR0flag=1,很好地解決了在操作設溫按鍵掃描函數時,計時依然在執行,導致計時不恰當的問題
 457      setsecondflag=0;//設時秒鍾標志位變量置0,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留setsecondflag==1,假若時間報警函數里邊存在TR0=1,當操作設溫按鍵掃描函數時,計時依然在執行,導致計時不恰當,因此在設溫按鍵掃描函數里邊添加setsecondflag=0,執行設溫按鍵掃描函數后,時間報警函數里邊setsecondflag==1被置換成setsecondflag=0,很好地解決了在操作設溫按鍵掃描函數時,計時依然在執行,導致計時不恰當的問題。
 458      setminutanflag=0;//設時分鍾標志位變量置0,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留setminutanflag==1,假若時間報警函數里邊存在TR0=1,當操作設溫按鍵掃描函數時,計時依然在執行,導致計時不恰當,因此在設溫按鍵掃描函數里邊添加setminutanflag=0,執行設溫按鍵掃描函數后,時間報警函數里邊setminutanflag==1被置換成setminutanflag=0,很好地解決了在操作設溫按鍵掃描函數時,計時依然在執行,導致計時不恰當的問題。
 459      sethourflag=0;//設時時鍾標志位變量置0,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留sethourflag==1,假若時間報警函數里邊存在TR0=1,當操作設溫按鍵掃描函數時,計時依然在執行,導致計時不恰當,因此在設溫按鍵掃描函數里邊添加sethourflag=0,執行設溫按鍵掃描函數后,時間報警函數里邊sethourflag==1被置換成sethourflag=0,很好地解決了在操作設溫按鍵掃描函數時,計時依然在執行,導致計時不恰當的問題。
 460      S1num++;//設溫按鍵按下次數變量加加
 461      while(!S1);//等待設溫按鍵彈起
 462      switch(S1num)//設溫按鍵按下次數變量選擇位
 463     {
 464       case 1://設溫按鍵第一次按下
 465              TR0=0;//關定時器0
 466              settimedisplayflag=1;//設時顯示標志位變量置1,在操作設溫按鍵掃描函數的情況下,不能操作設時按鍵掃描函數。
 467              tiaotimedisplayflag=1;//調時顯示標志位變量置1,在操作設溫按鍵掃描函數的情況下,不能操作調時按鍵掃描函數。
 468              lcd1602displaytimeflag=1;//液晶顯示器顯示時間標志位變量置1,在操作設溫按鍵掃描函數的情況下,不受時鍾兩位數分解函數和分鍾兩位數分解函數和秒鍾兩位數分解函數影響。
 469              temperaturedisplayflag=1;//溫度顯示標志位變量置1,在操作設溫按鍵掃描函數的情況下,不受溫度分解函數和溫度顯示函數影響。
 470              LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶顯示器第一行第13個(從第0開始數)位置的顯示位
 471              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 472              break;
 473       case 2://設溫按鍵第二次按下 
 474              LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶顯示器第一行第11個(從第0開始數)個位置的顯示位
 475              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 476              break;
 477       case 3://設溫按鍵第三次按下
 478              LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶顯示器第一行第10個(從第0開始數)位置的顯示位
 479              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 480              break;
 481       case 4://設溫按鍵第四次按下
 482              LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶顯示器第一行第9個(從第0開始數)位置的顯示位
 483              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 484              break;
 485       case 5://設溫按鍵第五次按下
 486              LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶顯示器第一行第8個(從第0開始數)位置的顯示位
 487              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 488              break;
 489       case 6://設溫按鍵第六次按下
 490              LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶顯示器第一行第13個(從第0開始數)位置的顯示位
 491              LCD1602WriteCommand(0x0c);//LCD1602字符型液晶顯示器關光標(或字符)閃爍。
 492              TR0=1;//開定時器0
 493              S1num=0;//設溫按鍵按下次數變量清零,可以反復操作設溫按鍵。
 494              settimedisplayflag=0;//設時顯示標志位變量置0,讓設溫按鍵掃描函數執行后,可允許設時按鍵掃描函數執行。
 495              tiaotimedisplayflag=0;//調時顯示標志位變量置0,讓設溫按鍵掃描函數執行后,可允許調時按鍵掃描函數執行。
 496              lcd1602displaytimeflag=0;//液晶顯示器顯示時間標志位變量置0,讓設溫按鍵掃描函數執行后,可允許時鍾兩位數分解函數和分鍾兩位數分解函數和秒鍾兩位數分解函數執行。
 497              temperaturedisplayflag=0;//溫度顯示標志位變量置0,讓設溫按鍵掃描函數執行后,可允許溫度分解函數和溫度顯示函數執行。
 498              settemperatureflag=1;//設溫標志位變量置1,為了在操作設溫按鍵掃描函數進行設溫后,可以執行溫度報警函數。
 499              break;
 500      default:
 501              S1num=0;//設溫按鍵按下次數變量清零,可以反復操作設溫按鍵。
 502              break;
 503                
 504      }
 505     }
 506    }
 507     if(S1num!=0)//判斷設溫按鍵按下次數變量是否不為0
 508   {
 509      if(S3==0)//判斷增加按鍵是否按下
 510     {
 511       Delay(5);//毫秒延時
 512       if(S3==0)//再次判斷增加按鍵是否按下
 513      {
 514        S3numflag=1;//增加鍵標志位變量置1,可以在溫度報警函數內進行設報警。
 515        while(!S3);//等待增加按鍵彈起
 516        switch(S1num)//設溫按鍵按下次數變量選擇位
 517       {
 518         case 1://設溫按鍵第一次按下
 519                setwenduxiaoshu++;//設溫小數位變量加加
 520                if(setwenduxiaoshu==10)//判斷設溫小數位變量是否達到10
 521                setwenduxiaoshu=0;//設溫小數位變量置零
 522                LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶顯示器第一行第13個(從第0個開始數)位置的顯示位
 523                LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符庫的數字0,整個代碼表示設溫小數位變量可顯示0到9的數字。
 524                LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶顯示器第一行第13個(從第0個開始數)位置的設溫小數位變量顯示位
 525                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//總設溫變量求和表達式
 526                break;
 527         case 2://設溫按鍵第二次按下
 528                setwenduge++;//設溫個位變量加加
 529                if(setwenduge==6)//判斷設溫個位變量是否達到6
 530                setwenduge=0;//設溫個位變量數置零
 531                LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶顯示器第一行第11個(從第0個開始數)位置的顯示位
 532                LCD1602WriteData(0x30+setwenduge);//0x30表示字符庫的數字0,整個代碼表示設溫個位可顯示0到9的數字。
 533                LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶顯示器第一行第11個(從第0個開始數)位置的顯示位
 534                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//總設溫變量求和表達式
 535                break;
 536            case 3://設溫按鍵第三次按下
 537                setwendushi++;//設溫十位變量加加
 538                if(setwendushi==3)//判斷設溫十位變量是否達到3
 539                setwendushi=0;//設溫十位變量置零
 540                LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶顯示器第一行第10個(從第0個開始數)位置的顯示位
 541                LCD1602WriteData(0x30+setwendushi);//0x30表示字符庫的數字0,整個代碼表示設溫十位變量可顯示0到9的數字。
 542                LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶顯示器第一行第10個(從第0個開始數)位置的顯示位
 543                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//總設溫變量求和表達式
 544                break;
 545         case 4://設溫按鍵第四次按下
 546                setwendubai++;//設溫百位變量加加
 547                if(setwendubai==2)//判斷設溫百位變量是否達到2
 548                setwendubai=0;//設溫百位變量置零
 549                LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶顯示器第一行第9個(從第0個開始數)位置的顯示位
 550                LCD1602WriteData(0x30+setwendubai);//0x30表示字符庫的數字0,整個代碼表示設溫百位變量可顯示0到9的數字。
 551                LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶顯示器第一行第9個(從第0個開始數)位置的顯示位
 552                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//總設溫變量求和表達式
 553                break;
 554            case 5://設溫按鍵第五次按下
 555                LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶顯示器第一行第8個(從第0個開始數)位置的顯示位
 556                LCD1602WriteData(0x2b);//0x2d表示字符庫的正符號
 557                LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶顯示器第一行第8個(從第0個開始數)個位置的顯示位
 558                break;
 559        }
 560       }
 561      }
 562     }
 563     if(S1num!=0)//判斷設溫按鍵按下次數變量是否不為0
 564   {
 565      if(S4==0)//判斷減少按鍵是否按下
 566     {
 567       Delay(5);//毫秒延時
 568       if(S4==0)//再次判斷減少按鍵是否按下
 569      {
 570        S4numflag=1;//減少鍵標志位變量置1,可以在溫度報警函數內進行設報警。
 571        while(!S4);//等待減少按鍵彈起
 572        switch(S1num)//設溫按鍵按下次數變量選擇位
 573       {
 574         case 1://設溫按鍵第一次按下
 575                setwenduxiaoshu--;//設溫小數位變量減減
 576                if(setwenduxiaoshu==-1)//判斷設溫小數位變量是否達到-1
 577                setwenduxiaoshu=9;//設溫小數位變量置9
 578                LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶顯示器第一行第13個(從第0個開始數)位置的顯示位
 579                LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符庫的數字0,整個代碼表示設溫小數位變量可顯示0到9的數字。
 580                LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶顯示器第一行第13個(從第0個開始數)位置的顯示位
 581                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//總設溫變量求和表達式
 582                break;
 583         case 2://設溫按鍵第二次按下
 584                setwenduge--;//設溫個位變量減減
 585                if(setwenduge==-1)//判斷設溫個位變量是否達到-1
 586                setwenduge=5;//設溫個位變量數置5
 587                LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶顯示器第一行第11個(從第0個開始數)位置的顯示位
 588                LCD1602WriteData(0x30+setwenduge);//0x30表示字符庫的數字0,整個代碼表示設溫個位變量可顯示0到9的數字。
 589                LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶顯示器第一行第11個(從第0個開始數)位置的顯示位
 590                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//總設溫變量求和表達式
 591                break;
 592            case 3://設溫按鍵第三次按下
 593                setwendushi--;//設溫十位變量減減
 594                if(setwendushi==-1)//判斷設溫十位變量是否達到-1
 595                setwendushi=2;//設溫十位變量置2
 596                LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶顯示器第一行第10個(從第0個開始數)位置的顯示位
 597                LCD1602WriteData(0x30+setwendushi);//0x30表示字符庫的數字0,整個代碼表示設溫十位變量可顯示0到9的數字。
 598                LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶顯示器第一行第10個(從第0個開始數)位置的顯示位
 599                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//總設溫變量求和表達式
 600                break;
 601         case 4://設溫按鍵第四次按下
 602                setwendubai--;//設溫百位變量減減
 603                if(setwendubai==-1)//判斷設溫百位變量是否達到-1
 604                setwendubai=1;//設溫百位變量置1
 605                LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶顯示器第一行第9個(從第0個開始數)位置的顯示位
 606                LCD1602WriteData(0x30+setwendubai);//0x30表示字符庫的數字0,整個代碼表示設溫百位變量可顯示0到9的數字。
 607                LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶顯示器第一行第9個(從第0個開始數)位置的顯示位
 608                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//總設溫變量求和表達式
 609                break;
 610            case 5://設溫按鍵第五次按下
 611                LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶顯示器第一行第8個(從第0個開始數)位置的顯示位
 612                LCD1602WriteData(0x2d);//0x2d表示字符庫的負符號
 613                LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶顯示器第一行第8個(從第0個開始數)個位置的顯示位
 614                break;
 615        }
 616       }
 617      }
 618     }
 619    } 
 620   void TiaoTimeKeyScan()//調時按鍵掃描函數
 621 {
 622    if(S2==0)//判斷調時按鍵是否按下                       
 623   {
 624     Delay(5);//毫秒延時
 625     if(S2==0)//再次判斷調時按鍵是否按下
 626    {    
 627      settemperatureflag=0;//設溫標志位變量置0,在溫度報警函數執行后但不報警的情況下,溫度報警函數里邊余留settemperatureflag==1和TR0=1,當操作調時按鍵掃描函數時,計時依然在執行,導致計時不恰當,因此在調時按鍵掃描函數里邊添加settemperatureflag=0和TR0=0,執行調時按鍵掃描函數后,溫度報警函數里邊settemperatureflag==1和TR0=1被置換成settemperatureflag=0和TR0=0,很好地解決了在操作調時按鍵掃描函數時,計時依然在執行,導致計時不恰當的問題。
 628      S2num++;//調時按鍵按下次數變量加加
 629      while(!S2);//等待調時按鍵彈起
 630      switch(S2num)//調時按鍵按下次數變量選擇位
 631     {
 632       case 1://調時按鍵第一次按下
 633              TR0=0;//關定時器0
 634              settimedisplayflag=1;//設時顯示標志位變量置1,在操作調時按鍵掃描函數的情況下,不能操作設時按鍵掃描函數。
 635              settemperaturedisplayflag=1;//設溫顯示標志位變量置1,在操作調時按鍵掃描函數的情況下,不能操作設溫按鍵掃描函數。
 636              lcd1602displaytimeflag=1;//液晶顯示器顯示時間標志位變量等於1,在操作調時按鍵掃描函數的情況下,不受時鍾兩位數分解函數和分鍾兩位數分解函數和秒鍾兩位數分解函數影響。
 637              temperaturedisplayflag=1;//溫度顯示標志位變量等於1,在操作調時按鍵掃描函數的情況下,不受溫度分解函數和溫度顯示函數影響。
 638              secondge=miao%10;//關掉定時器0定時后,把走時秒鍾變量取余賦給調時秒鍾個位變量。 
 639              secondshi=miao/10;//關掉定時器0定時后,把走時秒鍾變量取除賦給調時秒鍾十位變量。
 640              LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶顯示器第二行第7個(從第0個開始數)位置的顯示位
 641              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 642              break;
 643       case 2://調時按鍵第二次按下
 644              secondshi=secondshi;//關掉定時器0定時后,把走時秒鍾變量取除后得到的調時秒鍾十位變量再賦給調時秒鍾十位變量。
 645              LCD1602WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶顯示器第二行第6個(從第0個開始數)位置的顯示位
 646              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 647              break;
 648       case 3://調時按鍵第三次按下
 649              minutange=fen%10;//關掉定時器0定時后,把走時分鍾變量取余賦給調時分鍾個位變量。
 650              minutanshi=fen/10;//關掉定時器0定時后,把走時分鍾變量取除賦給調時分鍾十位變量。
 651              LCD1602WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶顯示器第二行第4個(從第0個開始數)位置的顯示位
 652              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 653              break;
 654       case 4://調時按鍵第四次按下
 655              minutanshi=minutanshi;//關掉定時器0定時后,把走時分鍾變量取除后得到調時分鍾十位變量再賦給調時分鍾十位變量。
 656              LCD1602WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶顯示器第二行第3個(從第0個開始數)位置的顯示位
 657              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 658              break;
 659       case 5://調時按鍵第五次按下
 660              hourge=shi%10;//關掉定時器0定時后,把走時時鍾變量取余賦給調時時鍾個位顯示位。
 661              hourshi=shi/10;//關掉定時器0定時后,把走時時鍾變量取除賦給調時時鍾十位顯示位。
 662              LCD1602WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶顯示器第二行第1個(從第0個開始數)位置的顯示位
 663              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 664              break;
 665       case 6://調時按鍵第六次按下
 666              hourshi=hourshi;//關掉定時器0定時后,把走時時鍾變量取除后得到調時時鍾十位變量再賦給調時時鍾十位變量。
 667              LCD1602WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶顯示器第二行第0個(從第0個開始數)位置的顯示位
 668              LCD1602WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
 669              break;
 670       case 7://調時按鍵第七次按下
 671              LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶顯示器第二行第7個位置的顯示位
 672              LCD1602WriteCommand(0x0c);//LCD1602字符型液晶顯示器關光標(或字符)閃爍。
 673              TR0=1;//開定時器0
 674              S2num=0;//調時按鍵按下次數變量清零,可以反復操作調時按鍵。
 675              settimedisplayflag=0;//設時顯示標志位變量置0,讓調時按鍵掃描函數執行后,可允許設時按鍵掃描函數執行。
 676              settemperaturedisplayflag=0;//設溫顯示標志位變量置0,讓調時按鍵掃描函數執行后,可允許設溫按鍵掃描函數執行。
 677              lcd1602displaytimeflag=0;//液晶顯示器顯示時間標志位變量等於0,讓調時按鍵掃描函數執行后,可允許時鍾兩位數分解函數和分鍾兩位數分解函數和秒鍾兩位數分解函數執行。
 678              temperaturedisplayflag=0;//溫度顯示標志位變量等於0,讓調時按鍵掃描函數執行后,可允許溫度分解函數和溫度顯示函數執行。
 679              miaoflag=0;//秒鍾標志位變量置0,在操作調時按鍵掃描函數進行調時后,調時按鍵掃描函數里邊余留miaoflag==1,不解除會導致時間報警函數不能啟動報警判別,因此在調時按鍵掃描函數里邊添加miaoflag=0,執行調時按鍵掃描函數后,時間報警函數就可以做出相應時間報警。
 680              fenflag=0;//分鍾標志位變量置0,在操作調時按鍵掃描函數進行調時后,調時按鍵掃描函數里邊余留fenflag==1,不解除會導致時間報警函數不能啟動報警判別,因此在調時按鍵掃描函數里邊添加fenflag=0,執行調時按鍵掃描函數后,時間報警函數就可以做出相應時間報警。
 681              shiflag=0;//時鍾標志位變量置0,在操作調時按鍵掃描函數進行調時后,調時按鍵掃描函數里邊余留shiflag==1,不解除會導致時間報警函數不能啟動報警判別,因此在調時按鍵掃描函數里邊添加shiflag=0,執行調時按鍵掃描函數后,時間報警函數就可以做出相應時間報警。
 682              break;
 683      default:
 684              S2num=0;//調時按鍵按下次數變量清零,可以反復操作調時按鍵。
 685              break;
 686      }
 687     }
 688    }
 689     if(S2num!=0)//判斷調時按鍵按下次數變量是否不為0
 690    {
 691      if(S3==0)//判斷增加按鍵是否按下
 692     {
 693       Delay(5);//毫秒延時
 694       if(S3==0)//再次判斷增加按鍵是否按下
 695      {
 696        while(!S3);//等待增加按鍵彈起
 697        switch(S2num)//調時按鍵按鍵按下次數變量選擇位
 698       {
 699         case 1://調時按鍵第一次按下
 700                miaoflag=1;//秒鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留miaoflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加miaoflag=1,時間報警函數里邊miaoflag==0被置換成miaoflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 701                secondge++;//調時秒鍾個位變量加加
 702                if(secondge==10)//判斷調時秒鍾個位變量是否達到10
 703                secondge=0;//調時秒鍾個位變量置零
 704                LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶顯示器第二行第7個(從第0個開始數)位置的調時秒鍾個位變量顯示位
 705                LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶顯示器第二行第7個(從第0個開始數)位置的調時秒鍾個位變量顯示位
 706                miao=secondshi*10+secondge;//走時秒鍾變量求和表達式,由於移位修改走時秒鍾個位變量數值后,需要通過調時秒鍾十位變量數值加上調時秒鍾個位變量數值之和賦給走時秒鍾變量,才能在修改走時秒鍾個位變量數值或走時秒鍾十位變量數值后重新計時。(原因:走時秒鍾個位變量數值或走時秒鍾十位變量數值是在走時秒鍾變量數值上分解得來,當走時秒鍾個位變量數值或走時秒鍾十位變量數值發生變化后,走時秒鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 707                break;
 708         case 2://調時按鍵第二次按下
 709                miaoflag=1;//秒鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留miaoflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加miaoflag=1,時間報警函數里邊miaoflag==0被置換成miaoflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 710                secondshi++;//調時秒鍾十位變量加加
 711                if(secondshi==6)//判斷調時秒鍾十位變量是否達到6
 712                secondshi=0;//調時秒鍾十位變量置零
 713                LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶顯示器第二行第6個(從第0個開始數)位置的調時秒鍾十位變量顯示位
 714                LCD1602WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶顯示器第二行第6個(從第0個開始數)位置的調時秒鍾十位變量顯示位
 715                miao=secondshi*10+secondge;//走時秒鍾變量求和表達式,由於移位修改走時秒鍾十位變量數值后,需要通過調時秒鍾十位變量數值加上秒鍾個位變量數值之和賦給走時秒鍾變量,才能在修改走時秒鍾個位變量數值或走時秒鍾十位變量數值后重新計時。(原因:走時秒鍾個位變量數值或走時秒鍾十位變量數值是在走時秒鍾變量數值上分解得來,當走時秒鍾個位變量數值或走時秒鍾十位變量數值發生變化后,走時秒鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 716                break;
 717         case 3://調時按鍵第三次按下
 718                fenflag=1;//分鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留fenflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加fenflag=1,時間報警函數里邊fenflag==0被置換成fenflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 719                minutange++;//調時分鍾個位變量加加
 720                if(minutange==10)//判斷調時分鍾個位變量是否達到10
 721                minutange=0;//調時分鍾個位變量置零
 722                LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶顯示器第二行第4個(從第0個開始數)位置的調時分鍾個位變量顯示位
 723                LCD1602WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶顯示器第二行第4個(從第0個開始數)位置的調時分鍾個位變量顯示位
 724                fen=minutanshi*10+minutange;//走時分鍾變量求和表達式,由於移位修改走時分鍾個位變量數值后,需要通過調時分鍾十位變量數值加上調時分鍾個位變量數值之和賦給走時分鍾變量,才能在修改走時分鍾個位變量數值或走時分鍾十位變量數值后重新計時。(原因:走時分鍾個位變量數值或走時分鍾十位變量數值是在走時分鍾變量數值上分解得來,當走時分鍾個位變量數值或走時分鍾十位變量數值發生變化后,走時分鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 725                break;
 726         case 4://調時按鍵第四次按下
 727                fenflag=1;//分鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留fenflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加fenflag-=1,時間報警函數里邊fenflag==0被置換成fenflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 728                minutanshi++;//調時分鍾十位變量加加
 729                if(minutanshi==6)//判斷調時分鍾十位變量是否達到6
 730                minutanshi=0;//調時分鍾十位變量置零
 731                LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶顯示器第二行第3個(從第0個開始數)位置的調時分鍾十位變量顯示位
 732                LCD1602WriteCommand(0x80+0x40+0x03);//寫入LCD1602字符型液晶顯示器第二行第3個(從第0個開始數)位置的調時分鍾十位變量顯示位
 733                fen=minutanshi*10+minutange;//走時分鍾變量求和表達式,由於移位修改走時分鍾十位變量數值后,需要通過調時分鍾十位變量數值加上調時分鍾個位變量數值之和賦給走時分鍾變量,才能在修改走時分鍾個位變量數值或走時分鍾十位變量數值后重新計時。(原因:走時分鍾個位變量數值或走時分鍾十位變量數值是在走時分鍾變量數值上分解得來,當走時分鍾個位變量數值或走時分鍾十位變量數值發生變化后,走時分鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 734                break;
 735         case 5://調時按鍵第五次按下
 736                shiflag=1;//時鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留shiflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加shiflag=1,時間報警函數里邊shiflag==0被置換成shiflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 737                hourge++;//調時時鍾個位變量加加
 738                if(hourge==4)//判斷調時時鍾個位變量是否達到4
 739                hourge=0;//調時時鍾個位變量置零
 740                LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶顯示器第二行第1個(從第0個開始數)位置的調時時鍾個位變量顯示位
 741                LCD1602WriteCommand(0x80+0x40+0x01);//寫入LCD1602字符型液晶顯示器第二行第1個(從第0個開始數)位置的調時時鍾個位變量顯示位
 742                shi=hourshi*10+hourge;//走時時鍾變量求和表達式,由於移位修改走時時鍾個位變量數值后,需要通過調時時鍾十位變量數值加上調時時鍾個位變量數值之和賦給走時時鍾變量,才能在修改走時時鍾個位變量數值或走時時鍾十位變量數值后重新計時。(原因:走時時鍾個位變量數值或走時時鍾十位變量數值是在走時時鍾變量數值上分解得來,當走時時鍾個位變量數值或走時時鍾十位變量數值發生變化后,走時時鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 743                break;
 744         case 6://調時按鍵第六次按下
 745                shiflag=1;//時鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留shiflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加shiflag=1,時間報警函數里邊shiflag==0被置換成shiflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 746                hourshi++;//調時時鍾十位變量加加
 747                if(hourshi==3)//判斷調時時鍾十位變量是否達到3
 748                hourshi=0;//調時時鍾十位變量置零
 749                LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶顯示器第二行第0個(從第0個開始數)位置的調時時鍾十位變量顯示位
 750                LCD1602WriteCommand(0x80+0x40+0x00);//LCD1602第二行第0個(從第0個開始數)位置的調時時鍾十位變量顯示位
 751                shi=hourshi*10+hourge;//走時時鍾變量求和表達式,由於移位修改走時時鍾十位變量數值后,需要通過調時時鍾十位變量數值加上調時時鍾個位變量數值之和賦給走時時鍾變量,才能在修改走時時鍾個位變量數值或走時時鍾十位變量數值后重新計時。(原因:走時時鍾個位變量數值或走時時鍾十位變量數值是在走時時鍾變量數值上分解得來,當走時時鍾個位變量數值或走時時鍾十位變量數值發生變化后,走時時鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 752                break;
 753        default:
 754                S2num=0;//調時按鍵按下次數變量清零,可以反復操作調時按鍵。
 755                break; 
 756        }
 757       }
 758      }
 759     }
 760     if(S2num!=0)//判斷調時按鍵按下次數變量是否不為0
 761   {     
 762      if(S4==0)//判斷減少按鍵是否按下
 763    {
 764       Delay(5);//毫秒延時
 765       if(S4==0)//再次判斷減少按鍵是否按下
 766      {
 767        while(!S4);//等待減少按鍵彈起
 768        switch(S2num)//調時按鍵按下次數變量選擇位
 769       {
 770         case 1://調時按鍵按鍵第一次按下
 771                miaoflag=1;//秒鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留miaoflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加miaoflag=1,時間報警函數里邊miaoflag==0被置換成miaoflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 772                secondge--;//調時秒鍾變量數值減減
 773                if(secondge==-1)//判斷調時秒鍾個位變量是否達到-1
 774                secondge=9;//調時秒鍾個位變量置9
 775                LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶顯示器第二行第7個(從第0個開始數)位置的調時秒鍾個位變量顯示位
 776                LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶顯示器第二行第7個(從第0個開始數)位置的調時秒鍾個位變量顯示位
 777                miao=secondshi*10+secondge;//走時秒鍾變量求和表達式,由於移位修改走時秒鍾個位變量數值后,需要通過調時秒鍾十位變量數值加上調時秒鍾個位變量數值之和賦給走時秒鍾變量,才能在修改走時秒鍾個位變量數值或走時秒鍾十位變量數值后重新計時。(原因:走時秒鍾個位變量數值或走時秒鍾十位變量數值是在走時秒鍾變量數值上分解得來,當走時秒鍾個位變量數值或走時秒鍾十位變量數值發生變化后,走時秒鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 778                break;
 779         case 2://調時按鍵按鍵第二次按下
 780                miaoflag=1;//秒鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留miaoflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加miaoflag=1,時間報警函數里邊miaoflag==0被置換成miaoflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 781                secondshi--;//調時秒鍾十位變量減減
 782                if(secondshi==-1)//判斷調時秒鍾十位變量是否達到-1
 783                secondshi=5;//調時秒鍾十位變量置5
 784                LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶顯示器第二行第6個(從第0個開始數)位置的調時秒鍾十位變量顯示位
 785                LCD1602WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶顯示器第二行第6個(從第0個開始數)位置的調時秒鍾十位變量顯示位
 786                miao=secondshi*10+secondge;//走時秒鍾變量求和表達式,由於移位修改走時秒鍾十位變量數值后,需要通過調時秒鍾十位變量數值加上調時秒鍾個位變量數值之和賦給走時秒鍾變量,才能在修改走時秒鍾個位變量數值或走時秒鍾十位變量數值后重新計時。(原因:走時秒鍾個位變量數值或走時秒鍾十位變量數值是在走時秒鍾變量數值上分解得來,當走時秒鍾個位變量數值或走時秒鍾十位變量數值發生變化后,走時秒鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 787                break;
 788         case 3://調時按鍵按鍵第三次按下
 789                fenflag=1;//分鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留fenflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加fenflag=1,時間報警函數里邊fenflag==0被置換成fenflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 790                minutange--;//調時分鍾個位變量減減
 791                if(minutange==-1)//判斷調時分鍾個位變量是否達到-1
 792                minutange=9;//調時分鍾個位變量置9
 793                LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶顯示器第二行第4個(從第0個開始數)位置的調時分鍾個位變量顯示位
 794                LCD1602WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶顯示器第二行第4個(從第0個開始數)位置的調時分鍾個位變量顯示位
 795                fen=minutanshi*10+minutange;//走時秒鍾變量求和表達式,由於移位修改走時分鍾個位變量數值后,需要通過調時分鍾十位變量數值加上調時分鍾個位變量數值之和賦給走時分鍾變量,才能在修改走時分鍾個位變量數值或走時分鍾十位變量數值后重新計時。(原因:走時分鍾個位變量數值或走時分鍾十位變量數值是在走時分鍾變量數值上分解得來,當走時分鍾個位變量數值或走時分鍾十位變量數值發生變化后,走時分鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 796                break;
 797         case 4://調時按鍵按鍵第四次按下
 798                fenflag=1;//分鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留fenflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加fenflag=1,時間報警函數里邊fenflag==0被置換成fenflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 799                minutanshi--;//走時分鍾十位變量減減
 800                if(minutanshi==-1)//判斷走時分鍾十位變量是否達到6
 801                minutanshi=5;//走時分鍾十位變量歸5
 802                LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶顯示器第二行第3個(從第0個開始數)位置的調時分鍾個位變量顯示位
 803                LCD1602WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶顯示器第二行第3個(從第0個開始數)位置的調時分鍾十位變量顯示位
 804                fen=minutanshi*10+minutange;//走時秒鍾變量求和表達式,由於移位修改走時分鍾十位變量數值后,需要通過調時分鍾十位變量數值加上分鍾個位變量數值之和賦給走時分鍾變量,才能在修改走時分鍾個位變量數值或走時分鍾十位變量數值后重新計時。(原因:走時分鍾個位變量數值或走時分鍾十位變量數值是在走時分鍾變量數值上分解得來,當走時分鍾個位變量數值或走時分鍾十位變量數值發生變化后,走時分鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 805                break;
 806         case 5://調時按鍵按鍵第五次按下
 807                shiflag=1;//時鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留shiflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加shiflag=1,時間報警函數里邊shiflag==0被置換成shiflag=1,很好地解決了在操作調時按鍵掃描函數調時時,在調時過程中觸發時間報警條件而報警的問題。
 808                hourge--;//調時時鍾個位變量減減
 809                if(hourge==-1)//判斷調時時鍾個位變量是否達到-1
 810                hourge=3;//調時時鍾個位變量置3
 811                LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶顯示器第二行第1個(從第0個開始數)位置的調時時鍾個位變量數值
 812                LCD1602WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶顯示器第二行第1個(從第0個開始數)位置的調時時鍾個位變量顯示位
 813                shi=hourshi*10+hourge;//走時秒鍾變量求和表達式,由於移位修改走時時鍾個位變量數值后,需要通過調時時鍾十位變量數值加上調時時鍾個位變量數值之和賦給走時時鍾變量,才能在修改走時時鍾個位變量數值或走時時鍾十位變量數值后重新計時。(原因:走時時鍾個位變量數值或走時時鍾十位變量數值是在走時時鍾變量數值上分解得來,當走時時鍾個位變量數值或走時時鍾十位變量數值發生變化后,走時時鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 814                break;
 815         case 6://調時按鍵按鍵第六次按下
 816                shiflag=1;//時鍾標志位變量置1,在時間報警函數執行后但不報警的情況下,時間報警函數里邊余留shiflag==0,當操作調時按鍵掃描函數調時時,會發生在調時過程中觸發時間報警條件而報警,因此在調時按鍵掃描函數里邊添加shiflag=1,時間報警函數里邊shiflag==0被置換成shiflag=1,很好地解決了在操作調時按鍵掃描函數調時時,因觸發時間報警條件而報警的問題。
 817                hourshi--;//調時時鍾十位變量減減
 818                if(hourshi==-1)//判斷調時時鍾十位變量是否達到-1
 819                hourshi=2;//調時時鍾十位變量置2
 820                LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶顯示器顯示第二行第0個(從第0個開始數)位置的調時時鍾十位變量顯示位
 821                LCD1602WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶顯示器顯示第二行第0個(從第0個開始數)位置的調時時鍾十位變量顯示位
 822                shi=hourshi*10+hourge;//走時秒鍾變量求和表達式,由於移位修改走時時鍾十位變量數值后,需要通過調時時鍾十位變量數值加上調時時鍾個位變量數值之和賦給走時時鍾變量,才能在修改走時時鍾個位變量數值或走時時鍾十位變量數值后重新計時。(原因:走時時鍾個位變量數值或走時時鍾十位變量數值是在走時時鍾變量數值上分解得來,當走時時鍾個位變量數值或走時時鍾十位變量數值發生變化后,走時時鍾變量數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
 823                break;
 824        default:
 825                S2num=0;//調時按鍵按下次數變量清零,可以反復操作調時按鍵。
 826                break; 
 827        }
 828       }
 829      }
 830     }
 831    }
 832   void Timer0Init()//定時器0初始化函數
 833 {
 834    TMOD=0x01;//設定定時器類型為定時器0,工作模式為模式1。
 835    TH0=(65536-50000)/256;//TH0裝初值
 836    TL0=(65536-50000)%256;//TL0裝初值
 837    EA=1;//開啟定時器總中斷
 838    ET0=1;//開啟定時器0中斷開關
 839    TR0=0;//啟動定時器0
 840  }
 841   void Timer0() interrupt 1//定時器0中斷函數
 842 {
 843    TH0=(65536-50000)/256;//TH0重新裝值
 844    TL0=(65536-50000)%256;//TL0重新裝值
 845    count++;//定時器0中斷次數變量加加
 846    if(count==18)//判斷定時器0中斷次數變量是否為18次
 847   {
 848     count=0;//定時器0中斷次數變量歸零
 849     miao++;//走時秒鍾變量加加
 850     if(miao==60)//判斷走時秒鍾變量是否達到60秒
 851    {
 852      miao=0;//走時秒鍾變量置零
 853      fen++;//走時分鍾變量加加
 854      if(fen==60)//判斷走時分鍾變量是否達到60分
 855     {
 856       fen=0;//走時分鍾變量置零
 857       shi++;//走時時鍾變量加加
 858       if(shi==24)//判斷走時時鍾變量是否達到24時
 859      {
 860        shi=0;//走時時鍾變量置零
 861       }
 862 //      LCD1602DisplayTimeFenJie(0x00,shi);//LCD1602液晶顯示器顯示時間兩位數分解函數顯示時鍾兩位數
 863      }
 864 //      LCD1602DisplayTimeFenJie(0x03,fen);//LCD1602液晶顯示器顯示時間兩位數分解函數顯示分鍾兩位數
 865      }
 866 //     LCD1602DisplayTimeFenJie(0x06,miao);//LCD1602液晶顯示器顯示時間兩位數分解函數顯示秒鍾兩位數         
 867     }    
 868    }
 869   void FengNingQi_Alarm(uint t)//蜂鳴器報警函數
 870 {
 871    uint x,y;
 872    for(x=0;x<t;x++)
 873   {
 874     for(y=0;y<50;y++);
 875     FengNingQi=~FengNingQi ;//蜂鳴器按位取反FengNingQi
 876    }
 877  }
 878 //  void SetAlarmTemperatrueFenJie(uint alarmwendu)
 879 //{
 880 //   fuhaowei=0x20;//無符號
 881 //   alarmwendubai=alarmwendu/1000;//溫度值百位
 882 //   alarmwendushi=alarmwendu%1000/100;//溫度值十位
 883 //   alarmwenduge=alarmwendu%100/10;//溫度值個位
 884 //   alarmxiaoshu=alarmwendu%10;//小數位
 885 //  }         
 886   void TimeBaoJing()//時間報警函數
 887 {
 888    if(S3numflag==1||S4numflag==1)//判斷增加鍵標志位變量是否為1或減少鍵標志位變量是否為1
 889   {  
 890     if(setsecondflag==1&&setminutanflag==0&&sethourflag==0&&setsecond>0&&TR0flag==1&&miaoflag==0)//判斷設時秒鍾標志位變量是否為1和設時分鍾標志位變量是否為0和設時時鍾標志位變量是否為0和設時秒鍾變量是否大於0和定時器0標志位變量是否等於1和秒鍾標志位變量置是否為0
 891    {
 892      if(miao==setsecond)//判斷走時秒鍾變量是否等於設時秒鍾變量
 893     { 
 894       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
 895       TR0=0;//關定時器0
 896      }
 897     }
 898     if(setminutanflag==1&&setsecondflag==0&&sethourflag==0&&setminutan>0&&TR0flag==1&&fenflag==0)//判斷設時分鍾標志位變量是否為1和設時秒鍾標志位變量是否為0和設時時鍾標志位變量是否為0和設時分鍾變量是否大於0和定時器0標志位變量是否等於1和分鍾標志位變量置是否為0
 899    {
 900         if(fen==setminutan)//判斷走時分鍾是否等於設時分鍾變量
 901     {
 902       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
 903       TR0=0;//關定時器0
 904      }
 905     }
 906     if(sethourflag==1&&setsecondflag==0&&setminutanflag==0&&sethour>0&&TR0flag==1&&shiflag==0)//判斷設時時鍾標志位變量是否為1和設時秒鍾標志位變量是否為0和設時分鍾標志位變量是否為0設時時鍾變量是否大於0和定時器0標志位變量是否等於1和時鍾標志位變量置是否為0
 907    {
 908         if(shi==sethour)//判斷走時時鍾是否等於設時時鍾變量
 909     {
 910       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
 911       TR0=0;//關定時器0
 912      }
 913     }
 914     if(setsecondflag==1&&setminutanflag==1&&setsecond>0&&setminutan>0&&TR0flag==1&&miaoflag==0&&fenflag==0)//判斷設時秒鍾標志位變量是否為1和設時分鍾標志位變量是否為1和設時秒鍾變量是否大於0和設時分鍾變量是否大於0和定時器0標志位變量是否等於1和秒鍾標志位變量置是否為0和分鍾標志位變量是否為0
 915    {
 916      if(miao==setsecond&&fen==setminutan)//判斷走時秒鍾變量是否等於設時秒鍾變量和走時分鍾變量是否等於設時分鍾變量
 917     { 
 918       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
 919       TR0=0;//關定時器0
 920      }
 921     }
 922     if(setsecondflag==1&&sethourflag==1&&setsecond>0&&sethour>0&&TR0flag==1&&miaoflag==0&&shiflag==0)//判斷設時秒鍾標志位變量是否為1和設時時鍾標志位變量是否為1和設時秒鍾變量是否大於0和設時時鍾變量是否大於0和定時器0標志位變量是否等於1和秒鍾標志位變量是否為0和時鍾標志位變量是否為0
 923    {
 924      if(miao==setsecond&&shi==sethour)//判斷走時秒鍾變量是否等於設時秒鍾變量和走時時鍾變量是否等於設時時鍾變量
 925     { 
 926       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
 927       TR0=0;//關定時器0
 928      }
 929     }
 930     if(setminutanflag==1&&sethourflag==1&&setminutan>0&&sethour>0&&TR0flag==1&&fenflag==0&&shiflag==0)//判斷設時分鍾標志位變量是否為1和設時時鍾標志位變量是否為1和設時分鍾變量是否大於0和設時時鍾變量是否大於0和定時器0標志位變量是否等於1和分鍾標志位變量是否為0和時鍾標志位變量是否為0
 931    {
 932      if(fen==setminutan&&shi==sethour)//判斷走時分鍾變量是否等於設時分鍾變量和走時時鍾變量是否等於設時時鍾變量
 933     { 
 934       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
 935       TR0=0;//關定時器0
 936      }
 937     }
 938     if(setsecondflag==1&&setminutanflag==1&&sethourflag==1&&setsecond>0&&setminutan>0&&sethour>0&&TR0flag==1&&miaoflag==0&&fenflag==0&&shiflag==0)//判斷設時秒鍾標志位變量是否為1和設時分鍾標志位變量是否為1和設時時鍾標志位變量是否為1和設時秒鍾變量是否大於0和設時分鍾變量是否大於0和設時時鍾變量是否大於0和定時器0標志位變量是否等於1和秒鍾標志位變量是否為0和分鍾標志位變量是否為0和時鍾標志位變量是否為0
 939    {
 940      if(miao==setsecond&&fen==setminutan&&shi==sethour)//判斷走時秒鍾變量是否等於設時秒鍾變量和走時分鍾變量是否等於設時分鍾變量和走時時鍾變量是否等於設時時鍾變量
 941     { 
 942       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
 943       TR0=0;//關定時器0
 944      }
 945     }
 946    }
 947   }
 948   void TemperatrueBaoJing()//溫度報警函數
 949 {
 950    if(S3numflag==1||S4numflag==1)//判斷增加鍵標志位變量是否為1或減少鍵標志位變量是否為1
 951   {  
 952     if(settemperatureflag==1)//判斷設溫標志位變量是否為1
 953    {
 954      if(wendu-10>settemperature)//判斷溫度變量減10后是否大於設溫變量,其中的10分別表示設溫個位數1與設溫小數位0,實際上表示1攝氏度,相當於溫差報警溫度,這么做的原因是因為設溫數值和溫度數值都帶有小數,通過數值取整運算,把設溫數值和溫度數值換算成整數來計算溫差,這樣便於處理設溫數值與溫度數值的溫差值。
 955     { 
 956       temperatruebaojingflag=1;//溫度報警標志位變量置1,進行溫度報警。
 957       TR0=0;//關定時器0
 958      }
 959     }
 960      if(wendu<10&&settemperatureflag==1)//判斷溫度變量是否小於10和設溫標志位變量是否為1,其中的10分別表示設溫個位數1與設溫小數位0,實際上表示1攝氏度,相當於溫差報警溫度,這么做的原因是因為設溫數值和溫度數值都帶有小數,通過數值取整運算,把設溫數值和溫度數值換算成整數來計算溫差,這樣便於處理設溫數值與溫度數值的溫差值。
 961     {
 962       temperatruebaojingflag=0;//溫度報警標志位變量置0,不進行溫度報警。
 963       TR0=1;//開定時器0
 964      }    
 965    }
 966   }
 967   void SumKeyScan()//總按鍵掃描函數
 968 {
 969    if(S==0)//判斷啟停按鍵是否按下
 970   {
 971     Delay(5);//毫秒延時
 972     if(S==0)//再次判斷啟停按鍵是否按下
 973    {
 974      Snum++;//啟停按鍵按下次數變量加加
 975      while(!S);//等待啟停按鍵彈起
 976      if(Snum==1)//判斷啟停按鍵是否第一次按下過
 977     {
 978       qitingflag=1;//啟停標志位變量置1,用來啟動時間報警函數和溫度報警函數和設時按鍵掃描函數和設溫按鍵掃描函數和調時按鍵掃描函數和LCD1602液晶顯示器顯示時間兩位數分解函數顯示秒鍾兩位數和LCD1602液晶顯示器顯示時間兩位數分解函數顯示分鍾兩位數和LCD1602液晶顯示器顯示時間兩位數分解函數顯示時鍾兩位數和溫度分解函數和溫度顯示函數,相當於總開關。
 979       TR0=1;//啟動定時器0
 980      }
 981      if(Snum==2&&settimedisplayflag==0&&settemperaturedisplayflag==0&&tiaotimedisplayflag==0&&timebaojingflag==0)//判斷啟停按鍵S是否第二次按下過及設時顯示標志位變量是否為0和設溫顯示標志位變量是否為0和調時顯示標志位變量是否為0和時間報警標志位變量是否為0,相當於第一次按下啟停鍵啟動后,在沒有按其他按鍵的情況下,第二次按下啟停鍵就停止。
 982     {
 983       qitingflag=1;//啟停標志位變量置1,用來啟動時間報警函數和溫度報警函數和設時按鍵掃描函數和設溫按鍵掃描函數和調時按鍵掃描函數和LCD1602液晶顯示器顯示時間兩位數分解函數顯示秒鍾兩位數和LCD1602液晶顯示器顯示時間兩位數分解函數顯示分鍾兩位數和LCD1602液晶顯示器顯示時間兩位數分解函數顯示時鍾兩位數和溫度分解函數和溫度顯示函數,相當於總開關。
 984       TR0=0;//關定時器0
 985       Snum=0;//啟停按鍵按下次數變量清零,可以反復操作啟停按鍵。
 986       settimedisplayflag=1;//設時顯示標志位變量置1,限制操作設時按鍵掃描函數。
 987       settemperaturedisplayflag=1;//設溫顯示標志位變量置1,限制操作設溫按鍵掃描函數。
 988       tiaotimedisplayflag=1;//調時顯示標志位變量置1,限制操作調時按鍵掃描函數。
 989      }
 990      if(Snum==1&&settimedisplayflag==1&&settemperaturedisplayflag==1&&tiaotimedisplayflag==1)//判斷啟停按鍵是否第一次按下過以及設時顯示標志位變量為1及設溫顯示標志位變量是否為1和調時顯示標志位變量是否為1,相當於第一次按下啟停鍵啟動后,第二次按下啟停鍵停止后,在沒有按其他按鍵的情況下,第三次按下啟停鍵就啟動。
 991     {
 992       qitingflag=1;//啟停標志位變量置1,用來啟動時間報警函數和溫度報警函數和設時按鍵掃描函數和設溫按鍵掃描函數和調時按鍵掃描函數和LCD1602液晶顯示器顯示時間兩位數分解函數顯示秒鍾兩位數和LCD1602液晶顯示器顯示時間兩位數分解函數顯示分鍾兩位數和LCD1602液晶顯示器顯示時間兩位數分解函數顯示時鍾兩位數和溫度分解函數和溫度顯示函數,相當於總開關。
 993       TR0=1;//啟動定時器0
 994       Snum=1;//啟停按鍵按下次數變量置1,為下一次按下啟停鍵實現停止做准備。
 995       settimedisplayflag=0;//設時顯示標志位變量置0,可操作設時按鍵掃描函數。
 996       settemperaturedisplayflag=0;//設溫顯示標志位變量置0,可操作設溫按鍵掃描函數。
 997       tiaotimedisplayflag=0;//調時顯示標志位變量置0,可操作調時按鍵掃描函數。 
 998      }
 999      if(Snum==2&&timebaojingflag==1)//判斷啟停按鍵是否第二次按下過及時間報警標志位變量是否為1,相當於時間報警解除。
1000     {
1001       TR0=1;//開定時器0
1002       Snum=1;//啟停按鍵按下次數變量置1,為下一次按下啟停鍵實現停止做准備。
1003       timebaojingflag=0;//時間報警標志位變量置0,釋放時間報警標志位。
1004       setsecondge=0;//設時秒鍾個位變量置0,釋放設時秒鍾個位標志位。
1005       setsecondshi=0;//設時秒鍾十位變量置0,釋放設時秒鍾十位標志位。
1006       setminutange=0;//設時分鍾個位變量置0,釋放設時分鍾個位標志位。
1007       setminutanshi=0;//設時分鍾十位變量置0,釋放設時分鍾十位標志位。
1008       sethourge=0;//設時時鍾個位變量置0,釋放設時時鍾個位標志位。
1009       sethourshi=0;//設時時鍾十位變量置0,釋放設時時鍾十位標志位。
1010       LCD1602WriteCommand(0x80+0x07);//LCD1602字符型液晶顯示器第一行第7個(從第0開始數)顯示位,即設時秒鍾個位。
1011       LCD1602WriteData(0x30+setsecondge);//0x30表示字符庫的數字0,整個代碼表示設時秒鍾個位變量顯示0到9的數字。
1012       LCD1602WriteCommand(0x80+0x06);//LCD1602字符型液晶顯示器第一行第6個(從第0開始數)顯示位,即設時秒鍾十位。
1013       LCD1602WriteData(0x30+setsecondshi);//0x30表示字符庫的數字0,整個代碼表示設時秒鍾十位變量顯示0到9的數字。
1014       LCD1602WriteCommand(0x80+0x04);//LCD1602字符型液晶顯示器第一行第4個(從第0開始數)顯示位,即設時分鍾個位。
1015       LCD1602WriteData(0x30+setminutange);//0x30表示字符庫的數字0,整個代碼表示設時分鍾個位變量顯示0到9的數字。
1016       LCD1602WriteCommand(0x80+0x03);//LCD1602字符型液晶顯示器第一行第3個(從第0開始數)顯示位,即設時分鍾十位。
1017       LCD1602WriteData(0x30+setminutanshi);//0x30表示字符庫的數字0,整個代碼表示設時分鍾十位變量顯示0到9的數字。
1018       LCD1602WriteCommand(0x80+0x01);//LCD1602字符型液晶顯示器第一行第1個(從第0開始數)顯示位,即設時時鍾個位。
1019       LCD1602WriteData(0x30+sethourge);//0x30表示字符庫的數字0,整個代碼表示設時時鍾個位變量顯示0到9的數字。
1020       LCD1602WriteCommand(0x80+0x00);//LCD1602字符型液晶顯示器第一行第0個(從第0開始數)顯示位,即設時時鍾十位。
1021       LCD1602WriteData(0x30+sethourshi);//0x30表示字符庫的數字0,整個代碼表示設時時鍾十位變量顯示0到9的數字。
1022       S3numflag=0;//增加鍵標志位變量置0,釋放增加鍵標志位。
1023       S4numflag=0;//減少鍵標志位變量置0,釋放減少鍵標志位。
1024       TR0flag=0;//定時器0標志位變量置0
1025       settimedisplayflag=0;//設時顯示標志位變量置0,釋放設時顯示標志位。
1026       settemperaturedisplayflag=0;//設溫顯示標志位變量置0,釋放設溫顯示標志位。
1027       tiaotimedisplayflag=0;//調時顯示標志位變量置0,釋放調時顯示標志位。
1028       setsecondflag=0;//設時秒鍾標志位變量置0,釋放設時秒鍾標志位。
1029       setminutanflag=0;//設時分鍾標志位變量置0,釋放設時分鍾標志位。
1030       sethourflag=0;//設時時鍾標志位變量置0,釋放設時時鍾標志位。
1031      }
1032      
1033      if(Snum==2&&temperatruebaojingflag==1)//判斷啟停按鍵是否第二次按下過及溫度報警標志位變量是否為1,相當於溫度報警解除。
1034     { 
1035       TR0=1;//開定時器0
1036       Snum=1;//啟停按鍵按下次數變量置1,為下一次按下啟停鍵實現停止做准備。
1037       temperatruebaojingflag=0;//溫度報警標志位變量置0,釋放溫度報警標志位。
1038       setwenduxiaoshu=0;//設溫小數位變量置0,釋放設溫小數位標志位。
1039       setwenduge=0;//設溫個位變量置0,釋放設溫個位標志位。
1040       setwendushi=0;//設溫十位變量置0,釋放設溫十位標志位。
1041       setwendubai=0;//設溫百位變量置0,釋放設溫百位標志位。
1042       LCD1602WriteCommand(0x80+0x09);//LCD1602字符型液晶顯示器第一行第9個(從第0開始數)顯示位,即設溫度百位。
1043       LCD1602WriteData(0x30+setwendubai);//0x30表示字符庫的數字0,整個代碼表示設溫百位變量顯示0到9的數字。
1044       LCD1602WriteCommand(0x80+0x0a);//LCD1602字符型液晶顯示器第一行第10個(從第0開始數)顯示位,即設溫度十位。
1045       LCD1602WriteData(0x30+setwendushi);//0x30表示字符庫的數字0,整個代碼表示設溫十位變量顯示0到9的數字。
1046       LCD1602WriteCommand(0x80+0x0b);//LCD1602字符型液晶顯示器第一行第11個(從第0開始數)顯示位,即設溫度個位。
1047       LCD1602WriteData(0x30+setwenduge);//0x30表示字符庫的數字0,整個代碼表示設溫個位變量顯示0到9的數字。
1048       LCD1602WriteCommand(0x80+0x0d);//LCD1602字符型液晶顯示器第一行第12個(從第0開始數)顯示位,即設溫度小數位。
1049       LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符庫的數字0,整個代碼表示設溫小數位變量顯示0到9的數字。
1050       S3numflag=0;//增加鍵標志位變量置0,釋放增加鍵標志位。
1051       S4numflag=0;//減少鍵標志位變量置0,釋放減少鍵標志位。
1052       settemperatureflag=0;//設溫標志位變量置0,釋放設溫標志位。
1053       settimedisplayflag=0;//設時顯示標志位變量置0,釋放設時顯示標志位。
1054       settemperaturedisplayflag=0;//設溫顯示標志位變量置0,釋放設溫顯示標志位。
1055       tiaotimedisplayflag=0;//調時顯示標志位變量置0,釋放調時顯示標志位。
1056       temperaturedisplayflag=0;//溫度顯示標志位變量等於0,釋放溫度顯示標志位。  
1057      }
1058      if(Snum>=2&&settemperaturedisplayflag==1&&tiaotimedisplayflag==1)//判斷啟停按鍵是否第二或二以上次按下過及設溫顯示標志位變量為1及調時顯示標志位變量為1,相當於設時啟動。
1059     {
1060       Snum=1;//啟停按鍵按下次數變量置1,為下一次按下啟停鍵實現停止做准備。
1061       S0num=0;//設時按鍵按下次數變量清零,可以反復操作設時按鍵。
1062       TR0=1;//啟動定時器0
1063       TR0flag=1;//定時器0標志位變量置1,進入時間報警函數判斷是否可執行時間報警。
1064       LCD1602WriteCommand(0x0c);//關LCD1602液晶顯示器光標(或字符)閃爍
1065       settemperaturedisplayflag=0;//設溫顯示標志位變量置0,釋放設溫顯示標志位。
1066       tiaotimedisplayflag=0;//調時顯示標志位變量置0,釋放調時顯示標志位。
1067       lcd1602displaytimeflag=0;//LCD1602液晶顯示器顯示時間標志位變量置0,釋放LCD1602液晶顯示器顯示時間標志位。
1068       temperaturedisplayflag=0;//溫度顯示標志位變量置0,釋放溫度顯示標志位。
1069      }
1070      if(Snum>=2&&settimedisplayflag==1&&tiaotimedisplayflag==1)//判斷啟停按鍵是否第二或二以上次按下過及設時顯示標志位變量為1及調時顯示標志位變量為1,相當於設溫啟動。
1071     {
1072       Snum=1;//啟停按鍵按下次數變量置1,為下一次按下啟停鍵實現停止做准備。
1073       S1num=0;//設溫按鍵按下次數變量清零,可以反復操作設溫按鍵。
1074       TR0=1;//啟動定時器0
1075       LCD1602WriteCommand(0x0c);//關LCD1602液晶顯示器光標(或字符)閃爍
1076       settemperatureflag=1;//設溫標志位變量置1,進入溫度報警函數判斷是否可執行溫度報警。
1077       settimedisplayflag=0;//設時顯示標志位變量置0,釋放設時顯示標志位。
1078       tiaotimedisplayflag=0;//調時顯示標志位變量置0,釋放調時顯示標志位。
1079       lcd1602displaytimeflag=0;//LCD1602液晶顯示器顯示時間標志位變量等於0,釋放LCD1602液晶顯示器顯示時間標志位。
1080       temperaturedisplayflag=0;//溫度顯示標志位變量置0,釋放溫度顯示標志位。
1081      }
1082      if(Snum>=2&&settimedisplayflag==1&&settemperaturedisplayflag==1)//判斷啟停按鍵是否第二或二以上次按下過及設時顯示標志位變量為1和設溫顯示標志位變量為1,相當於調時啟動。
1083     {
1084       Snum=1;//啟停按鍵按下次數變量置1,為下一次按下啟停鍵實現停止做准備。
1085       S2num=0;//調時按鍵按下次數變量清零,可以反復操作調時按鍵。
1086       TR0=1;//啟動定時器0
1087       LCD1602WriteCommand(0x0c);//關LCD1602液晶顯示器光標(或字符)閃爍 
1088       settimedisplayflag=0;//設時顯示標志位變量置0,釋放設時顯示標志位。
1089       settemperaturedisplayflag=0;//設溫顯示標志位變量置0,釋放設溫顯示標志位。
1090       lcd1602displaytimeflag=0;//LCD1602液晶顯示器顯示時間標志位變量置0,釋放LCD1602液晶顯示器顯示時間標志位。
1091       temperaturedisplayflag=0;//溫度顯示標志位變量置0,釋放溫度顯示標志位。
1092       miaoflag=0;//秒鍾標志位變量置0,釋放秒鍾標志位。
1093       fenflag=0;//分鍾標志位變量置0,釋放分鍾標志位。
1094       shiflag=0;//時鍾標志位變量置0,釋放時鍾顯示標志位。
1095      }
1096     }
1097    }     
1098   }
1099   void main()//主函數
1100 {
1101    LCD1602Init();//LCD1602字符型液晶顯示器初始化函數
1102    LCD1602DisplayInitTime();//LCD1602字符型液晶顯示器顯示初始化時間函數
1103    DS18B20Init();//DS18B20溫度傳感器初始化函數
1104    Timer0Init();//定時器0初始化函數 
1105    SetTimeInit();//設時初始化函數
1106    SetTemperatrueInit();//設溫初始化函數    
1107    while(1)//固定循環
1108   {
1109     if(qitingflag==1)//判斷啟停標志位變量是否為1
1110    {
1111      //    SetAlarmTemperatrueFenJie(alarmwendu);
1112      if(lcd1602displaytimeflag==0)//判斷LCD1602液晶顯示器顯示時間標志位變量是否等於0
1113     {    
1114       if(miao<=60)//判斷走時秒鍾變量是否小於等於60
1115       LCD1602DisplayTimeFenJie(0x06,miao);//LCD1602液晶顯示器顯示時間兩位數分解函數顯示秒鍾兩位數
1116       if(fen<=60)//判斷走時分鍾變量是否小於等於60
1117       LCD1602DisplayTimeFenJie(0x03,fen);//LCD1602液晶顯示器顯示時間兩位數分解函數顯示分鍾兩位數
1118       if(shi<=24)//判斷走時時鍾變量是否小於等於24
1119       LCD1602DisplayTimeFenJie(0x00,shi);//LCD1602液晶顯示器顯示時間兩位數分解函數顯示時鍾兩位數
1120      }
1121      if(temperaturedisplayflag==0)//判斷溫度顯示標志位變量是否等於0
1122     {     
1123       TemperatureFenJie();//溫度分解函數
1124       TemperatureDisplay();//溫度顯示函數 
1125      }
1126      if(settimedisplayflag==0)//判斷設時顯示標志位變量是否等於0
1127     {
1128       SetTimeKeyScan();//設時按鍵掃描函數
1129      }
1130      if(settemperaturedisplayflag==0)//判斷設溫標志位變量是否等於0
1131     {    
1132       SetTemperatureKeyScan();//設溫按鍵掃描函數
1133      }
1134      if(tiaotimedisplayflag==0)//判斷調時標志位變量是否等於0
1135     {
1136       TiaoTimeKeyScan();//調時按鍵掃描函數
1137      }
1138      TimeBaoJing();//時間報警函數 
1139      if(timebaojingflag==1)//判斷時間報警標志位變量置是否為1
1140     {
1141       FengNingQi_Alarm(80);//蜂鳴器報警
1142       settimedisplayflag=1;//設時顯示標志位變量置1,限制操作設時按鍵掃描函數。
1143       settemperaturedisplayflag=1;//設溫顯示標志位變量置1,限制操作設溫按鍵掃描函數。
1144       tiaotimedisplayflag=1;//調時顯示標志位變量置1,限制操作調時按鍵掃描函數。
1145      }
1146      TemperatrueBaoJing();//溫度報警函數
1147      if(temperatruebaojingflag==1)//判斷溫度報警標志位變量是否為1
1148     {
1149       FengNingQi_Alarm(80);//蜂鳴器報警
1150       settimedisplayflag=1;//設時顯示標志位變量置1,限制操作設時按鍵掃描函數。
1151       settemperaturedisplayflag=1;//設溫顯示標志位變量置1,限制操作設溫按鍵掃描函數。
1152       tiaotimedisplayflag=1;//調時顯示標志位變量置1,限制操作調時按鍵掃描函數。
1153       temperaturedisplayflag=1;//溫度顯示標志位變量置1,限制操作溫度分解函數和溫度顯示函數。
1154      }
1155     }
1156     SumKeyScan();//總按鍵掃描函數
1157    }
1158   }

三、基於51單片機DS18B20測溫LCD1602顯示可設時設溫調時的項目Proteus軟件仿真單片機外圍電路

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM