这是非常简单的逻辑控制,给你写一个示例,你试试。IO口可以根据实际需要重新定义,最好避开P3.0和P3.1,以免影响下载程序。
- #include <STC15F2K60S2.H>//头文件适用STC15F104W
- #define uchar unsigned char
- #define uint unsigned int
- sbit key =P3^2;
- sbit LED1=P3^3;
- sbit LED2=P3^4;
- bit sign=0,flag=0;
- uchar sec,num;
- //ms延时子函数(11.0592MHz 1T单片机)
- void delay(uint k)
- {
- uint i,j;
- for(i=k;i>0;i--)
- for(j=829;j>0;j--);
- }
- //启动开关函数
- void switch_scan()
- {
- if(!key)
- {
- delay(10);
- if(!key && !sign)
- {
- sign=1;
- flag=1;
- }
- }
- else
- {
- sign=0;
- flag=0;
- }
- }
- void Timer0Init() //50毫秒@11.0592MHz
- {
- TMOD= 0x01; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0x4C; //设置定时初值
- TR0 = 1; //定时器0开始计时
- EA = 1; //开总中断
- ET0 = 1; //开T0中断
- }
- void main()
- {
- Timer0Init();
- while(1)
- {
- switch_scan();
- if(flag)
- {
- if(sec>=2&&sec<7)//延时2秒钟后LED1和LED2点亮5秒钟
- {
- LED1=0;
- LED2=0;
- }
- else if(sec>=7&&sec<127)//5秒钟后LED1熄灭,LED2还亮着2分钟
- {
- LED1=1;
- }
- else if(sec>=127&&sec<132)//2分钟后LED1又亮起来5秒钟
- {
- LED1=0;
- }
- else if(sec>=132)//5秒钟后LED1,LED2都熄灭
- {
- LED1=1;
- LED2=1;
- flag=0;
- }
- }
- else //全部复位
- {
- LED1=1;
- LED2=1;
- sec=0;
- num=0;
- }
- }
- }
- void timer0_isr()interrupt 1
- {
- TL0 = 0x00; //设置定时初值
- TH0 = 0x4C; //设置定时初值
- if(flag)
- {
- if(++num>=20)
- {
- num=0;
- sec++;
- }
- }
- }
复制代码 |