中颖SH79F3283驱动程序

2019-11-30  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读