|
按邏輯關(guān)系和時(shí)序很好處理。
- #include <STC8G.H>
- sbit GPIO_A = P3^1;
- sbit GPIO_B = P3^2;
- sbit KEY = P3^3;
- bit ON_OFF=0;
- bit flag=0;//標(biāo)志
- bit sign=0;
- bit start=0;
- unsigned int num=0;
- unsigned char count=0;
- void Timer0_Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器自動(dòng)重裝模式
- TL0 = 0xCD; //設(shè)置定時(shí)初始值
- TH0 = 0xD4; //設(shè)置定時(shí)初始值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
- ET0 = 1; //使能T0中斷
- EA = 1; //使能總中斷
- }
- void main(void)
- {
- GPIO_A = 0;//上電低電平
- GPIO_B = 0;//上電低電平
- P1M0 = 0x00;
- P1M1 = 0x00;
- // P3M0 = 0x06;//P3.1/P3.2推挽模式
- P3M0 = 0x00;
- P3M1 = 0x00;
- P5M0 = 0x00;
- P5M1 = 0x00;
- Timer0_Init();
- while(1)
- {
- if(flag)//按鍵掃描周期1ms
- {
- flag=0;
- if(!KEY)
- {
- if(++count>=20 && !sign && !start)//消抖、雙重自鎖,按下的時(shí)間長(zhǎng)短不影響繼電器響應(yīng)。
- {
- sign=1;
- start=1;
- ON_OFF=~ON_OFF;
- }
- }
- else
- {
- sign=0;
- count=0;
- }
- }
- }
- }
- void Timer0_Isr(void) interrupt 1
- {
- //自動(dòng)重裝
- if(start)//開(kāi)始運(yùn)行
- {
- if(ON_OFF)//繼電器吸合
- {
- GPIO_A = 1;
- GPIO_B = 0;
- }
- else //繼電器釋放
- {
- GPIO_A = 0;
- GPIO_B = 1;
- }
- if(++num>=100)//100ms
- {
- num = 0;
- GPIO_A = 0;
- GPIO_B = 0;
- start = 0;//驅(qū)動(dòng)結(jié)束,繼電器保持當(dāng)前狀態(tài)
- }
- }
- flag=1;//1ms中斷標(biāo)志
- }
復(fù)制代碼
|
|