?? 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 + -