⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 该程序是检测电信电话的振铃程序
💻 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 + -