久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 基于51單片機DS18B20測溫LCD1602顯示可設時設溫調時的項目工程 [打印本頁]

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

  1001.   }
  1002.   void SetTimeInit()//設時初始化函數
  1003. {
  1004.    WriteCommand(0x80+0x00);//LCD1602字符型液晶顯示器第一行第0個(從第零開始數)顯示位
  1005.    WriteData(0x30+sethourshi);//0x30表示字符庫的數字0,整個代碼表示設時十位變量可顯示0到9的數字。
  1006.    WriteData(0x30+sethourge);//0x30表示字符庫的數字0,整個代碼表示設時個位變量可顯示0到9的數字。
  1007.    WriteData(0x3a);//0x3a表示字符庫中冒號
  1008.    WriteData(0x30+setminutanshi);//0x30表示字符庫的數字0,整個代碼表示設分十位變量可顯示0到9的數字。
  1009.    WriteData(0x30+setminutange);//0x30表示字符庫的數字0,整個代碼表示設分個位變量可顯示0到9的數字。
  1010.    WriteData(0x3a);//0x3a表示字符庫中冒號
  1011.    WriteData(0x30+setsecondshi);//0x30表示字符庫的數字0,整個代碼表示設秒十位位變量可顯示0到9的數字。
  1012.    WriteData(0x30+setsecondge);//0x30表示字符庫的數字0,整個代碼表示設秒個位位變量可顯示0到9的數字。
  1013.   }
  1014.   void TimeBaoJing()//時間報警函數
  1015. {
  1016.    if(S2numflag==1||S3numflag==1)//判斷增加鍵標志位變量是否為1或減少鍵標志位變量是否為1
  1017.   {  
  1018.     if(setsecondflag==1&&setminutanflag==0&&sethourflag==0&&setsecond>0&&TR0flag==1&&miaoflag==0)//判斷設時秒鐘標志位變量是否為1和設時分鐘標志位變量是否為0和設時時鐘標志位變量是否為0和設時秒鐘是否大于0和定時器0標志位變量是否等于1和秒鐘標志位變量置是否為0
  1019.    {
  1020.      if(miao==setsecond)//判斷走時秒鐘是否等于設時秒鐘
  1021.     {
  1022.       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
  1023.       TR0=0;//關定時器0
  1024.      }
  1025.     }
  1026.     if(setminutanflag==1&&setsecondflag==0&&sethourflag==0&&setminutan>0&&TR0flag==1&&fenflag==0)//判斷設時分鐘標志位變量是否為1和設時秒鐘標志位變量是否為0和設時時鐘標志位變量是否為0和設時分鐘是否大于0和定時器0標志位變量是否等于1和分鐘標志位變量置是否為0
  1027.    {
  1028.      if(fen==setminutan)//判斷走時分鐘是否等于設時分鐘
  1029.     {
  1030.       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
  1031.       TR0=0;//關定時器0
  1032.      }
  1033.     }
  1034.     if(sethourflag==1&&setsecondflag==0&&setminutanflag==0&&sethour>0&&TR0flag==1&&shiflag==0)//判斷設時時鐘標志位變量是否為1和設時秒鐘標志位變量是否為0和設時分鐘標志位變量是否為0設時時鐘是否大于0和定時器0標志位變量是否等于1和時鐘標志位變量置是否為0
  1035.    {
  1036.      if(shi==sethour)//判斷走時時鐘是否等于設時時鐘
  1037.     {
  1038.       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
  1039.       TR0=0;//關定時器0
  1040.      }
  1041.     }
  1042.     if(setsecondflag==1&&setminutanflag==1&&setsecond>0&&setminutan>0&&TR0flag==1&&miaoflag==0&&fenflag==0)//判斷設時秒鐘標志位變量是否為1和設時分鐘標志位變量是否為1和設時秒鐘是否大于0和設時分鐘是否大于0和定時器0標志位變量是否等于1和秒鐘標志位變量置是否為0和分鐘標志位變量是否為0
  1043.    {
  1044.      if(miao==setsecond&&fen==setminutan)//判斷走時秒鐘和分鐘是否等于設時秒鐘和分鐘
  1045.     {
  1046.       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
  1047.       TR0=0;//關定時器0
  1048.      }
  1049.     }
  1050.     if(setsecondflag==1&&sethourflag==1&&setsecond>0&&sethour>0&&TR0flag==1&&miaoflag==0&&shiflag==0)//判斷設時秒鐘標志位變量是否為1和設時時鐘標志位變量是否為1和設時秒鐘是否大于0和設時時鐘是否大于0和定時器0標志位變量是否等于1和秒鐘標志位變量是否為0和時鐘標志位變量是否為0
  1051.    {
  1052.      if(miao==setsecond&&shi==sethour)//判斷走時秒鐘和時鐘是否等于設時秒鐘和時鐘
  1053.     {
  1054.       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
  1055.       TR0=0;//關定時器0
  1056.      }
  1057.     }
  1058.     if(setminutanflag==1&&sethourflag==1&&setminutan>0&&sethour>0&&TR0flag==1&&fenflag==0&&shiflag==0)//判斷設時分鐘標志位變量是否為1和設時時鐘標志位變量是否為1和設時分鐘是否大于0和設時時鐘是否大于0和定時器0標志位變量是否等于1和分鐘標志位變量是否為0和時鐘標志位變量是否為0
  1059.    {
  1060.      if(fen==setminutan&&shi==sethour)//判斷走時分鐘和時鐘是否等于設時分鐘和時鐘
  1061.     {
  1062.       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
  1063.       TR0=0;//關定時器0
  1064.      }
  1065.     }
  1066.     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
  1067.    {
  1068.      if(miao==setsecond&&fen==setminutan&&shi==sethour)//判斷走時秒鐘和分鐘和時鐘是否都等于設時秒鐘和分鐘和時鐘
  1069.     {
  1070.       timebaojingflag=1;//時間報警標志位變量置1,進行時間報警。
  1071.       TR0=0;//關定時器0
  1072.      }
  1073.     }
  1074.    }
  1075.   }
  1076.   void TemperatrueBaoJing()//溫度報警函數
  1077. {
  1078.    if(S2numflag==1||S3numflag==1)//判斷增加鍵標志位變量是否為1或減少鍵標志位變量是否為1
  1079.   {  
  1080.     if(settemperatureflag==1)//判斷設溫標志位變量是否為1
  1081.    {
  1082.      if(wendu-10>settemperature)//判斷溫度變量減10后是否大于設溫變量,其中的10分別表示設溫個位數1與設溫小數位0,實際上表示1攝氏度,相當于溫差報警溫度,這么做的原因是因為設溫數值和溫度數值都帶有小數,通過數值取整運算,把設溫數值和溫度數值換算成整數來計算溫差,這樣便于處理設溫數值與溫度數值的溫差值。
  1083.     {
  1084.       temperatruebaojingflag=1;//溫度報警標志位變量置1,進行溫度報警。
  1085.       TR0=0;//關定時器0
  1086.      }
  1087.     }
  1088.      if(wendu<10&&settemperatureflag==1)//判斷溫度變量是否小于10和設溫標志位變量是否為1,其中的10分別表示設溫個位數1與設溫小數位0,實際上表示1攝氏度,相當于溫差報警溫度,這么做的原因是因為設溫數值和溫度數值都帶有小數,通過數值取整運算,把設溫數值和溫度數值換算成整數來計算溫差,這樣便于處理設溫數值與溫度數值的溫差值。
  1089.     {
  1090.       temperatruebaojingflag=0;//溫度報警標志位變量置0,不進行溫度報警。
  1091.       TR0=1;//開定時器0
  1092.      }        
  1093.     }
  1094.   }
  1095.   void main()//主函數
  1096. {
  1097.    LCD1602Init();//LCD1602字符型液晶顯示器初始化函數
  1098.    Timer0Init();//定時器0初始化函數
  1099.    LCD1602Display();//LCD1602字符型液晶顯示器顯示函數
  1100.    DS18B20Init();//DS18B20初始化函數
  1101.    SetTimeInit();//設時初始化函數
  1102.    SetTemperatrueInit();//設溫初始化函數        
  1103.    while(1)//死循環
  1104.   {
  1105.     SumKeyScan();//總按鍵掃描函數
  1106.     if(qitingflag==1)//判斷啟停標志位變量是否為1
  1107.    {
  1108.      TimeBaoJing();//時間報警函數
  1109.      if(timebaojingflag==1)//判斷時間報警標志位變量置是否為1
  1110.     {
  1111.       FengNingQi_Alarm(80);//報警
  1112.       settimedisplayflag=1;//設時顯示標志位變量置1,限制操作設時按鍵掃描函數。
  1113.       settemperaturedisplayflag=1;//設溫顯示標志位變量置1,限制操作設溫按鍵掃描函數。
  1114.       tiaotimedisplayflag=1;//調時顯示標志位變量置1,限制操作調時按鍵掃描函數。
  1115.      }
  1116.      TemperatrueBaoJing();//溫度報警函數
  1117.      if(temperatruebaojingflag==1)//判斷溫度報警標志位變量是否為1
  1118.     {
  1119.       FengNingQi_Alarm(80);//報警
  1120.       settimedisplayflag=1;//設時顯示標志位變量置1,限制操作設時按鍵掃描函數。
  1121.       settemperaturedisplayflag=1;//設溫顯示標志位變量置1,限制操作設溫按鍵掃描函數。
  1122.       tiaotimedisplayflag=1;//調時顯示標志位變量置1,限制操作調時按鍵掃描函數。
  1123.       temperaturedisplayflag=1;//溫度顯示標志位變量置1,限制操作溫度分解函數和溫度顯示函數。
  1124.      }
  1125.      if(settimedisplayflag==0)//判斷設時顯示標志位變量是否等于0
  1126.     {
  1127.       SetTimeKeyScan();//設時按鍵掃描函數
  1128.      }
  1129.      if(settemperaturedisplayflag==0)//判斷設溫標志位變量是否等于0
  1130.     {        
  1131.       SetTemperatureKeyScan();//設溫按鍵掃描函數
  1132.      }
  1133.      if(tiaotimedisplayflag==0)//判斷調時標志位變量是否等于0
  1134.     {
  1135.       TiaoTimeKeyScan();//調時按鍵掃描函數
  1136.      }
  1137. //   SetAlarmTemperatrueFenJie(alarmwendu);
  1138.      if(lcd1602displaytimeflag==0)//判斷液晶顯示器顯示時間標志位變量是否等于0
  1139.     {        
  1140.       if(miao<=60)//判斷秒鐘變量是否小于等于60
  1141.       LCD1602DisplayTime(0x06,miao);//秒鐘顯示兩位數分解函數
  1142.       if(fen<=60)//判斷分鐘變量是否小于等于60
  1143.       LCD1602DisplayTime(0x03,fen);//分鐘顯示兩位數分解函數
  1144.       if(shi<=24)//判斷時鐘變量是否小于等于24
  1145.       LCD1602DisplayTime(0x00,shi);//時鐘顯示兩位數分解函數
  1146.      }
  1147.      if(temperaturedisplayflag==0)//判斷溫度顯示標志位變量是否等于0
  1148.     {         
  1149.       TemperatureFenJie();//溫度分解函數
  1150.       TemperatureDisplay();//溫度顯示函數
  1151.      }
  1152.     }
  1153.    }
  1154.   }
