📄 stc12cx052.h
字号:
/*--------------------------------------------------------------------------
STC12CX052.H
Header file for the low voltage Flash Atmel STC12C1052 and STC12C2052
STC12C4052 STC12C5052 STC12C1052AD STC12C2052AD STC12C4052AD STC12C5052AD.
STC12LE1052 STC12LE2052 STC12LE4052 STC12LE5052 STC12LE1052AD STC12LE2052AD STC12LE4052AD STC12LE5052AD.
--------------------------------------------------------------------------*/
#ifndef STC12CX052_HEADER_FILE
#define STC12CX052_HEADER_FILE 1
/* After is STC12CX052 additional SFR or change */
/* Watchdog Timer Register */
sfr WDT_CONTR = 0xe1;
//#define WDT_FLAG 0x80 //WDT溢出标志
//#define EN_WDT 0x20 //WDT使能
//#define CLR_WDT 0x10 //WDT重新记数
//#define IDLE_WDT 0x08 //空闲模式记数
//#define PS2_ 0x04 //WDT预分频值
//#define PS1_ 0x02 //PS2 PS1 PS0 预分频值 11.0592M 20M
//#define PS0_ 0x01 // 0 0 0 2 71.1mS 39.3mS
// 0 0 1 4 142.2mS 78.6mS
// 0 1 0 8 284.4mS 157.3mS
// 0 1 1 16 568.8mS 314.6mS
// 1 0 0 32 1.1377S 629.1mS
// 1 0 1 64 2.2755S 1.25S
// 1 1 0 128 4.5511S 2.5S
// 1 1 1 256 9.1022S 5S
sfr ISP_DATA = 0xe2; //ISP/IAP操作时的数据寄存器
sfr ISP_ADDRH = 0xe3; //ISP/IAP操作时的地址寄存器高八位
sfr ISP_ADDRL = 0xe4; //ISP/IAP操作时的地址寄存器低八位
sfr ISP_CMD = 0xe5; //ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效
sfr ISP_TRIG = 0xe6; //ISP/IAP操作时的命令触发寄存器
//在ISP_EN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46H再写入B9H,ISP/IAP命令才会生效
sfr ISP_CONTR = 0xe7;
/* ISP_CONTR */
#define ISP_EN 0x80 //ISP/IAP功能允许位.0:禁止ISP/IAP编程改变Flash,
// 1:允许编程改变Flash.
//#define SWBS 0x40 //软件选择从用户应用程序区启动(0),还是从ISP程序区启动(1).
//要与SWRST直接配合才能实现.
//#define SWRST 0x20 //0:不操作,1:产生软件系统复位,硬件自动清零.
//#define CMD_FAIL 0x10 //ISP/IAP命令触发失败标志
//#define WT2 0x40 //设置CPU等待时间 CPU等待时间(机器周期)
//#define WT1 0x20 //WT2 WT1 WT0 Read Program Sector Erase Recommended System Clock
//#define WT0 0x10 // 1 1 1 2 55 21012 < 1MHz
// 1 1 0 2 110 42024 < 2MHz
// 1 0 1 2 165 63036 < 3MHz
// 1 0 0 2 330 126072 < 6MHz
// 0 1 1 2 660 252144 < 12MHz
// 0 1 0 2 1100 420240 < 20MHz
// 0 0 1 2 1320 504228 < 24MHz
// 0 0 0 2 1760 672348 < 30MHz
//ISP_CONTR = 0x20; //选择AP区,软复位
//ISP_CONTR = 0x60; //选择ISP区,软复位
/* ISP_CMD */
//#define MS1 0x02 //MS1 MS0
//#define MS0 0x01 // 0 0 待机模式,无ISP操作
// 0 1 对用户应用程序Flash区及数据Flash区字节读
// 1 0 对用户应用程序Flash区及数据Flash区字节编程
// 1 1 对用户应用程序Flash区及数据Flash区扇区擦除
#define ISP_IAP_BYTE_READ 1 //字节读
#define ISP_IAP_BYTE_PROGRAM 2 //字节编程
#define ISP_IAP_SECTOR_ERASE 3 //扇区擦除
#define WAIT_TIME 3 //30M以下0,24M以下1,20M以下2,12M以下3
//6M以下4,3M以下5,2M以下6,1M以下7
#define ISP_WAIT_TIME_EN 0x83 //ISP/IAP使能,等待时间
//30M以下0x80,24M以下0x81,20M以下0x82,12M以下0x83
//6M以下0x84,3M以下0x85,2M以下0x86,1M以下0x87
/* IDLE, Clock Divider */
//STC12CX052系列不要分频
//sfr IDLE_CLK = 0xc7; //系统时钟分频寄存器
//#define CLKS2_ 0x04 //CLKS2 CLKS1 CLKS0 分频后CPU的实际工作频率
//#define CLKS1_ 0x02 // 0 0 0 系统时钟(外部时钟或内部R/C振荡时钟)
//#define CLKS0_ 0x01 // 0 0 1 系统时钟/2
// 0 1 0 系统时钟/4
// 0 1 1 系统时钟/8
// 1 0 0 系统时钟/16
// 1 0 1 系统时钟/32
// 1 1 0 系统时钟/64
// 1 1 1 系统时钟/128
/* I_O Port Mode Set Register */
sfr P1M0 = 0x91;
sfr P1M1 = 0x92;
sfr P3M0 = 0xb1;
sfr P3M1 = 0xb2;
/* SPI Register */
sfr SPSTAT = 0x84;
#define SPIF 0x80 //SPI传输完成标志,SPIF通过软件向其写入1清零
#define WCOL 0x40 //SPI写冲突标志,WCOL通过软件向其写入1清零
sfr SPCTL = 0x85;
#define SSIG 0x80 // /SS忽略.1:由MSTR确定器件为主机还是从机;0:由/SS引脚配置成I/O口;
#define SPEN 0x40 //SPI使能位
#define DORD 0x20 //SPI数据顺序.1:数据的LSB(最低位)先发送;0:数据的MSB(最高位)先发送;
#define MSTR 0x10 //主从模式选择
#define CPOL 0x08 //SPI时钟极性,1:SPICLK空闲时为高电平,SPICLK的前时钟沿为下降沿,而后沿为上升沿;
//0:SPICLK空闲时为低电平,SPICLK的前时钟沿为上升沿,而后沿为下降沿;
#define CPHA 0x04 //SPI时钟相位选择,1:数据在SPICLK的前时钟沿驱动,并在后时钟沿采样;
//0:数据/SS为低(SSIG=0)时被驱动,在SPICLK的后时钟沿被改变,并在前时钟沿被采样;
//(注:SSIG=1时的操作未定义)
#define SPR1 0x02 //SPI时钟选择
#define SPR0 0x01 //SPR1 SPR0 SPI时钟
// 0 0 系统时钟/4
// 0 1 系统时钟/16
// 1 0 系统时钟/64
// 1 1 系统时钟/128
sfr SPDAT = 0x86;
/* ADC Register */
sfr ADC_CONTR = 0xc5; //A/D转换控制寄存器
sfr ADC_DATA = 0xc6; //A/D转换结果寄存器,高8位
sfr ADC_LOW2 = 0xbe; //A/D转换结果寄存器,低2位
/* ADC_CONTR */
#define ADC_POWER 0x80 //ADC电源控制位
//#define SPEED1 0x40 //SPEED1 SPEED0 ADC转换时间
//#define SPEED0 0x20 // 1 1 270个时钟周期转换一次
// 1 0 540个时钟周期转换一次
// 0 1 810个时钟周期转换一次
// 0 0 1080个时钟周期转换一次
//#define ADC_FLAG 0x10 //ADC转换结束位
#define ADC_START 0x08 //ADC转换控制位
//#define CHS2 0x04 //CHS2 CHS1 CHS0 模拟输入通道选择
//#define CHS1 0x02 // 0 0 0 选择P1.0作为A/D输入
//#define CHS0 0x01 // 0 0 1 选择P1.1作为A/D输入
// 0 1 0 选择P1.2作为A/D输入
// 0 1 1 选择P1.3作为A/D输入
// 1 0 0 选择P1.4作为A/D输入
// 1 0 1 选择P1.5作为A/D输入
// 1 1 0 选择P1.6作为A/D输入
// 1 1 1 选择P1.7作为A/D输入
#define ADC_POWER_SPEED_CHS1_0 0xE0 //P1.0作为AD输入
#define ADC_POWER_SPEED_CHS1_1 0xE1 //P1.1作为AD输入
#define ADC_POWER_SPEED_CHS1_2 0xE2 //P1.2作为AD输入
#define ADC_POWER_SPEED_CHS1_3 0xE3 //P1.3作为AD输入
#define ADC_POWER_SPEED_CHS1_4 0xE4 //P1.4作为AD输入
#define ADC_POWER_SPEED_CHS1_5 0xE5 //P1.5作为AD输入
#define ADC_POWER_SPEED_CHS1_6 0xE6 //P1.6作为AD输入
#define ADC_POWER_SPEED_CHS1_7 0xE7 //P1.6作为AD输入
/* PCA SFR */
sfr CCON = 0xD8; //PCA控制寄存器
/* CCON */
sbit CF = CCON^7; //PCA计数器阵列溢出标志,只能软件清零
sbit CR = CCON^6; //PCA计数器阵列运行控制位
sbit CCF3 = CCON^3; //PCA模块3中断标志,必须由软件清零
sbit CCF2 = CCON^2; //PCA模块2中断标志,必须由软件清零
sbit CCF1 = CCON^1; //PCA模块1中断标志,必须由软件清零
sbit CCF0 = CCON^0; //PCA模块0中断标志,必须由软件清零
sfr CMOD = 0xD9; //PCA模式寄存器
#define CIDL 0x80 //0:空闲模式PCA计数器继续工作;1:空闲模式PCA计数器停止工作
#define CPL1 0x04 //PCA记数脉冲选择
#define CPL0 0x02 //CPL1 CPL0 PCA时钟源
// 0 0 Fosc/12
// 0 1 Fosc/2
// 1 0 定时器0溢出率
// 1 1 P3.4脚外部时钟输入(最大Fosc/2)
#define ECF 0x01 //PCA记数溢出中断使能
sfr CCAPM0 = 0xDA; //PCA比较/捕获模块寄存器
//#define ECOM0 0x40 //使能比较器
//#define CAPP0 0x20 //使能上升沿捕获
//#define CAPN0 0x10 //使能下降沿捕获
//#define MAT0 0x08 //匹配
//#define TOG0 0x04 //翻转
//#define PWM0 0x02 //使能CEX0脚用作脉宽调制输出
//#define ECCF0 0x01 //使能CCF0中断
sfr CCAPM1 = 0xDB; //PCA比较/捕获模块寄存器
//#define ECOM1 0x40 //使能比较器
//#define CAPP1 0x20 //使能上升沿捕获
//#define CAPN1 0x10 //使能下降沿捕获
//#define MAT1 0x08 //匹配
//#define TOG1 0x04 //翻转
//#define PWM1 0x02 //使能CEX1脚用作脉宽调制输出
//#define ECCF1 0x01 //使能CCF1中断
/*PCA模块工作模式(CCAPMn寄存器,n:0,1)
- ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn 模块功能
0 0 0 0 0 0 0 无操作 0x00
X 1 0 0 0 0 0/1 16位捕获模式,CEXn上升沿触发 0x21 0x20
X 0 1 0 0 0 0/1 16位捕获模式,CEXn下降沿触发 0x11 0x10
X 1 1 0 0 0 0/1 16位捕获模式,CEXn跳变触发 0x31 0x30
1 0 0 1 0 0 0/1 16位软件定时器 0x49 0x48
1 0 0 1 1 0 0/1 16位高速输出 0x4D 0x4C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -