//////////////////////////////////////////////////////////////////////////////// //#define IsDebug //#define tim2Led //#define RxTestDebug //////////////////////////////////////////////////////////////////////////////// #include #define KEY0 KEY[0] //按键 #define KEY1 KEY[1] //紧急按钮取消按键 //============================================================== __root unsigned int BUS_RevBuf[30]; __root unsigned char BUS_RevIndex=0; __root unsigned char BUS_Rev_Cmd[3]; //总线接收 __root unsigned int BUS_RevOverTime=0; //总线接收超时,200 __root unsigned char Bus_RevFlag=0; //总线接收成功 //============================================================== __root unsigned char Ledswitch=2; //RedLED开关 __root unsigned char KEY[2]={0}; //按键 //============================================ __root unsigned char BUS_SendInex=0; __root unsigned char BUS_SendCmd[30]; //应用层发送数据 __root unsigned char BUS_SendingCmd[30]; //定时器正在处理数据 //============================================================== __root unsigned long LocalTime=0; __root unsigned char RunMode=0; //0:表示注册模式,>0表示正常工作模式 __root unsigned char Bus_SendLength=146; //总线发送长度,在注册模式时长度为 //============================================================== __root unsigned char BUS_SendCnt = 0; //重发计数 __root const unsigned char BlankStr[28]="555555555555"; __root const unsigned char DeviceSN[16]="SZFS20250120001"; __root const unsigned char DeviceAddr[10]={0x31,0x08}; __root const unsigned char *Addrp=0; void SysVar_Init(void); void BUS_RevData(void); void GPIO_KEY_Tick(void); void BUS_Rev_Tick(void); void BUS_SendData(unsigned char Length); void GPIO_MIC_SW(unsigned char status); //============================================ #ifdef RxTestDebug unsigned long rxtestDebugcnt=0; #endif //============================================================== void SysVar_Init(void) { Addrp=DeviceAddr; RunMode=0; } //============================================================== void STM8_Init(void) { *((unsigned char*)0x50C6) = 0x18; //16M/8=2M //16M/8=2M } //============================================================== void GPIO_EXTI_Init(void) { EXTI_CR1_PCIS=1; //PC口为下降沿中断 PC_DDR_DDR7=0; PC_CR1_C17=1; PC_CR2_C27=1; } void TIM2_Init(void) { TIM2_IER = 0x00; //禁止中断 TIM2_PSCR = 0x04; //设置预分频寄存器数 TIM2_ARRH =0xFF; TIM2_ARRL =0xFF; TIM2_CNTRH=0x00; //初值 TIM2_CNTRL=0x00; TIM2_CR1 |= 0x01; //开启定时器 } void GPIO_KEY_Init(void) { //============================================== PA_DDR_DDR1=0; PA_DDR_DDR2=0; PA_CR1_C11=1; PA_CR1_C12=1; PA_CR2_C21=0; PA_CR2_C22=0; //============================================== //============================================== PD_DDR_DDR4=0; PD_CR1_C14=1; //带上拉电阻输入 PD_CR2_C24=0; //============================================== KEY0=0; KEY1=0; BUS_SendCnt =0; } void GPIO_LED_Init(void) { PD_DDR_DDR3 =1; //输出引脚 PD_CR1_C13 =1; //推挽输出模式 PD_ODR_ODR3 =0; //输出低电平,LED灭 Ledswitch=2; } void TIM4_1ms_Init(void) { TIM4_PSCR = 0x03; //设置预分频寄存器数 //共8种分频比例1(0),2(1),4(2),8(3),16(4),32(5),64(6),128(7) TIM4_ARR = 0xF9; //设置自动重装载寄存器 TIM4_IER = 0x01; //开启TIM4更新事件中断使能 TIM4_CNTR = 0xF9; //配置TIM4定时器初值,使得开始计数时发生第一次溢出 TIM4_CR1_CEN= 0x01; //使能计数器功能TIM4_CR1寄存器CEN位为“1” } void TIM1_PWM_Init(void) { PC_DDR_DDR4 =1; //============================================= TIM1_PSCRH =0; TIM1_PSCRL =0; //定时器1 时钟不分频 TIM1_ARRH =0; TIM1_ARRL =19; //定时器1的PWM输出频率:2000 000/20=100K TIM1_CR1 &=0x8F; //向上计数,边沿对齐模式 //============================================= TIM1_CCR4H =0; TIM1_CCR4L =10; TIM1_CCMR4 =0x60; //配置CH4为PWM模式1 TIM1_CCER2 &=0x1F; //配置CH4高电平有效 //TIM1_CCER2 |=0x10; //使能CH4输出 TIM1_OISR &=0xBF; //空闲输出低电平 //通道4:100K_50% PWM输出 //============================================= TIM1_CR1 |=0x01; TIM1_BKR =0x80; } void TIM2_PWM_Init(void) { // TIM2_IER = 0x04; // PD_DDR_DDR3 =1; //============================================= TIM2_CCMR2 = TIM2_CCMR2 | 0x70; //配置CH2为PWM模式1 // TIM2_CCER1 &=0x1F; //配置CH2高电平有效 TIM2_CCER1 = TIM2_CCER1 | 0x30; //使能CH2输出 TIM2_ARRH =0; TIM2_ARRL = 19; //定时器1的PWM输出频率:2000 000/100=20K // TIM2_CR1 &=0x8F; //向上计数,边沿对齐模式 //============================================= TIM2_CCR2H =0x0; TIM2_CCR2L =0x00; TIM2_PSCR =0; //0x03 // TIM2_OISR &=0xBF; //空闲输出低电平 //通道2:1K_50% PWM输出 //============================================= TIM2_CR1 = TIM2_CR1 |0x01; // TIM2_BKR =0x80; } void GPIO_LED_Tick(void) { static unsigned long flashTime=0; static unsigned char ledflag=0; static unsigned char ledflagbak=0; #ifdef tim2Led if(Ledswitch==1) { //PD_ODR_ODR3=1; TIM2_CCR2H =0; TIM2_CCR2L =19; ledflag =0; } else if (Ledswitch==2) { if(LocalTime>flashTime) { flashTime=LocalTime+100; ledflag ++; } if (ledflagbak == ledflag ) { return; } ledflagbak = ledflag ; if(ledflag >39 ) { ledflag =0; } TIM2_CCR2H =0x0; if (ledflag > 19 ) { TIM2_CCR2L = (ledflag-19) ; } else if (ledflag > 15 ) { TIM2_CCR2L = (19-ledflag) ; ledflag = 20; } else { TIM2_CCR2L = (19-ledflag) ; } } else { TIM2_CCR2H =0x0; TIM2_CCR2L =0x0; ledflag =0; // PD_ODR_ODR3=0; } #else if(Ledswitch==1) { PD_ODR_ODR3=1; } else if (Ledswitch==2) { PD_ODR_ODR3=1; } else { PD_ODR_ODR3=0; } #endif } void GPIO_KEY_Tick(void) { static unsigned long keyTime1=0; static unsigned char keyResTime =0; //dwd190706 static unsigned long keyTime2=0; static unsigned char keyResTime2 =0; //dwd190706 if(PA_IDR_IDR1==1) //没有按下 { if(KEY0==1) { keyResTime ++; if ( keyResTime < 200) { return; } if(LocalTime>(keyTime1+2000)) KEY0=2; //dwd20190723 else KEY0=2; } else { KEY0=0; } keyTime1=LocalTime+120; } else if(LocalTime>keyTime1) { KEY0=1; keyResTime = 0; } else { keyResTime = 0; } //======================================= if(PD_IDR_IDR4==1) //没有按下 { if(KEY1==1) { keyResTime2 ++; if ( keyResTime2 < 200) { return; } if(LocalTime>(keyTime2+2000)) KEY1=2; else KEY1=2; } else { KEY1=0; } keyTime2=LocalTime+120; } else if(LocalTime>keyTime2) { KEY1=1; keyResTime2 = 0; } else { keyResTime2 = 0; } } void BUS_RevData(void) { //======================================= if(((BUS_Rev_Cmd[0]!=Addrp[0])||(BUS_Rev_Cmd[1]!=Addrp[1]))&&(BUS_Rev_Cmd[2]!=0x0E)) { if((BUS_Rev_Cmd[0]!=0xFF)||(BUS_Rev_Cmd[1]!=0xFF)) return; } //======================================= switch(BUS_Rev_Cmd[2]) { case 0: break; case 1: break; case 2: break; case 3: break; case 4: //主机呼叫分机,或主机应答分机 break; case 5: //主机挂断分机 break; case 6: //广播模式 break; case 7: //打开门灯 break; case 8: //关闭门灯 break; case 9: //取消紧急呼叫 RunMode=1; Ledswitch=0; BUS_SendCnt =0; break; case 13: //注册命令 BUS_SendCmd[0]=Addrp[0]; BUS_SendCmd[1]=Addrp[1]; BUS_SendCmd[2]=0x0D; BUS_SendData(3); break; case 14: if(BUS_Rev_Cmd[1]=='Y') //转换盒已经注册过 { Ledswitch=0; RunMode=1; Bus_SendLength=26; //总线发送长度,在正常工作模式时,为26 (3byes*8+2) } else { RunMode=0; //0:表示注册模式,>0表示正常工作模式 Bus_SendLength=146; } break; } Bus_RevFlag=0xFF; } void BUS_Rev_Tick(void) { static unsigned char i=0,j=0,k=0; if(BUS_RevIndex==26) { BUS_Rev_Cmd[0]=0; BUS_Rev_Cmd[1]=0; BUS_Rev_Cmd[2]=0; for(k=0;k<24;k++) { i=k / 8; j=k % 8; if ((BUS_RevBuf[k]>250)&&(BUS_RevBuf[k]<450)) { BUS_Rev_Cmd[i]|=(1<>4)&0x0F; #ifdef RxTestDebug if(i==j) { BUS_Rev_Cmd[2]=BUS_Rev_Cmd[2]&0x0F; BUS_RevData(); } else { rxtestDebugcnt ++; if (rxtestDebugcnt > 10) //200ms,100s { Ledswitch=1; } } #else BUS_Rev_Cmd[2]=BUS_Rev_Cmd[2]&0x0F; BUS_RevData(); #endif } } //===================TIM4计数溢出更新事件中断响应函数====================== #pragma vector=0x19 __interrupt void TIM4_UPD_OVF_IRQHandler(void) { __root static unsigned char flag=0; unsigned char i,j; TIM4_SR = 0; //清除更新事件中断标志位UIF LocalTime++; // if(BUS_RevOverTime>0)BUS_RevOverTime--; //=================================== if(flag>1) { TIM1_CCER2_CC4E=1; //GPIOA->BSRR = GPIO_Pin_9; //总线为低电平 flag--; return; } else if(flag==1) { TIM1_CCER2_CC4E=0; //GPIOA->BRR = GPIO_Pin_9; //总线为高电平 flag=0; return; } //=================================== if((BUS_SendInex>0)&&(flag==0)) { if(BUS_SendInex==1) //起始位:总线5ms低电平 { flag=5; TIM1_CCER2_CC4E=1; //GPIOA->BSRR = GPIO_Pin_9; BUS_SendInex++; } else if(BUS_SendInex>j)&0x01)>0) //数据位1:2ms低电平 { flag=2; } else //数据位0:1ms低电平 { flag=1; } TIM1_CCER2_CC4E=1; //GPIOA->BSRR = GPIO_Pin_9; BUS_SendInex++; } else if(BUS_SendInex==Bus_SendLength) { flag=0; TIM1_CCER2_CC4E=1; //GPIOA->BSRR = GPIO_Pin_9; BUS_SendInex++; } else { TIM1_CCER2_CC4E=0; BUS_SendInex=0; flag=0; } } } //===================外部IO下降沿中断事件中断响应函数===================== #pragma vector=0x07 __interrupt void EXTI_PORTC_IRQHandler(void) { unsigned int i=0; //=========================================== i=TIM2_CNTRH; i=(i<<8)+TIM2_CNTRL; //=========================================== if(BUS_RevIndex==0) { //=========================================== // BUS_RevOverTime=200; //接收200ms超时 Bus_RevFlag=0; //清除接收标志位 //=========================================== if((i>350)&&(i<800)) { BUS_RevIndex=2; } else { BUS_RevIndex=0; } } else if(BUS_RevIndex==1) { if((i>350)&&(i<800)) { BUS_RevIndex=2; } else { BUS_RevIndex=0; } } else if(BUS_RevIndex<26) { BUS_RevBuf[BUS_RevIndex-2]=i; BUS_RevIndex++; } //=========================================== TIM2_CNTRH=0x00; //初值 TIM2_CNTRL=0x00; } void BUS_SendData(unsigned char Length) { unsigned char i=0,checksum=0; //====================================================== checksum=0; return ; BUS_SendCmd[Length-1]&=0x0F; for(i=0;i0); for(i=0;i KeySentTime)) { //dwd190723 KeySentTime = LocalTime +1000; BUS_SendCnt --; BUS_SendCmd[0]=Addrp[0]; BUS_SendCmd[1]=Addrp[1]; BUS_SendCmd[2]=0x0C; BUS_SendData(3); } else { if(KEY1==2) //紧急呼叫取消 { BUS_SendCmd[0]=Addrp[0]; BUS_SendCmd[1]=Addrp[1]; BUS_SendCmd[2]=0x07; BUS_SendData(3); BUS_SendCnt = 9; } } } } } }