中颖SH79F3283驱动程序
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