?? mcs_x51.h
字號(hào):
/****************************************************************
//MCS-51單片機(jī)底層操作封裝庫(kù)。
//用戶可以添加自己的操作
//create by changshengwuji
//email: netspider@163.com
//qq: 450353168
//2006.05.03
****************************************************************/
#include "usr_def.h"
#if defined (STC_12X2052X)
//#include "stc12c2052.H"
#elif defined (STC_89X51X)
#include "STC89C51RC_RD_PLUS.H"
#endif
#include "type.h"
//#include "../EromINC/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 //觸發(fā)方式
#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 //中斷標(biāo)志
//-----------------------------------------
/************************************* 設(shè)置堆棧指針***************************/
#define set_sp(x) SP = (x)
/********************************定時(shí)器設(shè)置***********************************/
/*****************************************************************************/
//-------TIMER0(給TMOD賦值,用或運(yùn)算)---------------------------
#define T0_START_BY_TR_INT 8 //定時(shí)器計(jì)數(shù)器的啟動(dòng)由int和tr共同控制,同為高啟動(dòng)定時(shí)計(jì)數(shù)器。
#define T0_START_BY_TR 0 //定時(shí)計(jì)數(shù)器的啟動(dòng)由tr控制
#define T0_COUNTER 4 //工作在計(jì)數(shù)器模式
#define T0_TIMER 0 //工作在定時(shí)器模式
#define T0_MODE_0 0 //模式0,13位定時(shí)計(jì)數(shù)器
#define T0_MODE_1 1 //模式1,16位定時(shí)計(jì)數(shù)器
#define T0_MODE_2 2 //模式2,8位數(shù)據(jù)自動(dòng)裝入
#define T0_MODE_3 3 //模式3,僅用于定時(shí)計(jì)數(shù)器0,2個(gè)8位定時(shí)計(jì)數(shù)器
//-------TIMER1(給TMOD賦值,用或運(yùn)算)---------------------------
#define T1_START_BY_TR_INT 0x80 //定時(shí)器計(jì)數(shù)器的啟動(dòng)由int和tr共同控制,同為高啟動(dòng)定時(shí)計(jì)數(shù)器。
#define T1_START_BY_TR 0 //定時(shí)計(jì)數(shù)器的啟動(dòng)由tr控制
#define T1_COUNTER 0x40 //工作在計(jì)數(shù)器模式
#define T1_TIMER 0 //工作在定時(shí)器模式
#define T1_MODE_0 0 //模式0,13位定時(shí)計(jì)數(shù)器
#define T1_MODE_1 0x10 //模式1,16位定時(shí)計(jì)數(shù)器
#define T1_MODE_2 0x20 //模式2,8位數(shù)據(jù)自動(dòng)裝入
#define T1_MODE_3 0x30 //模式3,僅用于定時(shí)計(jì)數(shù)器0,2個(gè)8位定時(shí)計(jì)數(shù)器
/* TIMER0開始*/
#define T0_START TR0 = 1
/*TIMER0關(guān)閉*/
#define T0_SHUT TR0 = 0
/*TIMER1開始*/
#define T1_START TR1 = 1
/*TIMER1關(guān)閉*/
#define T1_SHUT TR1 = 0
/* 設(shè)置定時(shí)器的工作方式*/
#define setup_timer(x) TMOD = (x)
/*設(shè)置定時(shí)器的時(shí)間初值*/
#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 異步收發(fā)
#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 //內(nèi)部eeprom的起始地址,針對(duì)89c52單片機(jī)。
//如果為0x1000,則針對(duì)89c51單片機(jī)
#define EEP_SECTOR2 0X2200 //扇區(qū)2
#define EEP_SECTOR3 0X2400 //扇區(qū)3
#define EEP_SECTOR4 0X2600 //扇區(qū)4
#define EEP_SECTOR5 0X2800 //扇區(qū)5
#define EEP_SECTOR6 0X2a00 //扇區(qū)6
#define EEP_SECTOR7 0X2c00 //扇區(qū)7
#define EEP_SECTOR8 0X2e00 //扇區(qū)8
#define CMD_READ 0x01 /* 字節(jié)讀應(yīng)用程序區(qū)和數(shù)據(jù)存儲(chǔ)區(qū) */
#define CMD_PGM 0x02 /* 字節(jié)編程應(yīng)用程序區(qū)和數(shù)據(jù)存儲(chǔ)區(qū) */
#define CMD_SES 0x03 /* 扇區(qū)擦除應(yīng)用程序區(qū)和數(shù)據(jù)存儲(chǔ)區(qū) */
#define TRIG1 0x46 //觸發(fā)序列
#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) //設(shè)置flash操作地址
#define set_flsh_wait ISP_CONTR &= 0x18 ; ISP_CONTR |= WAIT_TIME //設(shè)置等待時(shí)間
#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 觸發(fā)
#define flsh_wr_cmd(x) ISP_CMD = (x) //向flash發(fā)送命令
#define flsh_wr_data(x) ISP_DATA = (x) //向flash發(fā)送數(shù)據(jù)
#define flsh_rd_data ISP_DATA //從flash讀一個(gè)數(shù)據(jù)
#if defined (STC_12X2052X)
//---------AUXR(0X8EH)0000,00XX------------------------
#define SET_T0_DIV_BY_12 AUXR &= 0X7F //設(shè)置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 //設(shè)置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時(shí)<3.7v;3v時(shí)<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) //空閑模式下的系統(tǒng)時(shí)鐘分頻
//--------------------------------------------------------
#define set_p1_mode(x,y) P1M0 = (x); P1M1 = (y) //設(shè)置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) //中斷標(biāo)志
#define SPWCOL SPSTAT & 0X40; //沖突標(biāo)志
//------------------------------------------------------------
#define wrb_spi(x) SPDAT = (x) //spi發(fā)送一個(gè)字節(jié)數(shù)據(jù)
#define rdb_spi() SPDAT //接收一個(gè)數(shù)據(jù)
#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
/* 看門狗溢出時(shí)間= (12× prescale ×32768)/時(shí)鐘頻率 */
/**************軟件復(fù)位 0XE7***************************************************/
#define SOFT_RESET_TO_AP ISP_CONTR = 0X20 //軟件復(fù)位到用戶應(yīng)用程序區(qū)
#define SOFT_RESET_TO_ISP ISP_CONTR = 0X60 //軟件復(fù)位到ISP程序區(qū)
/***************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 //啟動(dòng)AD。在結(jié)束前最好不要改變?nèi)魏蜪O狀態(tài)以提高精度
#define ADCIF ADC_CONTR &= 0X10 //ad中斷標(biāo)志,需由軟件清0
#define ADCIF_CLR ADC_CONTR &= 0XEF //AD標(biāo)志清零
#define set_adc_speed(x) ADC_CONTR &= 0X9F; ADC_CONTR |= (x) //ad轉(zhuǎn)換速度
#defien ADC_POWER_ON ADC_CONTR |= 0X80 //打開adc電源。ad啟動(dòng)前一定要打開
#define ADC_POWER_OFF ADC_CONTR &= 0X7F //ad轉(zhuǎn)換結(jié)束后可以關(guān)閉以節(jié)電。初次打開后延時(shí)再測(cè)量。
//-----------------------------------------------
#define get_adc() ADC_DATA //取得adc的值。ADC_DATA=256*Vin/Vcc
//Vcc是電源電壓也是ad的參考電壓
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -