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 }