![]() |
發(fā)布時間: 2020-3-9 11:50
正文摘要:因為DIY感光PCB老是失敗,所以模仿大佬制作一個定時器。功能鍵用于開始/停止計時,加/減按鍵只能在非計時模式下才能調(diào)時間。調(diào)節(jié)范圍是0~999秒。采用中斷計時應(yīng)該沒問題,關(guān)于延時函數(shù)老是BUG,所以使用的下載器生成 ... |
樓主你是用立創(chuàng)EDA畫的原理圖吧?粗。。。 |
謝謝分享,下載來學(xué)習(xí)下 |
好,學(xué)習(xí)了 |
#include <REG52.H> #include<intrins.h> #define uint unsigned char uint time = 100; //定時時間 uint time1; uint num = 0; //計時達1s標(biāo)志位 bit state = 0; //工作狀態(tài)標(biāo)志位 unsigned char LED7Code[]={ 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 0x77, // A 0x7C, // B 0x39, // C 0x5E, // D 0x79, // E 0x71 // F }; sbit RELAY = P3^6; //繼電器,高電平有效 sbit BUZY = P3^6; //蜂鳴器,高電平有效 //按鍵聲明 sbit KeyFunction = P3^2; //功能按鍵,開始/暫停 sbit KeyAdd = P3^3; //按鍵加 sbit KeyMinus = P3^4; //按鍵減 //數(shù)碼管位聲明 ----段選為P2口 sbit duan1 = P1^0; //從左往右,第一位 sbit duan2 = P1^1; //從左往右,第二位 sbit duan3 = P1^2; //從左往右,第三位 sbit duan4 = P1^3; //從左往右,第四位 //子函數(shù)聲明 void display(void); //數(shù)碼管掃描函數(shù) void Delay2ms(void); //@12.000MHz,延時5ms void Delay10ms(void); //@12.000MHz,延時10ms void Delay150ms(void); //@12.000MHz,延時150ms void Delay200ms(void); //@12.000MHz,延時200ms void testKey(); //按鍵檢測 void main() { //中斷寄存器操作 TMOD = 0x01; //設(shè)置定時器0工作方式(M1,M0為0,1) TH0 = (65536-45872)/256; //裝初值 TL0 = (65536-45872)%256; //裝初值 EA = 1; //開總中斷 ET0 = 1; //開定時器0中斷 //開機音效 BUZY = 1; Delay200ms(); ; BUZY = 0; Delay200ms(); BUZY = 1; Delay200ms(); BUZY = 0; while(1) { time1 = time; display();//數(shù)碼管顯示 testKey(); //按鍵檢測 //進入計時模式 if(state) { time1 = time; TR0 = 1; //開啟定時器0 RELAY = 1; //打開繼電器 while(state) { testKey(); display(); //判斷計時是否完成 if(time1 == 0) { TR0 = 0; //關(guān)閉定時器 state = 0; //蜂鳴器響三聲,表示計時結(jié)束 BUZY = 1; Delay200ms();Delay200ms(); BUZY = 0; Delay200ms();Delay200ms(); BUZY = 1; Delay200ms();Delay200ms(); BUZY = 0; Delay200ms();Delay200ms(); BUZY = 1; Delay200ms();Delay200ms(); BUZY = 0; } } RELAY = 0; } } } void display(void) { uint j, ge, shi, bai; // 個位 十位 百位 ge = time1%10; shi = time1%100/10; bai = time1/100; //數(shù)碼管動態(tài)掃描 for(j=0;j<4;j++) { switch(j) { //個位顯示 case 0: duan1 = 0; duan2 = 0; duan3 = 0; duan4 = 1; P2 = LED7Code[ge]; break; //十位顯示 case 1: duan1 = 0; duan2 = 0; duan3 = 1; duan4 = 0; P2 = LED7Code[shi]; break; //百位顯示 case 2: duan1 = 0; duan2 = 1; duan3 = 0; duan4 = 0; P2 = LED7Code[bai]; break; //第四位顯示 case 3: //設(shè)置模式顯示C if(state) { duan1 = 1; duan2 = 0; duan3 = 0; duan4 = 0; P2 = LED7Code[14]; } //計時模式顯示E else { duan1 = 1; duan2 = 0; duan3 = 0; duan4 = 0; P2 = LED7Code[12]; } break; } Delay2ms(); //@12.000MHz ,延時5ms P2 = 0x00; duan1 = 0; duan2 = 0; duan3 = 0; duan4 = 0; } } //按鍵檢測函數(shù) void testKey() { //功能鍵檢測 if(~KeyFunction) { Delay10ms(); if(~KeyFunction) { state = ~state; BUZY = 0; } while(~KeyFunction); } //按鍵加檢測 if(~KeyAdd) { Delay10ms(); if(~KeyAdd) { if(~state && time<999) { time++; } Delay10ms(); if(~KeyAdd) Delay150ms(); } } //按鍵減檢測 if(~KeyMinus) { Delay2ms(); if(~KeyMinus) { if(~state && time>0) { time--; } Delay10ms(); if(~KeyMinus) Delay150ms(); } } } void Delay2ms() //@12.000MHz { unsigned char i, j; _nop_(); i = 32; j = 40; do { while (--j); } while (--i); } void Delay10ms() //@12.000MHz { unsigned char i, j; _nop_(); _nop_(); i = 156; j = 213; do { while (--j); } while (--i); } void Delay150ms() //@12.000MHz { unsigned char i, j, k; i = 10; j = 34; k = 160; do { do { while (--k); } while (--j); } while (--i); } void Delay200ms() //@12.000MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 13; j = 45; k = 214; do { do { while (--k); } while (--j); } while (--i); } //中斷函數(shù) void T0time() interrupt 1 { TH0 = (65536-45872)/256; //裝初值 TL0 = (65536-45872)%256; //裝初值 //5毫秒一次中斷,滿20次表示1秒已到 num++; if(num == 20) { num = 0; time1--; } } |
Powered by 單片機教程網(wǎng)