- //按鍵按一次一分鐘定時再按一次是3分鐘定時控制P3^3口
- //單片機是STC15F104W
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key = P3^2; // 按鍵連接在P3.2引腳
- sbit led = P3^3; // LED連接在P3.3引腳
- uchar key_press_count = 0; // 按鍵按下次數
- //bit timer_running = 0; // 定時器運行狀態
- uint timer_count = 0; // 定時計數
- //uchar timer_mode = 0; // 定時模式,0表示未設置,1表示1分鐘,2表示3分鐘
- // 定時器初始化函數
- void Timer0Init()//50ms
- {
- TMOD = 0xF0;
- TH0 = (65536 - 50000) / 256;
- TL0 = (65536 - 50000) % 256;
- EA = 1;
- ET0 = 1;
- TF0 = 0;
- TR0 = 0;
- }
- // 延時函數50MS
- void delay()
- {
- unsigned char data i, j, k;
- i = 3;
- j = 72;
- k = 161;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- // 按鍵掃描函數
- void key_scan()
- {
- if(key == 0) // 檢測按鍵是否按下
- {
- delay(); // 消抖
- if(key == 0)
- while(!key); // 等待按鍵釋放
- {
- key_press_count++; // 增加按鍵次數
- if(key_press_count==1){
- timer_count=1200;
- led = 1;
- TR0 = 1;
- }
- else if(key_press_count==2){
- timer_count=3600;
- led = 1;
- TR0 = 1;
- }
- else {
- key_press_count=0;
- timer_count = 0;
- led = 0;
- TR0 = 0;
- }
- }
- }
- }
- void main()
- {
- Timer0Init(); // 初始化定時器
- led = 0; // 初始化LED狀態為關閉
- while(1)
- {
- key_scan(); // 按鍵掃描
- }
- }
- // 定時器0中斷服務函數
- void Timer0Interrupt(void) interrupt 1
- {
- timer_count--;
- if(timer_count==0)
- {
- TR0=0;
- led=0;
- }
- }
復制代碼
代碼BUG有點多,定時器是50ms中斷一次,1min=60S=1200x50ms,不是120000。∵有你中斷一直沒關,就這樣吧,我這個是調試時用的,按第二次一直有個短脈沖,可能是杜邦線當按鍵的原因,你可以把延時消抖可以改小點。然后感覺思路有點問題,中斷函數應該盡可能短,建議把定時器設置為16位自動重裝模式,使用標志位或者像我那樣控制,然后用switch把值給timer_count,定時器的開關一定要準,不然會軟件定時一樣誤差比較大,然后記得給定時器中斷關掉,最后建議重構。 |