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

📄 main.c

📁 st7单片机各个中断程序
💻 C
📖 第 1 页 / 共 2 页
字号:
										//再对这个变量进行判断
	if (gTimer_CSR & TIMER_B_CSR_OCF1)	//判断是否为输出比较1的中断
	{

		TBOC1HR = gTime_Comp >> 8;		//重置输出比较寄存器
		TBOC1LR = gTime_Comp;

		gTime_Comp += TIMER_B_OC1_10MS;	//计算下次重置输出比较寄存器的值

		gTime_10ms_Count++;
		gSCI_Recv_Time++;
		gGSM_Power_Time++;
		gGSM_AT_Time++;
		gGSM_Re_Wait_Time++;
		gATZ_Delay_Time++;
		gGSM_CLCC_Time++;
		g9270_STD_Keep_Time++;
		if (g9270_STD_Keep_Time > 200)
			g9270_STD_Keep_Time = 3;

		if (gTime_10ms_Count > 99)
		{
			gTime_10ms_Count = 0;

			gTime_1s_Count++;

			gGSM_CSQ_Time++;
			gGSM_CMGL_Time++;
			gSend_SMS_Time++;
			gNo_DTMF_Time++;
		}
		return;
	}

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

/*	**********************************************************************
//	PortB中断操作
**********************************************************************	*/
@interrupt void INT_PORTB(void)
{
	unsigned char Data_Temp = 0;

	if (((PBDR&PB0_9270_STD)!=0) && (g9270_STD_Keep_Time>2))
	{
		g9270_STD_Keep_Time = 0;
		Data_Temp = (PEDR>>4);

		if ((Data_Temp>=0x01) && (Data_Temp<=0x09))
		{
			gDTMF_Record_Value = Data_Temp + 0x30;
			gNo_DTMF_Time = 0;
			gStatus_Flag_1 |= GF_1_DTMF_EECV;
		}
		else if (Data_Temp == 0x0A)
		{
			gDTMF_Record_Value = '0';
			gNo_DTMF_Time = 0;
			gStatus_Flag_1 |= GF_1_DTMF_EECV;
		}
		else if (Data_Temp == 0x0B)
		{
			gDTMF_Record_Value = '*';
			gNo_DTMF_Time = 0;
			gStatus_Flag_1 |= GF_1_DTMF_EECV;
		}
		else if (Data_Temp == 0x0C)
		{
			gDTMF_Record_Value = '#';
			gNo_DTMF_Time = 0;
			gStatus_Flag_1 |= GF_1_DTMF_EECV;
		}
	}
	gStatus_Flag_1 |= GF_1_API840_FREE;
	return;
}

/*	**********************************************************************
//	主程序
**********************************************************************	*/
main()
{
	unsigned int	i = 0;

	/*	******************************
	//	端口A的设置
	******************************	*/
	PADDR = 0;
	PAOR = 0;

	PADDR |= PA4_GSM_ICT;
	PAOR |= PA4_GSM_ICT;
	PADR |= PA4_GSM_ICT;
/*
	PADDR |= PA6_I2C_SDA;
	PAOR |= PA6_I2C_SDA;
	PADR &=~PA6_I2C_SDA;

	PADDR |= PA7_I2C_SCL;
	PAOR |= PA7_I2C_SCL;
	PADR &=~PA7_I2C_SCL;
*/
	PADDR |= PA5_I2C_WP;
	PAOR |= PA5_I2C_WP;
	PADR |= PA5_I2C_WP;				//24C02的数据保护管脚,为低时正常读写操作,为高时保护

	/*	******************************
	//	端口B的设置
	******************************	*/
	PBDDR = 0;
	PBOR = 0;

	EICR = 0;						//将PORTB中断设置成上升沿中断
	EICR |= EICR_IS11 + EICR_IPB;	//下降沿均触发

	PBDDR &=~PB0_9270_STD;			//将PORTB口Bit0设置成输入
	PBOR |= PB0_9270_STD;			//设置成普通输入模式

	PBDDR |= PB1_9270_PWDN;
	PBOR |= PB1_9270_PWDN;
	PBDR &=~PB1_9270_PWDN;

	PBDDR |= PB2_HC164_RST;
	PBOR |= PB2_HC164_RST;
	PBDR |= PB2_HC164_RST;

	PBDDR &=~PB1_API840_BUSY;
	PBOR |= PB1_API840_BUSY;		//设置成中断模式

	PBDDR |= PB4_HC164_DATA;
	PBOR |= PB4_HC164_DATA;
	PBDR &=~PB4_HC164_DATA;

	PBDDR |= PB5_HC164_CLK;
	PBOR |= PB5_HC164_CLK;
	PBDR &=~PB5_HC164_CLK;

	PBDDR |= PB6_API840_CS;
	PBOR |= PB6_API840_CS;
	PBDR &=~PB6_API840_CS;			//如果为高,则片选JB09.11101 0503芯片
									//如果为低,则片选JB09204.1 0520芯片
	/*	******************************
	//	端口C的设置
	******************************	*/
	PCDDR = 0;
	PCOR = 0;

	PCDDR |= PC7_UNLOCK;
	PCOR |= PC7_UNLOCK;
	PCDR |= PC7_UNLOCK;				//上锁状态

	PCDDR |= PC6_LOCK;
	PCOR |= PC6_LOCK;
	PCDR &=~PC6_LOCK;

	PCDDR |= PC5_LAMP;				//控制两个方向灯
	PCOR |= PC5_LAMP;				//高有效
	PCDR &=~PC5_LAMP;

	PCDDR |= PC4_ALARM;				//控制喇叭
	PCOR |= PC4_ALARM;				//高有效
	PCDR &=~PC4_ALARM;

	PCDDR |= PC2_BACK_DOOR;			//控制尾门
	PCOR |= PC2_BACK_DOOR;			//高有效
	PCDR &=~PC2_BACK_DOOR;

	PCDDR |= PC3_LED;				//测试架LED
	PCOR |= PC3_LED;				//高有效
	PCDR &=~PC3_LED;

	/*	******************************
	//	端口D的设置
	******************************	*/
	PDDDR = 0;
	PDOR = 0;

	PDDDR |= PD0_GSM_POWER;
	PDOR |= PD0_GSM_POWER;
	PDDR &=~PD0_GSM_POWER;

	/*	******************************
	//	端口E的设置
	******************************	*/
	PEDDR = 0;
	PEOR = 0;

	/*	******************************
	//	端口F的设置
	******************************	*/
	PFDDR = 0;
	PFOR = 0;

	PFDDR &=~PF6_ICAP_RF;
	PFOR &=~PF6_ICAP_RF;

	/*	******************************
	//	串口收发寄存器的设置
	******************************	*/
	SCICR2 = 0;
	SCICR2 |= SCI_CR2_RIE + SCI_CR2_RE;

	SCIETPR = 0;	//Disable extended Baud Rate Generator
	SCIERPR = 0;	//Disable extended Baud Rate Generator
//	SCIBRR = (3<<6) | (2<<3) | 2;	//仿真选择晶震16M,二分频,串口波特率为9600,
	SCIBRR = (3<<6) | (0<<3) | 0;	//仿真选择晶震16M,二分频,串口波特率为38400,
									//PR = 13,TR = 1,RR = 1
									//SCP1:SCP0			1:1
									//SCT2:SCT1:SCT0	0:1:1
									//SCR2:SCR1:SCR0	0:1:1

									/*	******************************
									//外部晶震11.0592M,串口波特率为115200,
									//则11.0592*1000000/(16*115200) = 6 = 2 * 3
									//PR = 3,TR = 2
									******************************	*/

	/*	******************************
	//	定时器使用设置
	******************************	*/
	TACSR = 0;
	TACR1 = 0;
	TACR2 = 0;

	TACSR |= TIMER_A_CSR_TIMD;		//Disable the Timer
//	TACR1 |= TIMER_A_CR1_OCIE;		//Enable OC interrupt
	TACR2 |= TIMER_A_CR2_CC0;		//Prescaler = /2

	TACR1 |= TIMER_A_CR1_ICIE;		//Input Capture Interrupt Enable.
	TACR1 |= TIMER_A_CR1_IEDG1;		//A rising edge triggers the capture

	TACLR = 0;						//Clear the counter
	TACSR = 0;						//Enable the timer

	TBCSR = 0;
	TBCR1 = 0;
	TBCR2 = 0;

	TBCSR |= TIMER_B_CSR_TIMD;		//Disable the Timer
	TBCR1 |= TIMER_B_CR1_OCIE;		//Enable OC interrupt
	TBCR2 |= TIMER_B_CR2_CC0;		//Prescaler = /2
	gTime_Comp = TIMER_B_OC1_10MS - 4;	//第一次使能Timer时,计时器从0xFFFC开始计数,
										//所以第一次输出比较的值要减4
	TBOC1HR = gTime_Comp >> 8;
	TBOC1LR = gTime_Comp;

	gTime_Comp += TIMER_B_OC1_10MS;	//Prepare next time OC value

	TBCLR = 0;						//Clear the counter
	TBCSR = 0;						//Enable the timer

	/*	******************************
	//	I2C中断的一些寄存器设置
	******************************	*/
//	I2C_Init();
	I2CCR = 0;
	I2CCR |= I2C_CR_PE;			//Write PE Twice
	I2CCR |= I2C_CR_PE;			//
	I2CCR |= I2C_CR_ACK;		//ACK Enable

	I2CCCR = 0x23;				//R = 4.7K, Standard Speed 100KB/s,V = 5V

	_asm("rim"); 					//开放全局中断

	/*	******************************
	//	清空缓冲区中的内容
	******************************	*/
	gTime_10ms_Count = 0;
	gTime_1s_Count = 0;

	for (i=0;i<sizeof(gSCI_Recv);i++)
		gSCI_Recv[i] = 0;
	gSCI_Recv_Point = 0;

	for (i=0;i<sizeof(gG_Buffer);i++)
		gG_Buffer[i] = 0;

	gRF_Record_Point = 0;

	/*	******************************
	//	初始化程序时的一些参数设置等
	******************************	*/
	gStatus_Flag_1 = 0;
	gStatus_Flag_2 = 0;
	gStatus_Flag_3 = 0;
	gStatus_Flag_4 = 0;

	gCar_Work_Status = CAR_DEF_FREE;
	gSend_SMS_Er_Count = 0;
	gRF_Command = 0;
	gRF_Record_Char1 = 0;
	gRF_Record_Char2 = 0;
	gRF_Record_Char3 = 0;
	gRF_Char_Command1 = 0;
	gRF_Char_Command2 = 0;
	gRF_Char_Command3 = 0;
	Write_GSM_Re_Power_Value();

	/*	******************************
	//	程序主循环
	******************************	*/
	while (1)
	{

	}
}

⌨️ 快捷键说明

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