美文网首页
中颖SH79F3283驱动程序

中颖SH79F3283驱动程序

作者: 亲我的小乖 | 来源:发表于2019-11-30 15:09 被阅读0次

    Mcu_Init.c文件

    //初始化MCU

    #include "Headinclude.h"

    void f_MCU_FeedDog(void)

    {

        RSTSTAT = 0x01;//bit2-0看门狗时间设置 001-1024ms 000-4096ms

    }

    void f_MCU_Init(void)

    {

        //clock

        //CLKCON = 0b00000100;

      //CLKCON = 0b00100100;//内部RC 27M 2分频

    SET_BANK0();

    CLKCON = 0x00;//

    _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        //IO

        //***********************

        //P0.7 HERINT1      IN    上拉

        //P0.6 wifiPower      OUT  上拉

        //P0.5 BUZ_F          OUT  上拉

        //P0.4 CLK              输出    上拉

        //P0.3 STB              输出    上拉

        //P0.2 DIO              输出    上拉

        //P0.1 MOTOR_PWM  输出  上拉

        //P0.0 bMotor15V      输出  上拉

        //***********************

        P0CR = 0x7f;//0b01111111;//        //=1 输出模式;=0 输入模式 悬空输出高

        P0PCR = 0xff;//0b11111111;        //=1 上拉打开  =0

    P0SS = 0x00;//0x00000000;//

    P0OS = 0x00;//0b00000000;

    P0 = 0xc0;//0b11000000;  wifipower  0  上电  1  掉电

      //************************

      // P1

      // --------------------------------

      // |1.7            | 1.6  |1.5      |1.4    |1.3 |1.2 |1.1 |1.0 |

      // -----------------------------------

      // |PM25power|nlink |nReady|V1RH|TCK|TDI|TMS|TDO|

      // -----------------------------------

      // |OUT          |IN    |IN        |OUT  |OUT|OUT|OUT |OUT |

      // -----------------------------------

      //    上拉            上拉    上拉        上拉

      // ***********************

        P1SS = 0x00;//0b00000000;//IO

        P1CR = 0x90;//0b10010000;//;

        P1PCR = 0xff;//

        P1 = 0xf0;//0b10010000;//1.7  为1  断电  0  上电  1.4同

      //**************************

      // P2

      // 2.7    Reload      输出    上拉

      // 2.6    pGreen    输出    上拉

      // 2.5    nReset      输出  上拉

      // 2.4                    输出  上拉

      // 2.3    wifiTx      输出  上拉 高

      // 2.2    wifiRx      输入  上拉

      // 2.1    PMtx        输出  上拉 高

      // 2.0    PMRx        输入  上拉

      // *************************

        P2SS = 0x00;//0b00000000;

        P2CR = 0xfa;//0b11111110;//  Rx先输出高

        P2PCR = 0xff;//0b11111110;

        P2 = 0x8a;//0b10001010;

      //**************************

      //  P3

      //  .7  auto              输入   

      // .6    resetkey      IN

      //  .5    sleep            IN 

      //  .4    fan              IN    上拉

      //  .3    VORH          输出  上拉

      //  .2    HERINT2      输入  上拉

      //  .1    BUZ_P      输出  上拉

      //  .0    TEST          IN    上拉

      // *************************

        P3SS = 0x00;//0b00000000;

        P3CR = 0x0a;//00001010b;//

        P3PCR = 0xff;//0b11110111;

        P3 = 0xfd;//0b11111101;

        //**************************

        //P4

        //.7    NO

        //.6    NO

        //.5    pRh        输出    上拉    预留  高电平

        //.4    power      输入    上拉

        //.3    Motor_FB  输入   

        //.2    AD_Tr      输入    AD 

        //.1    AD_Rh      输入    AD

        //.0    light        输入    上拉 

        //*************************

        P4CR = 0x20;//0b00100000;

        P4PCR = 0x31;// 0b00110001;

        P4 = 0x31;//0b00000001;

        //**************************

      // P5

      // .3    pBlue      输出  上拉

      // .2    pRed      输出  上拉

      // .1    xtai2      输出 

      // .0    xtal1      输出  上拉

      // *************************

    SET_BANK0();

    BUZCON = 0;

    SET_BANK1();

    P5CR = 0x0C;//0b1111 1100;

        P5PCR = 0x0c;// 0b00001100;

        P5 = 0x00;//0b00000000;

    }

    void f_MCU_Timer2ToBeep(void)

    {

    SET_BANK0();

    TR2 = 0;  //stop timer2

    T2CON = 0;

    TF2 = 0;  //无溢出

    EXF2 = 0;  //;    TF2=0, 定时器2 溢出标志位

        RCLK = 0;                  //;  EXF2=0,T2EX 引脚外部事件输入(下降沿)被检测到的标志位

        TCLK = 0;                  //; RLCK=0; 定时器4产生接收波特率

                                    //; TLCK=0;  定时器4产生发送波特率

    // 以上为 1 ,定时器2产生波特率

    T2CON = 0;//0b00000000;

    //;EXEN2 =0; 此位写0

                                    //;TR2 =0; 停止定时器2

                                    //;C/T2 =0;  此位写0

                                    //;CP/RL2=0; 此位写0

    T2MOD = 0x02;//T2 时钟输出

    //clockout  frequency = (1/4)*fsys/(65536-[RCAP2H,RCAP2L])     

    RCAP2L = 0;

    RCAP2H = 0;//4K频率

    // TR2 = 1;  //定时器启动

    }

    void f_MCU_ADCInit(void)

    {

    SET_BANK0();

    //---------ADC SET------------

        ADCON  = 0x00;    // AVREF=内部ADD; AN3, start: ADCON |=0x1(GO/DONE)

    // ADCON |= (Channel_AN<<1);

    ADCON1 =0x00;    //; RESO=0; 分辨率为12bit; ADDH为高八位, ADDL[3:0]为低四位

    //    ADCON1 |= (Channel_AN>>3);//;CH8=1;  P4.4为ADC输入口; 0  IO口

                                          //;SCH3=1;  //;AN8

        ADT    =  0xff;      // 8MHz, Tad 27us (16tad)

        //ADCH    = 0x08;    // P4.4(AD 通道选择 AN4) -CH4 (Ch3: Leak ad  ;Ch4:Env-temp)

                                      //;SCH3;

    ADCON |= 0x80;//打开ADC模块

    }

    void  f_MCU_Uart(void)   //125us

    {

    SET_BANK1();

    TR4 = 0;  //stop timer4

    T4CON = 0x04;  //0b00000100;//T4PS[3:2]  01 EUART    00  定时器

    //

    //baudrate  9600 = (1/(16*2))*fsys/(65536-[RCAP2H,RCAP2L])     

    TL4 = 0xD9;

    TH4 = 0xff;

    TR4 = 1;  //波特率发生器启动

    SET_BANK0();

    //SMOD 7位 波特率加倍器 0 不加 1 加

    PCON =Bin(00000000);  //;0X80; SSTAT=0:  SCON[7:5]工作方式作为SM0, SM1,SM2

    //EUART0 方式1= 8位EUART,可变波特率,异步全双工

        SCON = Bin(01010000);  //;EUART0:  01:方式1, 8位异步方式, 可变波特率

                                          //;SM[0:1]: 方式1

                                          //;FE(BIT7) --读取;  RXOV(BIT6) ---(SSTAT =1可以读取!)

                                        //;SM2(TXCOL) (BIT5) : 0 ,在方式1下,禁止停止位确认检验,停止位将置RI为1产生中断

                                            //;REN(BIT4): 1 接收允许

                                            //;TB8(BIT3), RB8(BIT2)

                                            //;TI(BIT1) ,RI(BIT0)

    SADEN =0x00;  //;0: 在SADDR中的相应位被忽略;

    // ES0 = 1;

    IPH0 |= 0x10; // s0 第四位

    IPL0 &= 0xef;

    PCON |= 0x40;//工作方式帧出错检测

    //=============EUART 1===========

    SET_BANK1();

    // PCON1 = Bin(10000000);

    SCON1 = Bin(01010000);

    SADDR1 = 0;  //38400  波特率 = 16M/(16*(32768-[SBRTH,SBRTL)+BFINE)

    SADEN1 = 0;

    //#define  BOUND_38400

    //#ifdef  BOUND_38400

    SBRTL = 0xED;

    SBRTH = 0x7f;

    SBRTH |= 0x80;//SBRTEN  0 关闭  1  打开

    BFINE = 0x10;//前四位

    /*

    #else ifdef BOUND_229360

    SBRTL = 0xFC;

    SBRTH = 0x7f;

    SBRTH |= 0x80;//SBRTEN  0 关闭  1  打开

    BFINE = 0x60;//前四位

    #endif

    */

    SET_BANK0();

    IEN1 |= 0x10;

    IENC1 |= 0x20;

    IPL1 |= 0x10;

    IPH1 |= 0x10;//中断优先级  3  最高级

    }

    void f_MCU_Timer5(unsigned int Tcon)

    {

    SET_BANK1();

    T5CON = 0;//7:TF5  0 无溢出  1 溢出 硬件置一

      //5:4  : T5PS  00  不分频  01  1/8  10  1/64  11  1/256

    TL5 = (65536-Tcon)%256;//写入先低后高

    TH5 = (65536-Tcon)/256;

    T5CON |= 0x02;//TR5  = 1  允许

    ET5 = 1;

    SET_BANK0();//中断优先级

    IPH0 &= 0xfd;

    IPL0 |= 0x02;//等级二

    }

    void f_MCU_PWM(void)

    {

    SET_BANK0();

    PWMLO = 0x55;//写入55允许修改

    PWM0C = 0x01;  //PWM输出周期 = [PP0.11,PP0.0] X PWM时钟。

    // 12M/4  PP0.11 0.0 取1000 

    PWM0PL = 0x55;

    PWM0PH = 0x08;

    PWM0DL = 0;            //PWM输出占空比 = [PD0.11,PD0.0] X PWM时钟

    PWM0DH = 0;

    PWM0DT = 0;      //死区时间为(DT0.7 - DT0.0)X t OSC

    PWMEN = 0x82;

    PWMLO = 0xaa; //使不能更改

    }

    void f_Init(void)

    {

    EA = 0;

        f_MCU_Init();

        f_MCU_FeedDog();

        f_MCU_Timer5(TIMER5_COUNT_12M);

        f_MCU_Timer2ToBeep();

        f_MCU_PWM();

    f_MCU_Uart();

    f_MCU_ADCInit();

        EA = 1;

    }

    Mcu_init.h文件

    #ifndef _MCU_INIT_H

    #define _MCU_INIT_H

    //#include "SH79F3283.h"

    #define    CLK_24M_8M      1  // 1  24M    0 8M 

    //;4MHZ ; ----------------------------------------------

    #ifdef  CLK_24M_8M

    #define vBUZ185K    540*3//68  //;270US

    #define vBUZ210K    476*3//60  //;238US

    #define vBUZ240K    416*3//52  //;208US

    #define vBUZ285K    350*3//44  //;175US

    #define vBUZ225K    444*3//56  //;222US

    #define vBUZ165K    606*3//76  //;303US

    #else

    #define vBUZ185K    540//68  //;270US

    #define vBUZ210K    476//60  //;238US

    #define vBUZ240K    416//52  //;208US

    #define vBUZ285K    350//44  //;175US

    #define vBUZ225K    444//56  //;222US

    #define vBUZ165K    606//76  //;303US

    #endif

    // @常量

    #define    OBIT0        0x01    //0x01

    #define    OBIT1        0x02

    #define    OBIT2        0x04

    #define    OBIT3        0x08

    #define    OBIT4        0x10

    #define    OBIT5        0x20

    #define    OBIT6        0x40

    #define    OBIT7        0x80

    //;AND

    #define    ABIT0      0xFE

    #define    ABIT1      0xFD

    #define    ABIT2      0xFB

    #define    ABIT3      0xF7

    #define    ABIT4      0xEF

    #define    ABIT5      0xDF

    #define    ABIT6      0xBF

    #define    ABIT7      0x7F

    //;-------------------------------------------------

    #define    BitSet(A, B)        ( (A)  |= (B) )

    #define    BitClr(A, B)        ( (A)  &= ~(B) )

    #define    BitSet0(A, B)  ( (A) |=(1<<(B)) )

    #define    BitClr0(A, B)  ( (A) &=~(1<<(B)) )

    #define    MIN(A, B)  ( (A)<=(B) ? (A) : (B) )

    //;For bit define

    #define SET_BIT(byte,bit)  (byte|=(1<<bit))    //位置位1 

    #define CLR_BIT(byte,bit)  (byte&=~(1<<bit)) //位清零0 

    #define COM_BIT(byte,bit)  (byte^=(1<<bit))  //位取反~

    #define TEST_BIT(byte,bit) (byte&(1<<bit))  //位测试 Test

    //;---------------------------------------------------

    #define TEST_BIT(byte,bit) (byte&(1<<bit))  //;位测试

    #define MAKEWORD(v1,v2) (((Word)(v1)<<8) + (Word)(v2))

    #define HIBYTE(v1) ((Byte)((v1)>>8))

    #define LOBYTE(v1) ((Byte)((v1)&0xff))

    #define LongToBin(n) \

    (                    \

    ((n >> 21) & 0x80) | \

    ((n >> 18) & 0x40) | \

    ((n >> 15) & 0x20) | \

    ((n >> 12) & 0x10) | \

    ((n >>  9) & 0x08) | \

    ((n >>  6) & 0x04) | \

    ((n >>  3) & 0x02) | \

    ((n      ) & 0x01)  \

    )

    #define Bin(n) LongToBin(0x##n##l) //write binary charactor set,exsample : Bin(11111111) = 0xff

    //;RAM 页面却换----------------------------------------------------------------

    #define SET_BANK1() (INSCON|=OBIT6)    //;BKS0=0(页0); BKS0=1(页1);

    #define SET_BANK0() (INSCON&=~OBIT6)

    #define  BUZ_P  P2_7

    //;

    #define DI() EA=0 //关总中断

    #define EI() EA=1 //开总中断

    #define  pWater_L    P1_6

    #define  pF_C        P1_7

    #define  VALVE        P3_3

    #define  FG          P3_4

    #define  pPUMP        P3_2

    #define  pHfan        P3_1

    #define  pLfan        P3_0

    #define  pCOMP        P3_5

    #define  BP_WIFI      P2_0

    #define  pYL_IN      P2_3

    #define  pWater_IN    P2_4

    #define  YPG_YDL      P2_7

    #define  MOTER_D      P0_1

    #define  MOTER_C      P0_0

    #define  MOTER_B      P1_0

    #define  MOTER_A      P1_1

    #define  IR_REMOT    P2_6

    #define  CHOICESETOUT    (P2CR |= OBIT6)

    //****************************************

    #define  TIMER1_COUNT    1000  //定时器1中断时间

    #define  TIMER2_COUNT    3375  //定时器2中断时间  分频为13.5M,1T 250us=250*13.5/13.5

    #define  TIMER5_COUNT    3000//125us  //24M  24000  1ms//原1600  100us?

    #define  TIMER5_COUNT_12M  1500

    #define  TIMER5_COUNT_8M  1000

    //void f_Init(void);

    void f_MCU_FeedDog(void);

    void f_MCU_ADCInit(void);

    void f_MCU_PWM(void);

    void  f_MCU_Uart(void);

    void f_MCU_ADCInit(void);

    void f_MCU_Init(void);

    void f_Init(void);

    void  f_MCU_UartReset(void);

    #endif

    相关文章

      网友评论

          本文标题:中颖SH79F3283驱动程序

          本文链接:https://www.haomeiwen.com/subject/huuowctx.html