本帖最后由 IdeaMing 于 2021-12-30 09:26 編輯
應該很簡單,51單片機連接8個按鍵,io口大佬看心情寫,高低電平隨意。
這8個按鍵分別控制7個io口輸出,io口隨意,高低電平隨意。
要求就是1-7號按鍵分別控制1-7號io口輸出,按一下按鍵延時6小時后恢復,在這6小時期間再次按下重新計時,7路互不干擾,一一對應。
8號按鍵用來中斷所有io口輸出。
用來制作充電樁改造的。
|
我來回答
單片機源程序如下:- /** 使用stc15w408as單片機 sop20腳
- P3接按鍵,可以接8個,P1口控制繼電器,低電平是關閉
- 關閉按鍵 接在復位腳 哈哈哈 */
- #include "stc15.h"
- #define BASE6HOUR (6*60*60*1000)///6小時倒計時
- unsigned long CountTab[8] = {0,0,0,0,0,0,0,0};//倒計時
- unsigned short time_ms;
- void Delay(unsigned short t)
- {
- time_ms = t;
- while(time_ms);
- }
- void Timer0Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0xCD; //設置定時初始值
- TH0 = 0xD4; //設置定時初始值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- }
- void IO_Init(void)
- {
- P0M1 = 0x00;
- P0M0 = 0xff;
- P3M0 = 0x00;
- P3M1 = 0x00;
- P1 = 0;
- }
- void main(void)
- {
- unsigned char res;
- unsigned char key;
- unsigned char i;
-
- Timer0Init();
- IO_Init();
- EA = 1;
- while(1)
- {
- res = P3;
- if(res != 0XFF)
- {
- key = res;
- Delay(20);//消抖
- key = P3;
- if(res == key)
- {
- EA = 0;//臨界保護
- for(i=0; i<8; i++)
- {
- if((res&0x01)== 0)
- {
- P1 |= (0x01<<i);
- CountTab[i] = BASE6HOUR;
- }
- res >>= 1;
- }
- EA = 1;
- }
- }
- }
- }
- void tm0_isr() interrupt 1
- {
- unsigned char i;
- if(time_ms)time_ms--;
- for(i=0; i<8; i++)
- {
- if(CountTab[i])
- {
- CountTab[i]--;
- if(CountTab[i] == 0)
- {
- P1 &= ~(0x01<<i);
- }
- }
- }
- }
復制代碼
stc15.h頭文件:http://www.zg4o1577.cn/bbs/dpj-117121-1.html
|