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

📄 main.c

📁 st7单片机各个中断程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include	<io72321.h>


#include	"Global_AT_String.h"
#include	"Global_Const.h"
#include	"Global_Const_String.h"
#include	"Global_Bit.h"
#include	"Global_Var.h"

void GSM_Power_Oper(void);
void GSM_Reset_Oper(void);
void GSM_Normal_Oper(void);
void DTMF_API_Oper(void);
void SendString(unsigned char *Str_To_Send,unsigned int Length_Of_SCI_Send);
void SendByte(unsigned char Byte_To_Send);
unsigned char Check_GSM_Ruturn(void);
unsigned char Compare_Str(unsigned char *Comp_Str1,unsigned char *Comp_Str2,unsigned char Comp_Length);
void Wait_GSM_Re_Value(unsigned char *Expt_Re_Value,unsigned char Expt_Re_Length);
void GSM_Reset_Step_Code_1(unsigned char *AT_Command,unsigned char AT_Com_Length,unsigned char *Expt_Re_Value,unsigned char Expt_Re_Length);
void Write_GSM_Re_Power_Value(void);
unsigned char Hex_To_Char(unsigned char Input_Hex);
void Delay_Conut(unsigned int Delay_C);
void Case_GSM_Phone(void);
void Case_GSM_SMS_Send(void);
void Case_GSM_CSQ(void);
void Case_GSM_Phone_Out(void);
void Case_GSM_SMS_Send_Out(void);
void Case_GSM_CSQ_Out(void);
void Case_GSM_SMS_Recv(void);
void Case_GSM_SMS_Recv_Out(void);
unsigned char Char_To_Hex_10(unsigned char Input_Char_H,unsigned char Input_Char_L);
unsigned char Char_To_Hex_16(unsigned char Input_Char_H,unsigned char Input_Char_L);
void Recv_SMS_Deal(void);
void DTMF_API_Ar_Clear(void);

void I2C_Start(void);
void I2C_Slave_Add_Tran(void);
void I2C_Master_Tran(unsigned char Tran_DATA);
unsigned char I2C_Master_Recv(void);
void I2C_Write_Add_Data(unsigned char Word_Address,unsigned char Word_Data);
unsigned char I2C_Read_Add(unsigned char Word_Address);
void I2C_Stop(void);
void API840_Mute(void);
void RF_Check_Deal(void);
/*
void I2C_Write_Byte_24C02(unsigned char Word_Address,unsigned char Word_Data);
unsigned char I2C_Read_Byte_24C02(unsigned char Word_Address);
void I2C_Init(void);
void I2C_Start(void);
void I2C_Stop(void);
//void I2C_Set_Addr(unsigned char Slave_Addr_Write);
void I2C_Write_Data(unsigned char Word_To_Write);
unsigned char I2C_Read_Data(void);
void I2C_Clock(void);
void Delay_1_Cycle(void);
*/

//void Send_SMS_No(unsigned char *Num_Addr,unsigned char Num_Length);
void Send_Hex_Char(unsigned char Hex_To_Send);
void Send_SMS_Head(unsigned char *Num_Addr,unsigned char Num_Length);
void Send_SMS_Cont(unsigned char *Cont_Addr,unsigned char Cont_Length);
void Send_SMS_Length(unsigned char Num_Length,unsigned char Cont_Length);
void GSM_Nor_SMS_Send_Code(unsigned char *Tar_Num,unsigned char Tar_Num_Len,unsigned char *Cont,unsigned char Cont_Len,unsigned int Clr_Flag);
void Send_SMS_ER_Deal(void);
void Send_Hc164_Data(unsigned char Hc164_Sec,unsigned char API840_sc);
//unsigned char Check_DTMF_Record_Value(void);

unsigned char	*OutString;
unsigned char	I2C_Slave_Address = 0;
unsigned char	I2C_Send_Data = 0;
unsigned char	I2C_Recv_Data = 0;

