📄 mcs_x51.h
字号:
/****************************************************************
//MCS-51单片机底层操作封装库。
//用户可以添加自己的操作
//create by changshengwuji
//email: netspider@163.com
//qq: 450353168
//2006.05.03
****************************************************************/
#include "../inc/usr_def.h"
#if defined (STC_12X2052X)
#include "../inc/STC12C2052AD.H"
#elif defined (STC_89X51X)
#include "../inc/STC89C51RC_RD_PLUS.H"
#endif
#include "../inc/type.h"
//#include "../inc/mcu.h"
//==========================================================
/***********************INTERRUPT****************************************/
/*IE register*/
#define INT_GLOBAL(X) EA = (X) //总中断控制
#define INT_T0(X) ET0 = (X) //TIMER0
#define INT_T1(X) ET1 = (X) //TIMER1
#define INT_T2(X) ET2 = (X) //TIMER2
#define INT_EXT0(X) EX0 = (X) //EXT0外部中断0控制
#define INT_EXT1(X) EX1 = (X) //EXT1
#define INT_UART(X) ES = (X) //串行中断控制
//-----外部中断------------------------------------
#define EXT0_TRIG_BY_EDGE IT0 = 1 //触发方式
#define EXT0_TRIG_BY_LEVEL IT0 = 0
#define EXT1_TRIG_BY_EDGE IT1 = 1
#define EXT1_TRIG_BY_LEVEL IT1 = 0
#define EXT0IF IE0
#define EXT1IF IE1 //中断标志
//-----------------------------------------
/************************************* 设置堆栈指针***************************/
#define set_sp(x) SP = (x)
/********************************定时器设置***********************************/
/*****************************************************************************/
//-------TIMER0(给TMOD赋值,用或运算)---------------------------
#define T0_START_BY_TR_INT 8 //定时器计数器的启动由int和tr共同控制,同为高启动定时计数器。
#define T0_START_BY_TR 0 //定时计数器的启动由tr控制
#define T0_COUNTER 4 //工作在计数器模式
#define T0_TIMER 0 //工作在定时器模式
#define T0_MODE_0 0 //模式0,13位定时计数器
#define T0_MODE_1 1 //模式1,16位定时计数器
#define T0_MODE_2 2 //模式2,8位数据自动装入
#define T0_MODE_3 3 //模式3,仅用于定时计数器0,2个8位定时计数器
//-------TIMER1(给TMOD赋值,用或运算)---------------------------
#define T1_START_BY_TR_INT 0x80 //定时器计数器的启动由int和tr共同控制,同为高启动定时计数器。
#define T1_START_BY_TR 0 //定时计数器的启动由tr控制
#define T1_COUNTER 0x40 //工作在计数器模式
#define T1_TIMER 0 //工作在定时器模式
#define T1_MODE_0 0 //模式0,13位定时计数器
#define T1_MODE_1 0x10 //模式1,16位定时计数器
#define T1_MODE_2 0x20 //模式2,8位数据自动装入
#define T1_MODE_3 0x30 //模式3,仅用于定时计数器0,2个8位定时计数器
/* TIMER0开始*/
#define T0_START TR0 = 1
/*TIMER0关闭*/
#define T0_SHUT TR0 = 0
/*TIMER1开始*/
#define T1_START TR1 = 1
/*TIMER1关闭*/
#define T1_SHUT TR1 = 0
/* 设置定时器的工作方式*/
#define setup_timer(x) TMOD = (x)
/*设置定时器的时间初值*/
#define set_timer0(x) TH0 = (x)>>8;TL0 = (x)
#define set_timer1(x) TH1 = (x)>>8;TL1 = (x)
/*********************USART*******************************/
/*********************************************************/
#define UART_MODE_0 0 //MODE 0 ,同步移位模式 baud=fosc/12
#define UART_MODE_1 0X40 //MODE 1 ,10BIT 异步收发
#define UART_MODE_2 0X80 //MODE 2 ,11BIT baud = fosc/32 or fosc/64
#define UART_MODE_3 0XC0 //MODE 3 ,11BIT
//--------------------------
#define UART_TIIF_CLR TI = 0
#define UART_RIIF_CLR RI = 0
#define setup_uart(x) SCON = (x)
#define ENABLE_UART_RCV REN = 1
#define DISABLE_UART_RCV REN = 0
#define UART_RATE_MUL PCON |= 0X80 //baudrate *2
#define UART_RATE_NOR PCON &= 0X7F
#define rd_uart() SBUF //读缓冲
#define wr_uart(x) SBUF = (x) //写缓冲
/*********************************EEPROM****************************************/
/*******************************************************************************/
#define EEP_SECTOR1 0X2000 //内部eeprom的起始地址,针对89c52单片机。
//如果为0x1000,则针对89c51单片机
#define EEP_SECTOR2 0X2200 //扇区2
#define EEP_SECTOR3 0X2400 //扇区3
#define EEP_SECTOR4 0X2600 //扇区4
#define EEP_SECTOR5 0X2800 //扇区5
#define EEP_SECTOR6 0X2a00 //扇区6
#define EEP_SECTOR7 0X2c00 //扇区7
#define EEP_SECTOR8 0X2e00 //扇区8
#define CMD_READ 0x01 /* 字节读应用程序区和数据存储区 */
#define CMD_PGM 0x02 /* 字节编程应用程序区和数据存储区 */
#define CMD_SES 0x03 /* 扇区擦除应用程序区和数据存储区 */
#define TRIG1 0x46 //触发序列
#define TRIG2 0xb9
#define USED_SPACE 128 //可以利用的eeprom空间。
#if CLOCK < 40000000
#define WAIT_TIME 0x0
#elif CLOCK < 20000000
#define WAIT_TIME 0x1
#elif CLOCK < 10000000
#define WAIT_TIME 0x2
#elif CLOCK <5000000
#define WAIT_TIME 0x3
#endif
#define set_flsh_addr(x) ISP_ADDRH = (x) >> 8 ; ISP_ADDRL = (x) //设置flash操作地址
#define set_flsh_wait ISP_CONTR &= 0x18 ; ISP_CONTR |= WAIT_TIME //设置等待时间
#define set_flsh_ds ISP_CONTR &= 0x7f //禁止flash操作
#define set_flsh_en ISP_CONTR |= 0X80 //使能flash操作
#define set_flsh_trig(x) ISP_TRIG = (x) //trig 触发
#define flsh_wr_cmd(x) ISP_CMD = (x) //向flash发送命令
#define flsh_wr_data(x) ISP_DATA = (x) //向flash发送数据
#define flsh_rd_data ISP_DATA //从flash读一个数据
#if defined (STC_12X2052X)
//---------AUXR(0X8EH)0000,00XX------------------------
#define SET_T0_DIV_BY_12 AUXR &= 0X7F //设置t0的速度0=12T,1=1T
#define SET_T0_DIV_BY_1 AUXR |= 0x80
#define SET_T1_DIV_BY_12 AUXR &= 0Xbf
#define SET_T1_DIV_BY_1 AUXR |= 0X40
#define SET_UART_M0DIV_BY_12 AUXR &= 0Xdf //设置uart模式0的速度。0,12t速度。1是2t速度。
#define SET_UART_M0DIV_BY_2 AUXR |= 0x20
/*SPI,ADC中断使能*/
#define ENABLE_ADC_INT EADC_SPI = 1; AUXR |= 0X10
#define DISABLE_ADC_INT EADC_SPI = 0; AUXR &= 0XEF
#define ENABLE_SPI_INT EADC_SPI = 1; AUXR |=0X80 //SPI接口中断控制
#define DISABLE_SPI_INT EADC_SPI = 0; AUXR &= 0XF7
#define ENABLE_LVD_INT AUXR |= 0X04;
#define DISABLE_LVD_INT AUXR &= 0XFB; //5v时<3.7v;3v时<2.4v
//-------------------------------------------------------
#define IDLE_CLK_DIV_BY_1 0
#define IDLE_CLK_DIV_BY_2 1
#define IDLE_CLK_DIV_BY_4 2
#define IDLE_CLK_DIV_BY_8 3
#define IDLE_CLK_DIV_BY_16 4
#define IDLE_CLK_DIV_BY_32 5
#define IDLE_CLK_DIV_BY_64 6
#define IDLE_CLK_DIV_BY_128 7
#define set_idle_clk_div_by(x) IDLE_CLK = (x) //空闲模式下的系统时钟分频
//--------------------------------------------------------
#define set_p1_mode(x,y) P1M0 = (x); P1M1 = (y) //设置p1口的模式
#define set_p3_mode(x,y) P3M0 = (x); P3M1 = (y);
/**************************SPI***********************************************/
#define ENABLE_SPI SPCTL |= 0X40
#define DISABLE_SPI SPCTL &= 0XBF
#define SPI_MASTER_BY_SS 0 // SPCTL &= 0X7F
#define SPI_MASTER_BY_MSTR 0X80 //SPCTL |= 0X80
#define SPI_LSB 0X20 //SPCTL |= 0X10
#define SPI_MSB 0 //SPCTL &= 0XDF
#define SPI_MATER_MODE 0X10 //SPCTL |= 0X08
#define SPI_SLAVE_MODE 0 //SPCTL &= 0XF7
#define SPI_CLK_POSITIVE 0 //SPCTL &= 0XFB
#define SPI_CLK_NEGATIVE 0X08 //SPCTL |= 0X04
#define SPI_CLK_PHAF 0X04 //SPCTL |= 0X02
#define SPI_CLK_PHAB 0 //SPCTL &= 0XFD
#define SPI_CLK_DIV_BY_4 0X00
#define SPI_CLK_DIV_BY_16 0X01
#define SPI_CLK_DIV_BY_64 0X02
#define SPI_CLK_DIV_BY_128 0X03
#define setup_spi(x) SPCTL = (x); //spi的工作模式
//----------------------------------------------------------
#define SPIF_CLR SPSTAT |= 0X80
#define SPIF_WCOL SPSTAT |= 0X40
#define SPIF (SPSTAT & 0X80) //中断标志
#define SPWCOL SPSTAT & 0X40; //冲突标志
//------------------------------------------------------------
#define wrb_spi(x) SPDAT = (x) //spi发送一个字节数据
#define rdb_spi() SPDAT //接收一个数据
#endif
/***************WDT*0XE1***********************************************/
#define WDT_FLG WDT_CONTR & 0X80
#define WDT_ENABLE WDT_CONTR |= 0X20
#define WDT_DISABLE WDT_CONTR &= 0XDF
#define WDT_CLR WDT_CONTR |= 0X10
#define WDT_IDLE_ENABLE WDT_CONTR |= 0X08
#define WDT_IDLE_DISABLE WDT_CONTR &= 0XF7
#define WDT_DIV_BY_2 0
#define WDT_DIV_BY_4 1
#define WDT_DIV_BY_8 2
#define WDT_DIV_BY_16 3
#define WDT_DIV_BY_32 4
#define WDT_DIV_BY_64 5
#define WDT_DIV_BY_128 6
#define WDT_DIV_BY_256 7
/* 看门狗溢出时间= (12× prescale ×32768)/时钟频率 */
/**************软件复位 0XE7***************************************************/
#define SOFT_RESET_TO_AP ISP_CONTR = 0X20 //软件复位到用户应用程序区
#define SOFT_RESET_TO_ISP ISP_CONTR = 0X60 //软件复位到ISP程序区
/***************AD************************************************************/
#ifdef STC_12X2052AD
#define AD_CH0 0
#define AD_CH1 1
#define AD_CH2 2
#define AD_CH3 3
#define AD_CH4 4
#define AD_CH5 5
#define AD_CH6 6
#define AD_CH7 7
#define AD_SPEED1 0
#define AD_SPEED2 1
#define AD_SPEED3 2
#define AD_SPEED4 3
#define set_adc_ch(x) ADC_CONTR &= 0XF8 ;ADC_CONTR |= (x) //ad通道选择选择P1口
#define ADC_START ADC_CONTR |= 0X08 //启动AD。在结束前最好不要改变任何IO状态以提高精度
#define ADCIF ADC_CONTR &= 0X10 //ad中断标志,需由软件清0
#define ADCIF_CLR ADC_CONTR &= 0XEF //AD标志清零
#define set_adc_speed(x) ADC_CONTR &= 0X9F; ADC_CONTR |= (x) //ad转换速度
#defien ADC_POWER_ON ADC_CONTR |= 0X80 //打开adc电源。ad启动前一定要打开
#define ADC_POWER_OFF ADC_CONTR &= 0X7F //ad转换结束后可以关闭以节电。初次打开后延时再测量。
//-----------------------------------------------
#define get_adc() ADC_DATA //取得adc的值。ADC_DATA=256*Vin/Vcc
//Vcc是电源电压也是ad的参考电压
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -