📄 main.c
字号:
#define root
#include "config.h"
/***************************************
功能:上电初始化
入口:无
出口:无
****************************************/
void main(void)
{
uint8 i;
powerOnInit();
SD4008_SET;
SD4008_PLAY1;
Delay100TCYx(1);
while(1)
{
if(!sysFlags.zaijiFlag){zhenringJC();}
if(sysFlags.zaijiFlag)
{SD4008_PLAY1;
Delay100TCYx(10);
SD4008_PLAY0;
Delay10KTCYx(200);
Delay10KTCYx(200);
Delay10KTCYx(200);
Delay10KTCYx(200);
Delay10KTCYx(200);
}
}
}
void powerOnInit(void)
{ uint8 i;
RCONbits.IPEN=0;//4不启用中断优先级
//--------------------------------------------------
//4 中断控制寄存器INTCON
INTCONbits.GIE=1;//允许中断
INTCONbits.PEIE=1;//屏蔽外设中断
INTCONbits.T0IE=1;//允许TIMER0中断
INTCONbits.INT0E=1;//禁止外部中断
INTCONbits.INT0F=0;//INTO 外部中断溢出标志位
INTCONbits.RBIE=0;//禁止RB端口电平变化中断
//--------------------------------------------------
INTCON2bits.TMR0IP=0;//TMR0溢出为低优先级
INTCON2bits.INTEDG0=0;
//-----------------------------------------------
//4PIR寄存器:中断请求标志位
//PIR1/PIR2/PIR2
//--------------------------------------------------
//4PIE寄存器:中断使能
//PIE1
PIE1bits.TMR1IE=1;
PIE1bits.TMR2IE=0;
PIE1bits.CCP1IE=0;
PIE1bits.SSPIE=0;
PIE1bits.TXIE=0;
PIE1bits.RCIE=1;
PIE1bits.ADIE=0;
//PIE2
PIE2bits.CCP2IE=0;
PIE2bits.BCLIE=0;
PIE2bits.CMIE=0;
PIE2bits.OSCFIE=0;
//PIE3
PIE3bits.BCL2IE=0;
PIE3bits.SSP2IE=0;
//-------------------------------------------------
//4IPR中断优先级寄存器
//IPR1;
IPR1bits.TMR1IP=0;
IPR1bits.TMR2IP=0;
IPR1bits.CCP1IP=0;
IPR1bits.SSPIP=0;
IPR1bits.TXIP=0;
IPR1bits.RCIP=0;
IPR1bits.ADIP=0;
//IPR2;
IPR2bits.CCP2IP=0;
IPR2bits.BCLIP=0;
IPR2bits.CMIP=0;
IPR2bits.OSCFIP=0;
//IPR2
IPR3bits.BCL2IP=0;
IPR3bits.SSP2IP=0;
//-------------------------------------------------
//4TIMER0 为系统时钟周期定时器时基为10ms
T0CONbits.TMR0ON=0;//停止TMR0
T0CONbits.T08BIT=0;//16位
T0CONbits.T0CS=0;//采用内部时钟源
T0CONbits.T0SE=0;//边沿选择
T0CONbits.PSA=1;//不分配分频器
T0CONbits.T0PS0=0;//4分频
T0CONbits.T0PS1=0;
T0CONbits.T0PS2=0;
//16M晶振,定时10ms
TMR0H=0XF0;
TMR0L=0X5f;
//-------------------------------------------------
//4TIMER1 为振铃专用1ms定时
T1CONbits.TMR1ON=0;//停止TMR1
T1CONbits.TMR1CS=0;//采用内部时钟源
T1CONbits.T1OSCEN=0;//关闭T1振荡器
T1CONbits.T1CKPS0=0;// 1:1分频
T1CONbits.T1CKPS1=0;
T1CONbits.T1RUN=0;//T1不为器件时钟
T1CONbits.RD16=1;//16位
//16M晶振,定时1ms
TMR1H=0X15;
TMR1L=0X9f;
// ---------------
ADCON1=0XFF;
T0CONbits.TMR0ON=1;//开启TMR0
T1CONbits.TMR1ON=0;//关闭TMR1
//IO口输入输出定义
TRISA=0B11111111;
TRISB=0B11000001;
TRISC=0X0;
PORTCbits.RC1=1;
ZAIJI=0; //摘机初始化
sysFlags.zaijiFlag=0;
timerFlags.timer3msFlag=0;
timerFlags.timer1sFlag=0;
timerFlags.timer4sFlag=0;
timerFlags.timer6sFlag=0;
time1s=0;
time3ms=0;
time4s=0;
time6s=0;
ring_status=0;
ring_counter=0;
ring_timer=0;
SD4008_REST;
SD4008_PLAY0;
SD4008_POWER_ON;
}
void zhenringJC(void)
{
switch(ring_status)
{
case 0x00:
{
if(sysFlags.ringFlag)
{
sysFlags.ringFlag=0;
timerFlags.timer3msFlag=1; //启动去抖3MS定时器
ring_status++;
}
}
break;
case 0x01:
{
if(!timerFlags.timer3msFlag) //去抖时间是否结束
{
INTCONbits.INT0F=0;//清中断标志位
INTCONbits.INT0E=1;
if(!PORTBbits.RB0)
{
time6s=0;//清6s 溢出标志位
timerFlags.timer6sFlag=0;//关闭6s超时模式
timerFlags.timer1sFlag=1;//启动1s定时器
ring_status++;
}
else ring_status=0;
}
}
break;
//***********振铃检测开始 ************//
case 0x02:
{
if(sysFlags.ringFlag)
{
sysFlags.ringFlag=0;
timerFlags.timer3msFlag=1; //启动去抖3MS定时器
ring_status++;
}
}
break;
case 0x03:
{
if(!timerFlags.timer3msFlag) //去抖时间是否结束
{
INTCONbits.INT0F=0;//清中断标志位
INTCONbits.INT0E=1;
if(!PORTBbits.RB0)
{
ring_counter++; //25HZ振铃波形检测
ring_status=0x02;
}
}
}
break;
case 0x04:
{
if(!timerFlags.timer4sFlag)
{
ring_status=0x00;
timerFlags.timer6sFlag=1;//启动6s超时模式
}
}
break;
case 0x05:
{
ring_counter=0;
ring_timer=0;
time6s=0;
timerFlags.timer6sFlag=0;
ring_status=0x00;
}
break;
}
}
void time_t (void)
{
// 3 ms定时器
if(timerFlags.timer3msFlag)
{
if(time3ms==1)
{
time3ms=0;
timerFlags.timer3msFlag=0;
}
else time3ms++;
}
// 1s 定时器
if(timerFlags.timer1sFlag)
{
if(time1s==1000)
{
if(ring_counter>RING_C)ring_timer++;
timerFlags.timer4sFlag=1;//启动4S定时
ring_status=0x04;
time1s=0;
timerFlags.timer1sFlag=0;
if(ring_timer>=RING_T)
{
ZAIJI=1;
sysFlags.zaijiFlag=1;
PORTCbits.RC1=0;
ring_status=0x05; //摘机
}
}
else time1s++;
}
if(timerFlags.timer4sFlag)
{
if(time4s==4000)
{
time4s=0;
timerFlags.timer4sFlag=0;
}
else time4s++;
}
if(timerFlags.timer6sFlag)
{
if(time6s==3000)
{
time6s=0;
ring_counter=0;
ring_timer=0;
timerFlags.timer6sFlag=0;
}
else time6s++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -