智能充電器的源程序- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit GATE = P2^0;
- sbit BP = P2^1;
- uint t_count,int0_count;
- /* 定時器0中斷服務子程序 */
- void timer0() interrupt 1 using 1
- {
- TR0 = 0; // 停止計數(shù)
- TH0 = -5000/256; // 重設計數(shù)初值
- TL0 = -5000%256;
- t_count++;
- if (t_count>600) // 第一次外部中斷0產(chǎn)生后3s
- {
- if (int0_count==1) // 還沒有出現(xiàn)第二次外部中斷0,則認為充電完畢
- {
- GATE = 0; // 關閉充電電源
- BP = 0; // 打開蜂鳴器報警
- }
- else // 否則即是充電出錯
- {
- GATE = 1;
- BP = 1;
- }
-
- ET0 = 0; // 關閉T0中斷
- EX0 = 0; // 關閉外部中斷0
- int0_count = 0;
- t_count = 0;
- }
- else
- TR0 = 1; // 啟動T0計數(shù)
- }
- /* 外部中斷0服務子程序 */
- void int0() interrupt 0 using 1
- {
- if (int0_count==0)
- {
- TH0 = -5000/256; // 5ms定時
- TL0 = -5000%256;
- TR0 = 1; // 啟動定時/計數(shù)器0計數(shù)
- t_count = 0; // 產(chǎn)生定時器0中斷的計數(shù)器清零
- }
- int0_count++;
- }
- /* 初始化 */
- void init()
- {
- EA = 1; // 打開CPU中斷
- PT0 = 1; // T0中斷設為高優(yōu)先級
- TMOD = 0x01; // 模式1,T0為16位定時/計數(shù)器
- ET0 = 1; // 打開T0中斷
- IT0 = 1; // 外部中斷0設為邊沿觸發(fā)
- EX0 = 1; // 打開外部中斷0
-
- GATE = 1; // 光耦正常輸出電壓
- BP = 1; // 關閉蜂鳴器
- int0_count = 0; // 產(chǎn)生外部中斷0的計數(shù)器清零
- }
- void main()
- {
- /* 調(diào)用初始化函數(shù) */
- init();
-
- /* 無限循環(huán) */
- while(1);
- }
復制代碼
|