/*	**********************************************************************
//	串口中断操作
**********************************************************************	*/
@interrupt void INT_SCI(void)
{
	unsigned char	chx = 0;
	unsigned int	i = 0;

	if (SCISR & SCI_SR_RDRF)
	{
		gGSM_AT_Time = 0;
		gSCI_Recv_Time = 0;

		if (gSCI_Recv_Point != gSCI_Recv_End)
		{
			gSCI_Recv[gSCI_Recv_Point] = SCIDR;
			gSCI_Recv_Point++;

			if (gSCI_Recv_Point >= sizeof(gSCI_Recv))
				gSCI_Recv_Point = 0;
		}
		else
		{
			SCIDR;
			gSCI_Recv_Point = 0;
		}
	}

	if (SCISR & SCI_SR_TC)
	{
		chx = *OutString;							//用一个局部变量可以节省一次指针操作

		if (gLength > 0)
		{
			SCIDR = chx;

			while ((SCISR&SCI_SR_TC) == 0);			//等待上一个发送字节发送完成

			gGSM_AT_Time = 0;

			OutString++;
			gLength--;
		}
		else
		{
			SCICR2 &=~SCI_CR2_TCIE;
			SCICR2 &=~SCI_CR2_TE;	//所有字节已发送,关闭中断
		}
		return;
	}
	return;
}

