123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678 |
- ////////////////////////////////////////////////////////////////////////////////
- //#define IsDebug
- //#define tim2Led
- //#define RxTestDebug
- ////////////////////////////////////////////////////////////////////////////////
- #include <iostm8s003f3.h>
- #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<<j);
- }
- }
- BUS_RevIndex=0;
- i=(BUS_Rev_Cmd[0]+ BUS_Rev_Cmd[1]+(BUS_Rev_Cmd[2]&0x0F))&0x0F;
- j=(BUS_Rev_Cmd[2]>>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<Bus_SendLength)
- {
- i=(BUS_SendInex-2)/8;
- j=(BUS_SendInex-2)%8;
- if(((BUS_SendingCmd[i]>>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;i<Length;i++)
- {
- checksum+=BUS_SendCmd[i];
- }
- BUS_SendCmd[Length-1]|=((checksum&0x0F)<<4);
- //计算校验值
- //======================================================
- while(BUS_SendInex>0);
-
- for(i=0;i<Length;i++)
- {
- BUS_SendingCmd[i]=BUS_SendCmd[i];
- }
- BUS_SendInex=1;
- }
- int main( void )
- {
- static unsigned long KeySentTime=0;
- unsigned char i;
- unsigned long TurnOnDelay=3600000; //上电延时60分钟,自动进入工作模式
- unsigned char TurnOnMode=0;
- //========================================================
- STM8_Init();
- GPIO_EXTI_Init();
- #ifndef tim2Led
- TIM2_Init();
- #endif
- GPIO_LED_Init();
- TIM4_1ms_Init();
- GPIO_KEY_Init();
- TIM1_PWM_Init();
- #ifdef tim2Led
- TIM2_PWM_Init();
- #endif
- SysVar_Init();
-
- //========================================================
- asm("rim"); //改变主程序软件优先级“开启中断”
- while(1)
- {
- if ((TurnOnDelay<LocalTime)&&(TurnOnMode==0))
- {
- RunMode=1;
- Bus_SendLength=26; //总线发送长度,在正常工作模式时,为26 (3byes*8+2)
- TurnOnMode=0xFF;
- Ledswitch=0;
- }
- //====================================================
- BUS_Rev_Tick();
- GPIO_LED_Tick();
- GPIO_KEY_Tick();
- //===================================================
- if(RunMode==0)
- {
- if(KEY0==2)
- {
- BUS_SendCmd[0]=Addrp[0];
- BUS_SendCmd[1]=Addrp[1];
- for(i=0;i<15;i++)
- {
- BUS_SendCmd[2+i]=DeviceSN[i];
- }
- BUS_SendCmd[17]=0x0E;
- BUS_SendData(18);
-
- //在注册模式下,用户按键,则发送注册码!
- if(Ledswitch==0)
- {
- Ledswitch=2;
- }
- else
- {
- Ledswitch=0;
- }
- }
- }
- else
- {
- if(KEY0==2) //紧急呼叫
- {
- BUS_SendCmd[0]=Addrp[0];
- BUS_SendCmd[1]=Addrp[1];
- BUS_SendCmd[2]=0x0C;
- BUS_SendData(3);
- Ledswitch=2;
- BUS_SendCnt = 9;
- KeySentTime = LocalTime +1000;
- } else if(KEY0==3) //长按关闭指示灯
- {
- Ledswitch=0; //dwd190802
- }else {
- if ((BUS_SendCnt ) && (LocalTime> 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;
- }
-
- }
-
- }
-
-
-
- }
- }
- }
|