STC12C5AxxAD资料
- 格式:doc
- 大小:21.00 KB
- 文档页数:3
STC12C5A60S2的ADC+PWM功能STC12C5A60S2单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度可达到250 KHz(25万次/秒)。
脉宽调制(PWM)是一种使用程序来控制波形占空比、周期、相位波形的技术。
STC12C5A60S2单片机的PAC模块可以通过程序设定,使其工作于8位PWM模式。
下面是一段将ADC和PWM结合起来应用的程序:/************************************************ ***************时间:2012.12.1晶振:12MHz功能描述:AD采集电位器的电压信号,然后信号以PWM 信号输出控制LED的亮度(调节电位器)当电位器两端的电压大时,LED较亮,同时用1602显示采集的电压值AD采集通道:P1.0PWM输出: P1.3************************************************* **************/#include;#include;unsigned int result,ge,shifen,baifen;unsigned charseg[10]={'0','1','2','3','4','5','6','7','8','9'} ;//要显示字符sbit RS = P2^4; //命令数据sbit RW = P2^5; //写还是读sbit EN = P2^6; //使能端#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS------------------------------------------------* /void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------* /void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------* /bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/void LCD_Write_Com(unsigned char com){while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------* /void LCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------* /void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------* /void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s){{LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------* /void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data){{LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------LCD初始化函数------------------------------------------------* /void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/ }/*------------------------------------------------ADC初始化函数------------------------------------------------* /void InitADC(){P1ASF =0x01;//使能P1口ADC功能ADC_RES = 0;ADC_CONTR = 0xc8;}/*------------------------------------------------主函数------------------------------------------------* /void main(void){LCD_Init();LCD_Clear();//清屏LCD_Write_String(5,0,"526lab");//(列,行,数据)LCD_Write_String(2,1,"Result:"); InitADC();IE=0xa0;//开中断while (1){//PWM初始化CCON=0;CMOD=0;//1MCCAP0H=CCAP0L=ADC_RES;CCAPM0=0x42;//开启PWMCR=1;//计时开始//调用显示LCD_Write_Char(9,1,seg[ge]);LCD_Write_Char(10,1,'.');LCD_Write_Char(11,1,seg[shifen]);LCD_Write_Char(12,1,seg[baifen]);LCD_Write_Char(13,1,'V');}}/*------------------------------------------------ADC中断处理函数------------------------------------------------* /void adc_isr() interrupt 5 using 1{unsigned int temp;temp=ADC_RES;result=temp*0.01953125*1000;ge=result/1000;shifen=result%1000/100;baifen=result%100/10;ADC_CONTR = 0xc8;//开启转换}12C5A60S2.h的头文件//--------------------------------------------------------------------------------//新一代 1T 8051系列单片机内核特殊功能寄存器 C51 Core SFRs// 7 6 5 4 3 2 1 0Reset Valuesfr ACC = 0xE0; //Accumulator 0000,0000sfr B = 0xF0; //B Register 0000,0000sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000//-----------------------------------sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0;//-----------------------------------sfr SP = 0x81; //Stack Pointer 0000,0111sfr DPL = 0x82; //Data Pointer Low Byte0000,0000sfr DPH = 0x83; //Data Pointer High Byte 0000,0000//--------------------------------------------------------------------------------//新一代 1T 8051系列单片机系统管理特殊功能寄存器// 7 6 5 4 3 2 1 0 Reset Valuesfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000// 7 6 5 4 3 2 1 0Reset Valuesfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS0000,0000//-----------------------------------sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000 /*PCA_P4:0, 缺省PCA 在P1 口1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,PCA0/PWM0 从P1.3 切换到P4.2 口PCA1/PWM1 从P1.4 切换到P4.3 口SPI_P4:0, 缺省SPI 在P1 口1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口MISO 从P1.6 切换到P4.2 口MOSI 从P1.5 切换到P4.1 口SS 从P1.4 切换到P4.0 口S2_P4:0, 缺省UART2 在P1 口1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口RxD2 从P1.2 切换到P4.2 口GF2: 通用标志位ADRJ:0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器DPS: 0, 使用缺省数据指针DPTR01,使用另一个数据指针DPTR1//-----------------------------------sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO/*7 6 5 4 3 2 1 0 Reset ValuePCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000Bb7 - PCAWAKEUP : PCA 中断可唤醒 powerdown。
1、capture/PWM 功能!解读—p303为什么频率是256等份呢?因为是 1T单片机,所以,定时器计数当然是以一个时钟周期为计数单位呢!而何时溢出呢?因为是 8位计数器,所以,2^8=256!由于周期与频率成反比,sCLK<sCLK/256意思为前者计时比较快,后者比较慢,也即前者周期小后者周期大,使用1T单片机,相对于传统12T单片机来说,假如1T计数快点。
由f=SYSclk/256 ,得T=256/SYSclk。
即,最大可以计数 256次!!!!每隔 1/SYSclk 计数一次!也即计满256个数就溢出!假如为 12M晶振,则 1/12M =1us/12约为0.084us (传统单片机是 12 * 1/12M=1us),,是不是很快啊!!!CMOD 为PCA 工作模式寄存器。
要说明的是由 CMOD中的 ECF 置位后允许CF溢出标志中断,如果 PCA 产生计数溢出,则硬件置CF=1,此时,即刻产生CF中断(如果ECF=0,则即使溢出也不产生CF中断,即硬件虽置位CF,但不能产生计数中断),虽然 CF 可以硬件或软件置位,但是只能软件清零!!~~~简而言之,CF仅仅是个计数中断溢出标志,可否中断有ECF(类似中断允许位)决定!CR(类似传统51的TRX)是启动计数阵列,也就是计数器摆了!以上是用于计数器时!!但是要注意的是 CR 清零会关闭计数阵列!那有两路捕获中断,究竟是哪一个呢?请看中断标志CCFX 来判断是那一路中断!!! CCFX 硬件置位但要软件清零咯(类似串口的RI 和 TI 哈哈)!!而下面的ECCFX用来使能CCFX 中断标志的(如果ECCFX=0则即使捕获到信号,产生了CCFX置位同时申请中断,可是,ECCFX 不允许中断的话,有申请但不允许还是中断不了啊!)。
(可以这么说,要做什么动作或者申请做什么事,需要得到允许才可以做,正如某件事发生了,你提出了一个申请(比如硬件置位了某个标志),可是我没有批准你做这件事(没有“使能”标志的申请),即使事情发生了,你也做不了什么,因为我不允许,所以你做不了!!!只有我允许了,你才可以为之!!!进行下一步的工作!!!我们这里只需要捕获脉宽,所以用到CAPPX和ECCFX!!!这里要明白,ECCFX不允许的话,系统是捕获不了CCFX中断的!!从图可以看到,ECCFn 为X 是因为你是否允许在中断取决于你的设置,这里作者仅仅是提供一种解释,告诉你这是一种怎样的工作方式!!为与不为,取决于你的ECCFX的设置!!CL 、CH 其实为计数寄存器,就是说,你要计数,那你也可以设置一个基准让计数器从那开始计数咯!!反正溢出了,他就会把这些值放到CCAPX L/H 处!!CCAPX L/H 是保存计数捕获的值!!!且CCAPX L/H 还用于占空比输出的定值呢!!这个就不解释了,太勒个呢~~!@@你懂的!!辅助寄存器,改变端口,用于当你画PCB时,可以通过改变引脚来使布线更为完美!!这个是他的结构咯~!计数器结构图:下面是捕获模式的介绍:主要看看他是怎么计数及如何保存这些数值的!!看到值是放到哪里去了吧~~!!哈哈,采集到边沿信号就把计数值从CH/L放到了另外的寄存器CCAPnL/H 咯!!虽然你获得了计数值但是中不中断去处理这些数据呢?不是你说了算,由CCON中的CCFn 和 CCAPMn 中的 ECCFn 来决定,也就是说,当捕获到这个信号时,这个信号只是充当一个开关,把CH/L的值放到的另外的寄存器,而要不要处理是另外的两个大哥(CCFX 和 ECCFX)说了算!这里还教你怎么判断究竟是哪个中断呢,还提醒你要软件清零。
STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统80512.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V- 2.2V(3V单片机)3.工作频率范围:0 - 35MHz,相当于普通8051的0~420MHz4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K字节......5.片上集成1280字节RAM6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O 口)可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55mA7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM)9. 看门狗10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)11.外部掉电检测电路:在P4.6口有一个低压门槛比较器5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz3.3V单片机为:8MHz~12MHz 精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器14. 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2, INT1/P3.3, T0/P3.4, T1/P3.5, RxD/P3.0, CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3)16. PWM(2路)/PCA(可编程计数器阵列,2路)---也可用来当2路D/A 使用---也可用来再实现2个定时器---也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3)20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。
STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统80512.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V- 2.2V(3V单片机)3.工作频率范围:0 - 35MHz,相当于普通8051的0~420MHz4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K字节......5.片上集成1280字节RAM6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O 口)可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55mA7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM)9. 看门狗10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)11.外部掉电检测电路:在P4.6口有一个低压门槛比较器5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz3.3V单片机为:8MHz~12MHz 精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器14. 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2, INT1/P3.3, T0/P3.4, T1/P3.5, RxD/P3.0, CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3)16. PWM(2路)/PCA(可编程计数器阵列,2路)---也可用来当2路D/A 使用---也可用来再实现2个定时器---也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3)20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。
STC12C5A60S2系列1T单片机简介STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统80512.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V- 2.2V(3V单片机)3.工作频率范围:0 - 35MHz,相当于普通8051的0~420MHz4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K字节......5.片上集成1280字节RAM6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口) 可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55mA7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM)9. 看门狗10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)11.外部掉电检测电路:在P4.6口有一个低压门槛比较器5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz 3.3V单片机为:8MHz~12MHz 精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器14. 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2, INT1/P3.3, T0/P3.4, T1/P3.5, RxD/P3.0, CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3)16. PWM(2路)/PCA(可编程计数器阵列,2路) ---也可用来当2路D/A使用---也可用来再实现2个定时器---也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3)20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。
STC12C5A60AD系列单片机器件手册 STC12C5201AD系列单片机器件手册 --- 1个时钟/机器周期8051 ---无法解密 ---低功耗,超低价 ---高速,高可靠 ---强抗静电,强抗干扰STC12C5A08, 12C5A08AD, 12C5A08S2STC12C5A16, 12C5A16AD, 12C5A16S2STC12C5A20, 12C5A20AD, 12C5A20S2STC12C5A32, 12C5A32AD, 12C5A32S2STC12C5A40, 12C5A40AD, 12C5A40S2STC12C5A48, 12C5A48AD, 12C5A48S2STC12C5A52, 12C5A52AD, 12C5A52S2STC12C5A56, 12C5A56AD, 12C5A56S2STC12C5A60, 12C5A60AD, 12C5A60S2STC12C5A62, 12C5A62AD, 12C5A62S2宏晶科技www.MCU-Memory.comUpdate date: 2008-11-22 STC12C5A60AD系列单片机器件手册 STC12C5201AD系列单片机器件手册 --- 1个时钟/机器周期8051 ---无法解密 ---低功耗,超低价 ---高速,高可靠 ---强抗静电,强抗干扰STC12C5201, 12C5201PWM, 12C5201ADSTC12C5202, 12C5202PWM, 12C5202ADSTC12C5204, 12C5204PWM, 12C5204ADSTC12C5205, 12C5205PWM, 12C5205ADSTC12C5206, 12C5206PWM, 12C5206ADSTC12LE5201,12LE5201PWM,12LE5201ADSTC12LE5202,12LE5202PWM,12LE5202ADSTC12LE5204,12LE5204PWM,12LE5204ADSTC12LE5205,12LE5205PWM,12LE5205ADSTC12LE5206,12LE5206PWM,12LE5206AD宏晶科技www.MCU-Memory.comUpdate date: 2008-11-22宏晶科技是新一代增强型8051单片机标准的制定者和领导厂商,致力于提供满足中国市场需求的世界级高性能单片机技术,在业内处于领先地位,销售网络覆盖全国。
STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统80512.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V- 2.2V(3V单片机)3.工作频率范围:0 - 35MHz,相当于普通8051的0~420MHz4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K字节......5.片上集成1280字节RAM6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O 口)可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55mA7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM)9. 看门狗10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)11.外部掉电检测电路:在P4.6口有一个低压门槛比较器5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz3.3V单片机为:8MHz~12MHz 精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器14. 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2, INT1/P3.3, T0/P3.4, T1/P3.5, RxD/P3.0, CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3)16. PWM(2路)/PCA(可编程计数器阵列,2路)---也可用来当2路D/A 使用---也可用来再实现2个定时器---也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3)20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。
STC12C5A系列单片机P1口的第二功能可做为模数转换接口使用。
该系列单片机集成8路10位电压输入型高速A/D。
这8路A/D的转换速度可达25万次/秒,用于温度检测、电池电压检测、按键扩展和频谱扫描等。
STC12C5A系列单片机P1口功能选择可通过特殊功能寄存器P1ASF设置实现。
当P1ASF的相应位置1时,该位被设置为A/D模拟输入通道;当P1ASF对应位设置为0时,该位作为通用I/O使用。
STC12C5A系列单片机模数转换模块上电、转换速度、模拟输入通道的选择、启动模数转换及转换状态可通过模数转换控制寄存器ADC_CONTR进行配置及查看。
ADC_POWER为ADC电源控制位,当ADC_POWER置1时,打开模数转换器电源;为0时关闭模数转换器电源。
进入空闲模式时,应关闭模数转换器电源降低功耗。
初次打开模数转换器电源应适当延时以稳定模数转换器电源,保证模数转换精度。
SPEED1和SPEED0为模数转换速度控制位
ADC_FLAG为模数转换完毕标志位。
当A/D转换完成后,该位置1,需要由软件清零。
无论A/D工作于与查询方式还是中断方式,ADC_FLAG只能由软件清零。
须注意,读取ADC_CONTR设置
ADC_START为模数转换器转换启动控制位,设置为1时,启动A/D转换,转换完毕,自动清零。
// 本程序演示STC12C5AxxAD 系列MCU 的A/D 转换功能。
时钟18.432MHz
// 转换结果以 16 进制形式输出到串行口,可以用串行口调试程序观察输出结果。
//---------------------------------------------------------------------
//#include <REG52.H>
#include <intrins.H>
#include "NEW_8051.H"
//---------------------------------------------------------------------
typedef unsigned char INT8U;
typedef unsigned int INT16U;
//---------------------------------------------------------------------
//以下选择 ADC 转换速率,只能选择其中一种
// SPEED1 SPEED0 A/D转换所需时间
#define AD_SPEED 0x60 // 0110,0000 1 1 70 个时钟周期转换一次,
// CPU工作频率21MHz时 A/D转换速度约 300KHz
//#define AD_SPEED 0x40 //0100,0000 1 0 140 个时钟周期转换一次
//#define AD_SPEED 0x20 //0010,0000 0 1 280 个时钟周期转换一次
//#define AD_SPEED 0x00 //0000,0000 0 0 420 个时钟周期转换一次
//---------------------------------------------------------------------
void initiate_RS232 (void); //串口初始化
void Send_Byte(INT8U one_byte); //发送一个字节
INT8U get_AD_result(INT8U channel);
void delay(INT8U delay_time); //延时函数
//---------------------------------------------------------------------
void main()
{
INT16U ADC_result;
initiate_RS232(); //波特率 = 115200
P1ASF = 0x02; //0000,0010, 将 P1.1 置成模拟口
//ADRJ = AUXR1^2:
// 0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
// 1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器
AUXR1 &= ~0x04; //0000,0100, 令 ADRJ=0
// AUXR1 |= 0x04; //0000,0100, 令 ADRJ=1
ADC_CONTR |= 0x80; //1000,0000 打开 A/D 转换电源
while(1)
{
ADC_result = get_AD_result(1);//P1.1 为 A/D 当前通道, 测量并发送结果
Send_Byte(0xAA); //为便于观察, 发送 2 个 0xAA
Send_Byte(0xAA);
Send_Byte(ADC_result);
delay(0x1);
}
}
//---------------------------------------------------------------------
void delay(INT8U delay_time) // 延时函数
{
INT16U n;
while(delay_time--)
{
n = 6000;
while(--n);
}
}
//---------------------------------------------------------------------
#define Fosc 18432000
#define BAUD 115200 //波特率
#define RELOAD_115200 (256 - (Fosc/16*10/BAUD+5)/10 ) //1T模式, 波特率加倍#define BRTx12_enable() AUXR |= 0x04 //BRT 独立波特率发生器的溢出率快 12 倍#define BRT_start() AUXR |= 0x10 //启动独立波特率发生器 BRT 计数。
void initiate_RS232 (void) //串口初始化
{
ES = 0; //禁止串口中断
SCON = 0x50; //可变波特率. 8位无奇偶校验
AUXR |= 0x01; //使用独立波特率发生器
PCON |= 0x80; //波特率加倍
BRTx12_enable(); //BRT 独立波特率发生器的溢出率快 12 倍
BRT = RELOAD_115200; //设置独立波特率发生器 BRT 的自动重装数 BRT_start(); //启动独立波特率发生器 BRT 计数。
ES = 1;
}
//---------------------------------------------------------------------
void Send_Byte(INT8U one_byte) //发送一个字节
{
TI = 0; //清零串口发送中断标志
SBUF = one_byte;
while (TI == 0);
TI = 0; //清零串口发送中断标志
}
//---------------------------------------------------------------------
INT8U get_AD_result(INT8U channel)
{
INT8U AD_finished=0; //存储 A/D 转换标志
ADC_RES = 0;
ADC_RESL = 0;
channel &= 0x07; //0000,0111 清0高5位
ADC_CONTR = AD_SPEED;
_nop_();
ADC_CONTR |= channel; //选择 A/D 当前通道
_nop_();
ADC_CONTR |= 0x80; //启动 A/D 电源
delay(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
AD_finished = 0;
while (AD_finished ==0 ) //等待A/D转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
return (ADC_RES); //返回 A/D 高 8 位转换结果
}。