/*	**********************************************************************
//	TimerA中断操作
**********************************************************************	*/
@interrupt void INT_TimerA(void)
{
	unsigned char i = 0;

	gTimer_CSR = TACSR;					//读CSR寄存器涉及到清除状态标志位,
										//所以不适宜反复读,应将CSR的值读到一个变量中
										//再对这个变量进行判断
	if ((gTimer_CSR&TIMER_A_CSR_ICF1) != 0)
	{
		TAIC1LR;

		TBCSR &=~TIMER_B_CR1_OCIE;		//Disable the Timer

		if ((TACR1&TIMER_A_CR1_IEDG1) != 0)
		{
			TACR1 &=~TIMER_A_CR1_IEDG1;
			gIC_Rise_Time = TAIC1R;											//记录上升沿跳变的时间点

			if (gIC_Rise_Time > gIC_Fall_Time)
				gIC_Keep_L_Time = gIC_Rise_Time - gIC_Fall_Time;			//为低的时间断长度
			else
				gIC_Keep_L_Time = (65535-gIC_Fall_Time) + gIC_Rise_Time;

			if (((gIC_Keep_H_Time+gIC_Keep_L_Time)>5000)
			 && ((gIC_Keep_H_Time+gIC_Keep_L_Time)<8000))
			{
				if ((gIC_Keep_H_Time>1000) && (gIC_Keep_H_Time<2000)
				 && (gIC_Keep_L_Time>4000) && (gIC_Keep_L_Time<6000))		//为高的时间比较短
				{
					if (gRF_Record_Point < 8)
					{
						gRF_Record_Char1 = gRF_Record_Char1 << 1;
						gRF_Record_Char1 &=~0x01;

						gRF_Record_Point++;
					}
					else if (gRF_Record_Point < 16)
					{
						gRF_Record_Char2 = gRF_Record_Char2 << 1;
						if ((gRF_Record_Char1&BIT7) == 0)
							gRF_Record_Char2 &=~0x01;
						else
							gRF_Record_Char2 |= 0x01;

						gRF_Record_Char1 = gRF_Record_Char1 << 1;
						gRF_Record_Char1 &=~0x01;

						gRF_Record_Point++;
					}
					else if (gRF_Record_Point < 24)
					{
						gRF_Record_Char3 = gRF_Record_Char3 << 1;
						if ((gRF_Record_Char2&BIT7) == 0)
							gRF_Record_Char3 &=~0x01;
						else
							gRF_Record_Char3 |= 0x01;

						gRF_Record_Char2 = gRF_Record_Char2 << 1;
						if ((gRF_Record_Char1&BIT7) == 0)
							gRF_Record_Char2 &=~0x01;
						else
							gRF_Record_Char2 |= 0x01;

						gRF_Record_Char1 = gRF_Record_Char1 << 1;
						gRF_Record_Char1 &=~0x01;

						gRF_Record_Point++;
					}
				}
				else if ((gIC_Keep_L_Time>1000) && (gIC_Keep_L_Time<2000)
					  && (gIC_Keep_H_Time>4000) && (gIC_Keep_H_Time<6000)) 	//为低的时间比较短
				{
					if (gRF_Record_Point < 8)
					{
						gRF_Record_Char1 = gRF_Record_Char1 << 1;
						gRF_Record_Char1 |= 0x01;

						gRF_Record_Point++;
					}
					else if (gRF_Record_Point < 16)
					{
						gRF_Record_Char2 = gRF_Record_Char2 << 1;
						if ((gRF_Record_Char1&BIT7) == 0)
							gRF_Record_Char2 &=~0x01;
						else
							gRF_Record_Char2 |= 0x01;

						gRF_Record_Char1 = gRF_Record_Char1 << 1;
						gRF_Record_Char1 |= 0x01;

						gRF_Record_Point++;
					}
					else if (gRF_Record_Point < 24)
					{
						gRF_Record_Char3 = gRF_Record_Char3 << 1;
						if ((gRF_Record_Char2&BIT7) == 0)
							gRF_Record_Char3 &=~0x01;
						else
							gRF_Record_Char3 |= 0x01;

						gRF_Record_Char2 = gRF_Record_Char2 << 1;
						if ((gRF_Record_Char1&BIT7) == 0)
							gRF_Record_Char2 &=~0x01;
						else
							gRF_Record_Char2 |= 0x01;

						gRF_Record_Char1 = gRF_Record_Char1 << 1;
						gRF_Record_Char1 |= 0x01;

						gRF_Record_Point++;
					}
				}
				else
				{
					gRF_Record_Char1 = 0;
					gRF_Record_Char2 = 0;
					gRF_Record_Char3 = 0;

					gRF_Record_Point = 0;
				}

				if (gRF_Record_Point == 24)
				{
					gRF_Char_Command3 = gRF_Record_Char3;
					gRF_Char_Command2 = gRF_Record_Char2;
					gRF_Char_Command1 = gRF_Record_Char1;

					if ((gRF_Char_Command3==SPECIAL_NO_1) && (gRF_Char_Command2==SPECIAL_NO_2))
					{
						if (gRF_Char_Command3 == SPECIAL_NO_3)
						{
						}
						else if (gRF_Char_Command3 == SPECIAL_NO_4)
						{
						}
						else if (gRF_Char_Command3 == SPECIAL_NO_5)
						{
						}
						else if (gRF_Char_Command3 == SPECIAL_NO_6)
						{
						}
					}

					gStatus_Flag_1 |= GF_1_RF_RECV;
				}
			}
			else
			{
				gRF_Record_Char1 = 0;
				gRF_Record_Char2 = 0;
				gRF_Record_Char3	= 0;

				gRF_Record_Point = 0;
			}
		}
		else
		{
			TACR1 |= TIMER_A_CR1_IEDG1;
			gIC_Fall_Time = TAIC1R;											//记录下降沿跳变的时间点

			if (gIC_Fall_Time > gIC_Rise_Time)
				gIC_Keep_H_Time = gIC_Fall_Time - gIC_Rise_Time;			//为高的时间断长度
			else
				gIC_Keep_H_Time = (65535-gIC_Rise_Time) + gIC_Fall_Time;
		}

		TBCSR |= TIMER_B_CR1_OCIE;		//Enable the Timer
		return;
	}

	if (gTimer_CSR & TIMER_A_CSR_TOF) //若有计数器溢出标志
	{
		TACLR;						//清除该标志
		return;
	}
	/*	******************************
	//一个定时器中的两路输出比较中断不能单独使能
	//这里必须清除另一路输出比较的中断
	******************************	*/
	if (gTimer_CSR & TIMER_A_CSR_OCF2)//判断是否为输出比较2的中断
	{
		TAOC2LR;					//读低八位清除输出比较2的标志
		return;
	}
}

/*	**********************************************************************
//	TimerB中断操作
**********************************************************************	*/
@interrupt void INT_TimerB(void)
{
	gTimer_CSR = TBCSR;					//读CSR寄存器涉及到清除状态标志位,
										//所以不适宜反复读,应将CSR的值读到一个变量中

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -