FT60F211驱动雾化片C源码

[复制链接]
查看17 | 回复0 | 2021-7-30 15:58:09 | 显示全部楼层 |阅读模式
//*********************************************************
/*  文件名:TEST_60F11x_PWM1.c
*        功能: 超声波雾化器
*   IC:    FT60F211 SOP8
*   晶振:  16M/2T                    
*   说明:  PWM1~PWM6输出10KHz占空比50%的波形
*                                    
*                  FT60F211  SOP8
*                 ----------------
*  VDD-----------|1(VDD)   (VSS)16|------------VSS     
*  NC------------|2(PA7)   (PA0)15|------------NC
*  NC------------|3(PA6)   (PA1)14|------------NC
*  NC------------|4(PA5)   (PA2)13|------------NC
*  NC------------|5(PA4)   (PA3)12|------------NC
*  PWM1----------|6(PC5)   (PC0)11|------------PWM6
*  PWM2----------|7(PC4)   (PC1)10|------------PWM5
*  PWM3----------|8(PC3)   (PC2)09|------------PWM4
*                              ----------------
*/
//*********************************************************
#include "SYSCFG.h"
//*********************************************************
//***********************宏定义*****************************
#define  unchar     unsigned char
#define  unint      unsigned int
#define  unlong     unsigned long

#define  key             PA0
#define  led1             PA4
#define  led2             PC5
#define  bth                     PA5
#define  vin                     PA1

volatile unsigned char           flga              @ 0x040;
volatile bit f_key                @ ((unsigned)&flga*8)+0;
volatile bit f_clos                @ ((unsigned)&flga*8)+1;
volatile bit f_1s                      @ ((unsigned)&flga*8)+2;
volatile bit f_5s                      @ ((unsigned)&flga*8)+3;
//volatile bit f_run                      @ ((unsigned)&flga*8)+4;
#ifndef _LIB_BUILD
volatile union
{
        struct
    {
                unsigned        f_key                       : 1;
        unsigned f_clos                                : 1;
        unsigned f_1s                                        : 1;
        unsigned f_5s                                        : 1;
      //  unsigned f_run                                        : 1;
        };
}flgabits @ 0x40;
#endif
unchar  timer_data,timer_data1;
/*-------------------------------------------------
*  函数名:POWER_INITIAL
*        功能:  上电系统初始化
*  输入:  无
*  输出:  无
--------------------------------------------------*/
//********************************************************
//**************中断处理**********************************
void interrupt ISR(void)                        //PIC_HI-TECH使用
{
   
  //定时器2的中断处理**********************
        if(TMR2IE && TMR2IF)                        //100us中断一次 = 5KHz
        {
                TMR2IF = 0;

                //DemoPortOut = ~DemoPortOut; //翻转电平
        }
}
/*-------------------------------------------------
*  函数名:POWER_INITIAL
*        功能:  上电系统初始化
*  输入:  无
*  输出:  无
--------------------------------------------------*/        
void POWER_INITIAL (void)
{
         
        OSCCON = 0B01110001;        //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
                                                         //Bit0=1,系统时钟为内部振荡器
                                                         //Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择

        INTCON = 0;                          //暂禁止所有中断
        PORTA  = 0B00000001;               
        TRISA          = 0B00000011;        //PA输入输出 0-输出 1-输入
                                                        //PA4->输出
                                                
        PORTC  = 0B00000000;         
        TRISC  = 0B00000000;        //PC输入输出 0-输出 1-输入  
                                                               
        WPUA   = 0B00000001;    //PA端口上拉控制 1-开上拉 0-关上拉
                                                        //开PA6上拉
        WPUC   = 0B0000000;    //PC端口上拉控制 1-开上拉 0-关上拉
                                                        //60系列PC口无上拉        
    WDTCON = 0B00010001;                       
    PCON=0x51;                       
        OPTION = 0B00001000;        //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
                                                         //Bit7(PAPU)=0 ENABLED PULL UP PA
                             
   // PSRCA  = 0B11111111;  //源电流设置最大
//   PSRCC  = 0B11111111;
  //  PSINKA = 0B11111111;    //灌电流设置最大
  //  PSINKC = 0B11111111;
                     
    MSCON  = 0B00110001;                           
    //BIT5:PSRCAH4和PSRCA[4]共同决定源电流。00:4mA; 11: 33mA; 01、10:8mA
    //BIT4:PSRCAH3和PSRCA[3]共同决定源电流。00:4mA; 11: 33mA; 01、10:8mA
    //BIT3:UCFG1<1:0>为01时此位有意义。0:禁止LVR;1:打开LVR
    //BIT2:快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
    //BIT1:0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
    //BIT0:0:睡眠时停止工作:1: 睡眠时保持工作。当T2时钟不是选择指令时钟的时候

}
/*-------------------------------------------------
* 函数名称:   TIMER2_INITIAL
* 功能:      初始化设置定时器2
* 相关寄存器: T2CON TMR2 PR2 TMR2IE TMR2IF PEIE GIE
-------------------------------------------------*/
void PWM1_INITIAL (void)
{   
    T2CON0  = 0B00000000;                         //T2预分频1:1,后分频1:4
    //BIT7: 0:无意义; 1:把PR2/P1xDTy缓冲值分别更新到PR2寄存器和P1xDTy_ACT
    //BIT6~BIT3: 定时器2输出后分频比选择 0000:1:1;0001:1:2;……1:16
    //BIT2:0:关闭定时器2;1:打开定时器2
    //BIT1~0:定时器2预分频选择 00:1;01:4;1x:16
   
        T2CON1  = 0B00000001;                   //T2时钟来自系统时钟,PWM1连续模式
        //BIT4: PWM模式选择 0:连续模式;1:单脉冲模式
    //BIT3: 0:PWM模式;1:蜂鸣器模式        
    //Timer2时钟源选择:000:指令时钟;001:系统时钟;010:HIRC的2倍频;100:HIRC;101:LIRC
                                                   
    TMR2H          = 0;                                        //定时器2计数寄存器
    TMR2L   = 140;
   
   
        PR2H    = 0;                                         //周期=(PR+1)*Tt2ck*TMR2预分频(蜂鸣器模式周期*2)
        PR2L    = 140;         
   
    P1CDTH        = 0;                                        //脉宽=P1xDT*Tt2ck*TMR2预分频(蜂鸣器模式没用到)
    P1CDTL        = 50;
   
        P1AUX                =0x00;
    P1BR1                =0x08;
    P1OE         = 0B10000000;                        //充许P1A0输出PWM(配置成timer定时器时这位清零)
    //BIT7: 0:禁止P1C输出到管脚;1:充许P1C输出到管脚
    //BIT6: 0:禁止P1B输出到管脚;1:充许P1B输出到管脚
    //BIT5~BIT0: 0:禁止P1Ax输出到管脚;1:充许P1Ax输出到管脚
   
    P1POL         = 0B00000000;                        //高电平有效
    //BIT7: 0:P1C高电平有效;1:P1C低电平有效
    //BIT6: 0:P1B高电平有效;1:P1B低电平有效
    //BIT5~BIT0: 0:P1Ax高电平有效;1:P1Ax低电平有效
   
    P1CON        = 0B00000000;
    //BIT7:PWM1 重启使能位
        //1 = 故障刹车时,P1BEVT位在退出关闭事件时自动清零,PWM1自动重启
        //0 = 故障刹车时,必须用软件将P1BEVT清零以重启PWM1
    //BIT6~0:PWM1死区时间设置
        //P1DCn = 预定MPWM信号应转变为有效与PWM信号实际转为有效之间的T2CK周期数
        
    MSCON   = 0B00110001;                    //bit0: 0:T2睡眠时停止工作        
    //BIT5:PSRCAH4和PSRCA[4]共同决定源电流。00:4mA; 11: 33mA; 01、10:8mA
    //BIT4:PSRCAH3和PSRCA[3]共同决定源电流。00:4mA; 11: 33mA; 01、10:8mA
    //BIT3:UCFG1<1:0>为01时此位有意义。0:禁止LVR;1:打开LVR
    //BIT2:快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
    //BIT1:0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
    //BIT0:0:睡眠时停止工作:1: 睡眠时保持工作。当T2时钟不是选择指令时钟的时候
     
                                                                         //设置TMR2输出比较值定时15us=(1/4000000)*60(PR2)
        TMR2IF  = 0;                                        //清TMER2中断标志
        //TMR2IE = 1;                                                //使能TMER2的中断(配置成timer定时器时不注释)
        TMR2ON  = 1;                                        //使能TMER2启动
        PEIE    = 1;                                    //使能外设中断
        GIE     = 1;                                           //使能全局中断
}
/*-----------------------------------------------------------------------------
*PWM复位
------------------------------------------------------------------------------*/
void PWM_clos(void)
{
     MSCON  = 0x00;
     P1OE         = 0x00;
     P1BR1                =0x00;
     T2CON1  = 0x00;
     TMR2ON  = 0;                                        //关闭TMER2
     PEIE    = 0;                           
         GIE     = 0;                                           //关全局中断
     PA2=0;
         led1=led2=0;
     f_key=0;
     f_clos=0;
}
/*-------------------------------------------------
*  函数名称:DelayUs
-------------------------------------------------*/
void DelayUs(unsigned char Time)
{
    /*  功能:    短延时函数 --16M-4T--大概快1%左右.
*  输入参数:Time 延时时间长度 延时时长Time*2 Us
*         返回参数:无 */
        unchar a;
        for(a=0;a<Time;a++)
        {
                NOP();
        CLRWDT();
        }
}  
/*-------------------------------------------------
*         函数名称: DelayMs
-------------------------------------------------*/
void DelayMs(unsigned char Time)
{
    /* *         功能:    短延时函数
*         输入参数:Time 延时时间长度 延时时长Time ms
*         返回参数:无 */
        unsigned char a,b;
  //  CLRWDT();
        for(a=0;a<Time;a++)
        {
                for(b=0;b<5;b++)
                {
                         DelayUs(98);               //快1%
                }
        }
}
/*----------------------------------------------------
系统时钟
------------------------------------------------------*/
void sys_timer(void)
{
        timer_data++;
    if(timer_data>=20)
    {
        timer_data=0x00;
        f_1s=1;
        timer_data1++;
        if(timer_data1>=5)
        {
            timer_data1=0x00;
                        f_5s=1;
        }
    }
}
/*---------------------------------------------------
*
*按键开关
------------------------------------------------------*/
void Key (void)
{
     if(f_key==1)
    {
        if (key==0)
        {
                        DelayMs(60);
                        while (!key)
                        {
                                        CLRWDT();                      //清看门狗
                    PWM_clos();
                        }
         }
      }
        else
    {
                if (key ==0)
        {
                        DelayMs(60);
            if (key ==0)
            {
                                while (!key)
                                {
                                        CLRWDT();                      //清看门狗
                                }
                                led1=led2=1;
                                PWM1_INITIAL();                  //初始化T2
                                f_key=1;
                                f_clos=1;
             }
                }
        }
}
/*-------------------------------------------------------------
*电源状态
----------------------------------------------------------------*/
void power (void)
{
    if(vin==1)
    {
      
       DelayUs(50);
       if(vin==1)
       {
           PORTA|= 0X20;
           TRISA|=0x20;
            WPUA|=0x20;
                        if (bth==1)
                        {
               // if(f_key==1){led1=led2=1;}
                                led1=1;
                        }
                        else if (bth==0)
                        {
                                if(f_1s==1)
                                {
                                        f_1s=0;
                                        led1=~led1;
                                }  
                        }
       }
    }
    else
    {
        if(vin==0)
        {
            if(f_key==0){led1=led2=0;}
            PORTA&= 0XDF;
            TRISA&= 0XDF;
            WPUA&=0xDF;
            
                        LVDEN=1;
                        DelayUs(20);
                        if (LVDW==1)
                        {
                                if(f_5s==1)
                                {
                    f_5s=0;
                                        led1=led2=1;
                                        DelayMs(20);
                                        led1=led2=0;
                                }
                        }
                        LVDEN=0;

        }
    }
}
/*-------------------------------------------------
*  函数名: main
*        功能:  主函数
*  输入:  无
*  输出:  无
--------------------------------------------------*/
void main()
{
        POWER_INITIAL();                //系统初始化
         flga=0x00;
        WDTCON=0X0b;
        while(1)
        {
        CLRWDT();                      //清看门狗
                NOP();
             SLEEP();
         
        sys_timer();
        Key ();
        power ();
           }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则