復制代碼





作者: 半壁松    時間: 2020-4-25 10:09
資料很齊全,不錯不錯
作者: o48foim20l    時間: 2020-4-25 10:33
好資料值得學習和收藏
作者: 凌某    時間: 2020-4-30 01:25
資料不錯
作者: Clealoveee    時間: 2020-4-30 17:23
這注釋也太多了




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美日韩久久 | 亚洲成人www | 国产日韩欧美在线播放 | 一区不卡在线观看 | 精品国产一级 | 热re99久久精品国产99热 | 99日韩 | 亚洲一区二区三区在线视频 | 午夜视频导航 | 亚洲网址在线观看 | 国产一区二区精品 | 99视频免费在线观看 | 免费一区二区 | 免费1区2区3区 | 999国产精品视频免费 | 精品真实国产乱文在线 | 中文av在线播放 | 欧美亚洲视频在线观看 | 91在线一区| 国产免费一区二区三区免费视频 | 国产免费一区二区 | 国产精品99一区二区 | 免费看啪啪网站 | 91免费视频 | 夜夜草导航 | 久久丝袜视频 | 蜜桃视频在线观看免费视频网站www | 国产成人av在线 | 999国产精品视频 | 日韩精品亚洲专区在线观看 | 欧美日韩一区二区在线 | 亚洲一区免费 | 一区二区三区视频 | 日本高清精品 | 日韩一区二区在线免费观看 | 国产高清免费视频 | 国产激情91久久精品导航 | 日韩美女在线看免费观看 | 精品欧美 | 精品国产欧美一区二区 | 国产精品视频导航 |