直接上代码
主要两个问题咨询一下网友:1、定时器延时函数能不能正常工作;2、开关(此开关不是按键开关,是普通的接通和断开开关)接通执行一套代码;否则断开,执行另一套代码。
#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脚电源开关,高电平表示接通,低电平表示断开
#define DCF PORTBbits.PB5 //2脚继电器5, 高有效
uchar sysmode=0;
__sbit fz1b = sysmode:0;
__sbit t0zd1b = sysmode:1;
//==T0时间计算================================================
void time0_init(void)
{
PCON1 &= 0xfe;
T0MD = C_PS0_TMR0 | C_PS0_Div256; //FINST预分频给T0且为256分频
TMR0 = 0x00;
INTE = C_INT_TMR0; //开启T0中断
PCON1 = C_TMR0_En; //开启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); //开启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秒左右会进来一次
{
CLRWDT(); //喂狗
INTF= (unsigned char)~(C_INT_WDT); // Clear WDTIF flag bit //清除WDTIF标志位
}
if(KEY1==1) //K1开关接通后,只要K1接通时,延时后DCF继电器低电平,然后又延时FMQ继电器低电平,然后延时JRJDQ继电器高电平,然后延时JRJDQ2继电器高电平。
{
Delay(10);
{ DCF=0;} Delay(200);
{ FMQ=0;} Delay(2000);
{ JRJDQ=1;} Delay(10);
{ JRJDQ2=1;}
}
else //K1开关断开后,只要K1断开后时,延时后DCF继电器高电平,延时后FMQ继电器高电平,在延时后FMQ继电器高电平。
{ //接着延时后JRJDQ低电平,延时后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秒左右会进来一次
{
CLRWDT(); //喂狗
INTF= (unsigned char)~(C_INT_WDT); // Clear WDTIF flag bit //清除WDTIF标志位
}
}
}
|