?? 使用99分鐘倒計時器.lst
字號:
C51 COMPILER V7.06 蔩用99_種觃_計蔩器 06/07/2010 14:02:27 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 蔩用99_種觃_計蔩器
OBJECT MODULE PLACED IN .\obj\使用99分鐘倒計時器.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 使用99分鐘倒計時器.c BROWSE DEBUG OBJECTEXTEND PRINT(.\obj\使用99分鐘倒計時
-器.lst) OBJECT(.\obj\使用99分鐘倒計時器.obj)
stmt level source
1 /*-----------------------------------------------
2 名稱:99分鐘倒計時數碼管顯示
3 論壇:www.doflye.net
4 編寫:shifang
5 日期:2009.5
6 修改:無
7 內容:99分鐘倒計時器,可以通過按鍵上調下調時間,定時器到時喇叭發聲報警
8 帶有點按和連按功能
9 ------------------------------------------------*/
10 #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
11
12 #define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換
13
14 sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存
15 sbit LATCH2=P2^3;// 位鎖存
16
17 sbit BEEP = P1^1;//定義喇叭端口
18 bit BeepFlag;
19
20 sbit KEY_ADD=P3^0; //定義按鍵輸入端口
21 sbit KEY_DEC=P3^1;
22
23 unsigned char hour,minute,second;//定義時分秒
24
25 bit UpdateTimeFlag;//定義讀時間標志
26
27 unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
28 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位
-碼
29 unsigned char TempData[8]; //存儲顯示值的全局變量
30
31 void DelayUs2x(unsigned char t);//us級延時函數聲明
32 void DelayMs(unsigned char t); //ms級延時
33 void Display(unsigned char FirstBit,unsigned char Num);//數碼管顯示函數
34 void Init_Timer0(void);//定時器初始化
35 void Beep_OFF(void);
36 void Beep_ON(void);
37 void Display_Data_Operation(void);
38 /*------------------------------------------------
39 顯示數據處理函數
40 ------------------------------------------------*/
41 void Display_Data_Operation(void)
42 {
43 1 TempData[2]=dofly_DuanMa[minute/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
44 1 TempData[3]=dofly_DuanMa[minute%10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
45 1 TempData[4]=0x40;
46 1 TempData[5]=dofly_DuanMa[second/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
47 1 TempData[6]=dofly_DuanMa[second%10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
48 1 }
49 /*------------------------------------------------
50 主函數
51 ------------------------------------------------*/
52 void main (void)
53 {
C51 COMPILER V7.06 蔩用99_種觃_計蔩器 06/07/2010 14:02:27 PAGE 2
54 1 unsigned char key_press_num;
55 1
56 1 Init_Timer0();
57 1
58 1 while (1) //主循環
59 1 {
60 2
61 2 if(!KEY_ADD) //如果檢測到低電平,說明按鍵按下
62 2 {
63 3 DelayMs(10); //延時去抖,一般10-20ms
64 3 if(!KEY_ADD) //再次確認按鍵是否按下,沒有按下則退出
65 3 {
66 4 while(!KEY_ADD)
67 4 {
68 5 key_press_num++;
69 5 DelayMs(10); //10x200=2000ms=2s
70 5 if(key_press_num==200) //大約2s
71 5 {
72 6 key_press_num=0; //如果達到長按鍵標準 則進入長按鍵動作
73 6 while(!KEY_ADD) //這里用于識別是否按鍵還在按下,如果按下執行相關動作,否則退出
74 6 {
75 7 if(minute<99) //加操作
76 7 minute++;
77 7 //即時把顯示數據處理,如果去掉下面2句處理信息,實際上看不到漸變效果,而是看到跳變效果
78 7 //用戶可以自行屏蔽測試
79 7 Display_Data_Operation();
80 7 DelayMs(50);//用于調節長按循環操作的速度
81 7 }
82 6 }
83 5 }
84 4 key_press_num=0;//防止累加造成錯誤識別
85 4 if(minute<99) //加操作
86 4 minute++;
87 4 }
88 3 }
89 2
90 2 if(!KEY_DEC) //如果檢測到低電平,說明按鍵按下
91 2 {
92 3 DelayMs(10); //延時去抖,一般10-20ms
93 3 if(!KEY_DEC) //再次確認按鍵是否按下,沒有按下則退出
94 3 {
95 4 while(!KEY_DEC)
96 4 {
97 5 key_press_num++;
98 5 DelayMs(10);
99 5 if(key_press_num==200) //大約2s
100 5 {
101 6 key_press_num=0;
102 6 while(!KEY_DEC)
103 6 {
104 7 if(minute>0) //減操作
105 7 minute--;
106 7 Display_Data_Operation();
107 7 DelayMs(50);//用于調節長按循環操作的速度
108 7 }
109 6 }
110 5 }
111 4 key_press_num=0;//防止累加造成錯誤識別
112 4 if(minute>0) //減操作
113 4 minute--;
114 4
115 4 }
C51 COMPILER V7.06 蔩用99_種觃_計蔩器 06/07/2010 14:02:27 PAGE 3
116 3 }
117 2
118 2 if(UpdateTimeFlag==1)
119 2 {
120 3 UpdateTimeFlag=0;
121 3
122 3 Display_Data_Operation();
123 3
124 3 if((minute==0)&&(second==0))//條件滿足蜂鳴器閃響
125 3 {
126 4 Beep_ON();
127 4 }
128 3 else
129 3 Beep_OFF(); //不滿足時關掉
130 3 }
131 2 }
132 1 }
133 /*------------------------------------------------
134 uS延時函數,含有輸入參數 unsigned char t,無返回值
135 unsigned char 是定義無符號字符變量,其值的范圍是
136 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
137 長度如下 T=tx2+5 uS
138 ------------------------------------------------*/
139 void DelayUs2x(unsigned char t)
140 {
141 1 while(--t);
142 1 }
143 /*------------------------------------------------
144 mS延時函數,含有輸入參數 unsigned char t,無返回值
145 unsigned char 是定義無符號字符變量,其值的范圍是
146 0~255 這里使用晶振12M,精確延時請使用匯編
147 ------------------------------------------------*/
148 void DelayMs(unsigned char t)
149 {
150 1
151 1 while(t--)
152 1 {
153 2 //大致延時1mS
154 2 DelayUs2x(245);
155 2 DelayUs2x(245);
156 2 }
157 1 }
158 /*------------------------------------------------
159 顯示函數,用于動態掃描數碼管
160 輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數碼管開始顯示
161 如輸入0表示從第一個顯示。
162 Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2
163 ------------------------------------------------*/
164 void Display(unsigned char FirstBit,unsigned char Num)
165 {
166 1 static unsigned char i=0;
167 1
168 1
169 1 DataPort=0; //清空數據,防止有交替重影
170 1 LATCH1=1; //段鎖存
171 1 LATCH1=0;
172 1
173 1 DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
174 1 LATCH2=1; //位鎖存
175 1 LATCH2=0;
176 1
177 1 DataPort=TempData[i]; //取顯示數據,段碼
C51 COMPILER V7.06 蔩用99_種觃_計蔩器 06/07/2010 14:02:27 PAGE 4
178 1 LATCH1=1; //段鎖存
179 1 LATCH1=0;
180 1
181 1 i++;
182 1 if(i==Num)
183 1 i=0;
184 1
185 1
186 1 }
187 /*------------------------------------------------
188 定時器初始化子程序
189 ------------------------------------------------*/
190 void Init_Timer0(void)
191 {
192 1 TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
193 1 //TH0=0x00; //給定初值
194 1 //TL0=0x00;
195 1 EA=1; //總中斷打開
196 1 ET0=1; //定時器中斷打開
197 1 TR0=1; //定時器開關打開
198 1 }
199 /*------------------------------------------------
200 定時器中斷子程序
201 ------------------------------------------------*/
202 void Timer0_isr(void) interrupt 1
203 {
204 1 static unsigned int num,i;
205 1
206 1 TH0=(65536-1000)/256;//重新賦值 1ms
207 1 TL0=(65536-1000)%256;
208 1 if(BeepFlag) //啟動喇叭標志
209 1 {
210 2 if(num<300 || (num>500&&num<800) )
211 2 BEEP=!BEEP; //閃響
212 2 else
213 2 BEEP=0;
214 2 }
215 1 Display(0,8); // 調用數碼管掃描
216 1 i++;
217 1 if(i==20) //20ms更新一次
218 1 {
219 2 i=0;
220 2 UpdateTimeFlag=1; //更新時間志位置1
221 2 }
222 1 num++;
223 1 if(num==1000) //大致1s
224 1 {
225 2 num=0;
226 2 if((minute!=0)||second)//如果分鐘和秒都為0,不進行計時
227 2 second--;//秒減1
228 2 if(second==0xff)//如果=0后再減1則賦值59,即00過后顯示59
229 2 {
230 3 second=59;
231 3 if(minute>0)//倒計時條件
232 3 {
233 4 minute--;
234 4 }
235 3
236 3 }
237 2 }
238 1 }
239
C51 COMPILER V7.06 蔩用99_種觃_計蔩器 06/07/2010 14:02:27 PAGE 5
240
241 /*------------------------------------------------
242 喇叭警報聲音開
243 ------------------------------------------------*/
244 void Beep_ON(void)
245 {
246 1 BeepFlag=1;
247 1 }
248 /*------------------------------------------------
249 喇叭警報聲音關
250 ------------------------------------------------*/
251 void Beep_OFF(void)
252 {
253 1 BeepFlag=0;
254 1 BEEP=0;
255 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 447 ----
CONSTANT SIZE = 18 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 1
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -