本帖最后由 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.51hei.com/bbs/dpj-117121-1.html
|