|
直接上代碼
主要兩個(gè)問(wèn)題咨詢(xún)一下網(wǎng)友:1、定時(shí)器延時(shí)函數(shù)能不能正常工作;2、開(kāi)關(guān)(此開(kāi)關(guān)不是按鍵開(kāi)關(guān),是普通的接通和斷開(kāi)開(kāi)關(guān))接通執(zhí)行一套代碼;否則斷開(kāi),執(zhí)行另一套代碼。
#include <ny8.h>
#include "ny8_constant.h"
#define UPDATE_REG(x) __asm__("MOVR _" #x ",F")
#define uchar unsigned char
#define uint unsigned int
#define JRJDQ PORTBbits.PB0 //7腳繼電器1, 高有效
#define JSJDQ PORTBbits.PB1 //6腳繼電器2, 高有效
#define FMQ PORTBbits.PB2 //5腳繼電器3, 高有效
#define JRJDQ2 PORTBbits.PB3 //4腳繼電器4, 高有效
#define KEY1 PORTBbits.PB4 //3腳電源開(kāi)關(guān),高電平表示接通,低電平表示斷開(kāi)
#define DCF PORTBbits.PB5 //2腳繼電器5, 高有效
uchar sysmode=0;
__sbit fz1b = sysmode:0;
__sbit t0zd1b = sysmode:1;
//==T0時(shí)間計(jì)算================================================
void time0_init(void)
{
PCON1 &= 0xfe;
T0MD = C_PS0_TMR0 | C_PS0_Div256; //FINST預(yù)分頻給T0且為256分頻
TMR0 = 0x00;
INTE = C_INT_TMR0; //開(kāi)啟T0中斷
PCON1 = C_TMR0_En; //開(kāi)啟T0
}
void io_init(void)
{
IOSTB = C_PB4_Input; //PB4輸入
IOSTB = C_PB0_Output; //PB0輸出
IOSTB = C_PB1_Output; //PB1輸出
IOSTB = C_PB2_Output; //PB2輸出
IOSTB = C_PB3_Output; //PB3輸出
IOSTB = C_PB5_Output; //PB5輸出
BPHCON = (unsigned char)~( C_PB0_PHB | C_PB1_PHB| C_PB2_PHB| C_PB3_PHB| C_PB5_PHB ); //上拉
PORTB = 0x00;
INTE|=(1<<1); //開(kāi)啟B口電平中斷
}
void delay_us(int count) //@16M 2T 2.5us
{
for(;count>0;count--);
}
void delay_ms(int count) //@8m 4T 1ms
{
int i;for(;count>0;count--){for(i=0;i<=100;i++);}
}
void Delay(unsigned long var)
{
unsigned long i;
i = t0zd1b;
while(t0zd1b-i < var)
{
;
}
}
void main()
{
io_init();
time0_init();
delay_ms(80);
while(1)
{
CLRWDT();
if(INTFbits.WDTIF) //睡眠后60秒左右會(huì)進(jìn)來(lái)一次
{
CLRWDT(); //喂狗
INTF= (unsigned char)~(C_INT_WDT); // Clear WDTIF flag bit //清除WDTIF標(biāo)志位
}
if(KEY1==1) //K1開(kāi)關(guān)接通后,只要K1接通時(shí),延時(shí)后DCF繼電器低電平,然后又延時(shí)FMQ繼電器低電平,然后延時(shí)JRJDQ繼電器高電平,然后延時(shí)JRJDQ2繼電器高電平。
{
Delay(10);
{ DCF=0;} Delay(200);
{ FMQ=0;} Delay(2000);
{ JRJDQ=1;} Delay(10);
{ JRJDQ2=1;}
}
else //K1開(kāi)關(guān)斷開(kāi)后,只要K1斷開(kāi)后時(shí),延時(shí)后DCF繼電器高電平,延時(shí)后FMQ繼電器高電平,在延時(shí)后FMQ繼電器高電平。
{ //接著延時(shí)后JRJDQ低電平,延時(shí)后JRJDQ2低電平。
Delay(10);
{ DCF=1;} Delay(200);
{ FMQ=1;} Delay(2000);
{ JRJDQ=0;} Delay(200);
{ JRJDQ2=0;}
}
}
}
void isr(void) __interrupt(0)
{
if(INTFbits.T0IF)
{
INTF= (unsigned char)~(C_INT_TMR0);
t0zd1b=1;
CLRWDT(); //喂狗
if(INTFbits.WDTIF) //睡眠后60秒左右會(huì)進(jìn)來(lái)一次
{
CLRWDT(); //喂狗
INTF= (unsigned char)~(C_INT_WDT); // Clear WDTIF flag bit //清除WDTIF標(biāo)志位
}
}
}
|
|