STC12C5A60S2系列单片机特殊功能寄存器名称及映像
- 格式:xls
- 大小:54.00 KB
- 文档页数:6
A/D转换测试程序(ADC查询方式)#include “”//头文件在STC公司主页上下载#include ””//与STC12C5A60S2单片机ADC相关的寄存器说明//Sfr ADC_CONTR = 0xBC;//AD转换控制寄存器Sfr ADC_RES = 0xBD;//AD转换结果寄存器高Sfr ADC_RESL = 0xBE;//AD转换结果寄存器低Sfr P1ASF = 0x9D;//P1口模拟转换功能控制寄存器Sfr AURX1 = 0xA2;//AD转换结果存储方式控制位#define ADC_POWER 0x80 //ADC电源开#define ADC_FLAG 0x10 //ADC结束标志位#define ADC_START 0x08 //ADC启动控制位设为开#define ADC_SPEEDLL 0x00 //设为540个时钟周期ADC一次#define ADC_SPEEDL 0x20 //设为360个时钟周期ADC一次#define ADC_SPEEDH 0x40 //设为180个时钟周期ADC一次#define ADC_SPEEDHH 0x60 //设为90个时钟周期ADC一次void AD_init(void);void delay(unsigned int a);unsigned int AD_get(unsigned char n);float AD_work(unsigned char n);void main(){unsigned char i;AD_init();while(1){for(i=0;i<8;i++){AD_work(i);delay(20);}}}unsigned int AD_get(unsigned char n) //第n通道ADC采样函数{unsigned int adc_data;ADC_RES = 0; //清零ADC_CONTR=ADC_POWER|ADC_SPEEDLL|n|ADC_START;//打开AD转换电源、设定转换速度、设定通道号、AD转换开始_nop_();_nop_();_nop_();_nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR?寄存器?while(!(ADC_CONTR&ADC_FLAG)); //等待转换完成adc_data=ADC_RES; //转换结果计算,取8位结果ADC_CONTR&=~ADC_FLAG;//关闭AD转换,ADC_FLAG位由软件清0return adc_data;???//返回ADC的值}float AD_work(unsigned char n){float AD_val; //定义处理后的数值AD_val为浮点数unsigned char i;for(i=0;i<100;i++)AD_val+=AD_get(n); //转换100次求平均值(提高精度)AD_val/=100;AD_val=(AD_val*5)/256; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值return AD_val;}void AD_init(void){P1ASF = 0xff; //P1口全部作为模拟功能A/D使用ADC_RES = 0; //清零转换结果寄存器高8位ADC_CONTR = ADC_POWER|ADC_SPEEDLL;delay(2); //等待1ms,让AD电源稳定}void delay(unsigned int a){unsigned int i;while (a--){i=5000;while(i--);}}。
//********************************************************************** ******// // STC12C5A60S2可编程时钟模块//////****************************************************************************//#include <STC12C5A60S2.H>#include <intrins.h>//#define Port_BRT //如果想测试独立波特率发生器时钟输出请打开此句 //若想测试CLKOUT1和CLKOUT0请注释此句#ifdef Port_BRT /*条件编译独立波特率发生器时钟输出*///*********************************//}#else /*条件编译CLKOUT0时钟输出*///*********************************//// CLKOUT0时钟和CLKOUT1初始化 ////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x03; //允许将P3.4/T0脚配置为定时器0的时钟输出CLKOUT0 //T0工作在1T模式时的输出频率 =SYSclk/(256-TH0)/2倍倍AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下//T1定时器速度是普通8051的12倍,即工作在1T模式下TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数 //定时器1工作模式为方式2,自动装载时间常数TH0 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL0 = 0xff;TH1 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频//****************************************************************************//// STC12C5A60S2系统时钟模块////// 说明: STC12C5A60S2单片机有两个时钟源,内部R/C振荡时钟和外部晶体时钟// 出厂标准配置是使用外部晶体或时钟//4、8、#include <intrins.h>#define Bus_clk 12 //若要修改系统时钟直接在此处修改//12 为 12M 的sysclk//6 为 6M 的sysclk//3 为 3M 的sysclk //1500 为 1.5M 的sysclk //750 为 750kHz 的sysclk //375 为 375kHz 的sysclk //187500 为 187.5kHz 的sysclkCLK_DIV = 0x01;#elif( Bus_clk == 3 )CLK_DIV = 0x02;#elif( Bus_clk == 1500 )CLK_DIV = 0x03;#elif( Bus_clk == 750 )CLK_DIV = 0x04;#elif( Bus_clk == 375 )CLK_DIV = 0x05;#elif( Bus_clk == 187500 )//****************************************************************************//// STC12C5A60S2系统省电模块////// 说明: STC12C5A60S2单片机有三种省电模式以降低功耗.空闲模式,低速模式// 掉电模式//)#define uint unsigned intuchar Power_Down_Flag = 0; //进入掉电状态标志sbit Chip_Start_LED = P0^0; //单片机开始工作指示灯sbit Power_Down_LED_INT0 = P0^1; //INT0口掉电唤醒指示灯sbit N_Power_Down_LED_INT0 = P0^2; //INT0口没有唤醒指示灯sbit Normal_Work_LED = P0^3; //正常工作指示灯sbit Power_Down_Wakeup_INT0= P3^2; //外中断唤醒输入口for( t = 0; t < 82; t++ );}}//***********************************//// 正常工作指示//***********************************// void Normal_work(void){Normal_Work_LED = 1;Delay_ms(500);}//***********************************// // 中断初始化 // //***********************************// void Intp_init(void){IT0 = 0; //外部中断源0为低电平触发 EX0 = 1; //允许外部中断EA = 1; //开总中断}wakeup_counter++;for( j = 0; j < 250; j++ ){Normal_work(); //系统正常工作指示}Power_Down_Flag = 1; //系统开始进入掉电状态PCON = 0x02;_nop_();_nop_();_nop_();while( Power_Down_Wakeup_INT0 == 0 ){_nop_(); //等待高电平}Power_Down_LED_INT0 = 0;}else //未掉电状态{N_Power_Down_LED_INT0 = 1; //不是掉电唤醒指示while( Power_Down_Wakeup_INT0 == 0 )////// 说明: STC12C5A60S2单片机有8路10位高速AD转换器,P1^0-P1^7//// 涉及寄存器:P1ASF(模拟功能控制寄存器)、ADC_CONTR(ADC控制寄存器)// ADC_RES、ADC_RESL(转换结果寄存器)//// 注意: 1、初次打开内部A/D模拟电源需适当延时等内部模拟电源稳定后,再启动A/D转换// 启动A/D后,在转换结束前不改变任何I/O口的状态,有利于高精#include <STC12C5A60S2.h>#include <intrins.h>#include "lcd.h"#define ADC_POWER 0x80 //AD电源控制#define ADC_START 0x08 //AD转换控制#define ADC_FLAG 0x10 //AD转换完成#define Speed_0 0x00 //540 clk#define Speed_1 0x20 //360 clk#define Speed_2 0x40 //180 clk// A/D初始化////**********************************//void AD_init(void){AUXR1 = 0x04; //转换结果高2位放在ADC_RES的低2位中,低8位放在ADC_RESL中P1ASF = 0x01; //P1.0口作为模拟功能A/D使用 ADC_RES = 0x00; //结果清零ADC_RESL = 0x00;ADC_CONTR = ADC_POWER|Speed_2|ADC0|ADC_START; //打开电源,180CLK周// 串口初始化 ////****************************************//void UART_init(void){SM0 = 0; //选择串口为方式1工作SM1 = 1; //8位数据波特率可变REN = 1;BRT = 0xDC;AUXR = 0x15; //选择独立波特率发生器为串行 //口的波特率发生器,模式为1T// 串口发送数据// //******************************************// void SendData( uchar byte ){SBUF = byte;while(!TI);TI = 0;}//******************************************//// 主程序//ADC_CONTR &= !ADC_FLAG; //清标志Printf_Decimal(Result_Calculate());ADC_RES = 0x00;ADC_RESL = 0x00;ADC_CONTR = ADC_POWER|Speed_2|ADC_START; //开始下一次转换_nop_();_nop_();_nop_();_nop_();}uchar Read_Date(void); //读数据void Write_Cmd( uchar cmd ); //写命令void Write_Date( uchar date );//写数据void Init_LCD(void);//初始化LCDvoid Location( uchar x, uchar y );//设定显示位置void Clear_Screen(void);//清屏void Write_str( uchar *p );void Printf_Decimal(double Num);#include "lcd.h"for( t = 0; t < 41; t++ );}}//**********************************////* 名称: Busy()//* 功能: 读取忙状态//* 输入: 无//* 输出: 1-忙 0-空闲//**********************************//uchar Busy(void)//* 功能: 读12864状态//* 输入: 无//* 输出: status-当前状态//**********************************// uchar Read_Status(void){uchar status;RS = 0;RW = 1;E = 0;//* 名称: Write_Cmd()//* 功能: 向12864写命令//* 输入: cmd - 命令参数//* 输出: 无//**********************************//void Write_Cmd( uchar cmd ){RS = 0;RW = 0;//**********************************// void Write_Date( uchar date ){while(Busy());RS = 1;E = 0;_nop_();_nop_();P2 = date;uchar Read_Date(void){uchar date;while(Busy()); //忙RS = 1;E = 0;_nop_();_nop_();_nop_();//**********************************// void Init_LCD(void){Delay_ms(4);PSB = 1;//并行方式Delay_ms(4);Write_Cmd(0x0c);//开显示关游标Delay_ms(4);Clear_Screen();//清屏}else if( x == 2 )x = 0x90;else if( x == 3 )x = 0x88;else if( x == 4 )x = 0x98;position = x + y;Write_Cmd(position);Delay_ms(2);}Delay_ms(10);}//**********************************// //* 名称: Write_str()//* 功能: 向12864里写字符串//* 输入: *p -- 字符串地址//* 输出: 无//**********************************// void Write_str( uchar *p ){{uchar s[6] = {0,0,46,0,0};uint t;t = (uint)(Num * 1000);s[0] = t/10000+48;s[1] = t%10000/1000+48;s[3] = t%1000/100+48;s[4] = t%100/10+48;s[5] = t%10+48;Location(1,2);// STC12C5A60S2 PCA/PWM模块////// 说明: STC12C5A60S2单片机有两路可编程计数器阵列(PCA)模块,可用于软件// 定时器,外部脉冲的捕捉、高速输出以及脉宽调制(PWM)输出//// 涉及寄存器:CMOD(PCA工作模式寄存器) CCON(PCA控制寄存器) // CCAPM0,CCAPM1(PCA比较/捕获寄存器)// CH,CL(PCA的16位计数器)、CCAPnL,CCAPnH(PCA捕捉/比较********//#include <STC12C5A60S2.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/*******高速模式变量更改*********/#define FOSC 12000000#define T100KHz (FOSC/2/100000) //高速脉冲输出频率计算: f = PCA模块的时钟源/(2*CCAP0L)//CCAP0L = PCA时钟源/2/f)#define CLK_6 0x0d //Sysclk/6#define CLK_8 0x0e //Sysclk/8/********模式选择********/#define H_model 0x4d //高速输出模式,中断模式#define T_model 0x49 //定时模式#define P_model 0x42 //无中断PWM模式#define PL_model 0x63 //由低变高可中断PWM模式#define PH_model 0x53 //由高变低可中断PWM模式#define PHL_model 0x73 //高低都可中断PWM模式#define CU_model 0x61 //16位捕获,上升触发中断模式//********************************//// H_model初始化 ////********************************//void HP_init(void){CMOD = CLK_4; //PCA时钟源为SysclkCCAPM0 = H_model; //高速输出模式CCAP0L = value;CCAP0H = value>>8;value += T100KHz;CR = 1; //开启PCA计数器//当不使用定时0溢出为时钟源时,PWM输出的频率=PCA的时钟源/256//使用定时器溢出的时钟源时,可设定定时器的值对输出频率的改变//分频为0-256分频}//********************************// // T_model初始化 // //********************************//void CD_init(void){CMOD = CLK_4;CCAPM0 = CD_model;CR = 1;EA = 1;}//********************************// // 主程序 // //********************************////*******************************// void CD_Service(void) interrupt 7{CCF0 = 0;LED = ~LED;/*void TP_Service(void) interrupt 7{CCF0 = 0; //清除PCA计数器溢出中断标志test++;CCAP0L = value;CCAP0H = value>>8;value += T100KHz;} *///****************************************************************************//// STC12C5A60S2串行通信模块// IP(中断优先级寄存器)IPH()SADEN()SADDR()WAKE_CLKO(时钟唤醒寄存器)// Bit1 - PD 控制单片机进入掉电模式// //// 程序说明:程序实现从PC端发送数据到单片机,单片机将接收到的数据通过12864// 显示出来////****************************************************************************//时需修//波特率为19200uchar Send_Bflag = 0; //正在发送标志uchar Receive_Bflag = 0; //正在接送标志uchar Re;sbit LED = P1^4;sbit LED1 = P1^5;void UART_init(void);void Delay( uint time );#elif( BTL == 4800 )BRT = 0xB8;#elif( BTL == 9600 )//波特率设置为9600BRT = 0xDC;#elif( BTL == 14400 )BRT = 0xE8;#elif( BTL == 19200 )BRT = 0xEE;#elif( BTL == 28800 )BRT = 0xF4;}//************************************************// // 发送一个字节数据 // //************************************************// void Send_byte( uchar byte ){SBUF = byte;while(!TI);TI = 0;// 接收函数 // //************************************************//void Receive( void ){Write_Date(SBUF);Re++;if( Re == 16 )Location(2,0); if( Re == 32 )Location(3,0); if( Re == 48 )Location(4,0);if( Re == 66 )UART_init();while(1){if( RI == 1 ){RI = 0;Receive();Printf("Success!");}EA = 1;}//****************************************************************************//// STC12C5A60S2 SPI接口模块////是数#include <STC12C5A60S2.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/************对SPCTL寄存器的设置位宏定义*************/#define SSIG 0x80 //SS引脚忽略#define SPEN 0x40 //SPI使能位#define DORD 0x20 //SPI数据发送LSB最先发送#define MSTR 0x10 //主从模式选择/************串口波特率设定*************************/#define BTL 9600 //若要更改波特率直接更改此处,当波特率大于9600时需修改相应的接收程序,//可选波特率有以下: 否则有可能出现乱码//波特率为2400 //波特率为28800//波特率为4800 //波特率为38400 //波特率为9600 //波特率为57600 //波特率为14400 //波特率为115200//波特率为19200void UART_init(void);#if( BTL == 2400 )BRT = 0x70; //波特率设置为9600 #elif( BTL == 4800 )BRT = 0xB8;#elif( BTL == 9600 )BRT = 0xDC;#elif( BTL == 14400 )BRT = 0xE8;#elif( BTL == 19200 )BRT = 0xEE;// IP = 0X10; //PS = 1;串口1中断为最高优先级中断// EA = 1; //开总中断}//************************************************// // 发送一个字节数据 ////************************************************// void Send_byte( uchar byte ){SBUF = byte;while(!TI);//************************************************// // 接收函数 // //************************************************//uchar Receive( void ){uchar byte;_nop_();_nop_();_nop_();_nop_();//***********************************//void Init_SPI(void){SPDAT = 0; //清空数据寄存器 SPSTAT = SPIF|WCOL; //清空SPI状态寄存器SPCTL = SPEN|MSTR; //SPI设置为主机模式IE2 = 0x02; //允许SPI中断}//***********************************////* 名称:mainif(flag) //当PC端有发送数据时才进行SPI传输数据{SPISS = 0;SPDAT = flag;flag = 0;。
Tel: 0755-********Fax: 0755-********创始人/研发总监:姚永平(139********)宏晶STC 官方网站: 1STC12C5A60S2系列 1T 8051 单片机中文指南全球最大的8051单片机设计公司S T C M C U L i m i t e d .临时技术支持:139********授权代理:南通国芯微电子有限公司总机:0513-5501 2928 / 2929 / 2966传真:0513-5501 2969 / 2956 / 2947宏晶STC 单片机官方网站: Update date: 2011/3/19---高速,高可靠---低功耗,超低价---超���超���� ---�抗静电,�抗干扰---1个时钟/机器周期8051STC12C5A60S2系列单片机器件手册STC12C5A08S2, STC12C5A08ADSTC12C5A16S2, STC12C5A16ADSTC12C5A20S2, STC12C5A20ADSTC12C5A32S2, STC12C5A32ADSTC12C5A40S2, STC12C5A40ADSTC12C5A48S2, STC12C5A48ADSTC12C5A52S2, STC12C5A52ADSTC12C5A56S2, STC12C5A56ADSTC12C5A60S2, STC12C5A60AD STC12C5A62S2, STC12C5A62AD全部中国大陆本土独立自主知识产权,技术处于全球领先水平,请全体中国人民支持,您的支持是中国大陆本土企业统一全球市场的有力保证.目录第1章STC12C5A60S2系列单片机总体介绍 (8)1.1 STC12C5A60S2系列单片机简介 (8)1.2 STC12C5A60S2系列单片机的内部结构 (10)1.3 STC12C5A60S2系列单片机管脚图 (11)1.4 STC12C5A60S2系列单片机选型一览表 (13)1.5 STC12C5A60S2系列单片机最小应用系统 (15)1.6 STC12C5A60S2系列在系统可编程(ISP)典型应用线路图 (17)1.7 STC12C5A60S2系列管脚说明 (19)1.8 STC12C5A60S2系列单片机封装尺寸图 (22)1.9 STC12C5A60S2系列单片机命名规则 (27)1.10 每个单片机具有全球唯一身份证号码(ID号) (28)1.11 如何从传统8051单片机过渡到STC12C5A60S2系列单片机 (31)第2章时钟,省电模式及复位 (35)2.1 STC12C5A60S2系列单片机的时钟 (35)2.1.1 STC12C5A60S2系列单片机内部/外部工作时钟可选 (35)2.1.2 时钟分频及分频寄存器 (36)2.1.3 如何知道单片机内部R/C振荡频率(内部时钟频率) (37)2.1.4 可编程时钟输出 (40)2.2 STC12C5A60S2系列单片机的省电模式 (45)2.2.1 低速模式 (47)2.2.2 空闲模式 (48)2.2.3 掉电模式/停机模式 (48)2.3 复位 (54)2.3.1 外部RST引脚复位(第一复位功能脚) (54)2.3.2 外部低压检测复位(高可靠复位,新增第二复位功能脚RST2复位) (54)2.3.3 外部低压检测若不作第二复位功能时,可作外部低压检测中断 (56)2.3.4 软件复位 (60)2.3.5 上电复位/掉电复位 (60)2.3.6 MAX810专用复位电路 (61)2.3.7 看门狗(WDT)复位 (61)2.3.8 冷启动复位和热启动复位 (65)第3章片内存储器和特殊功能寄存器(SFRs) (66)3.1 程序存储器 (66)3.2 数据存储器(SRAM) (67)3.2.1 内部RAM (67)3.2.2 内部扩展RAM (69)3.2.3 外部扩展的64KB数据存储器(片外RAM) (77)3.3 特殊功能寄存器(SFRs) (80)第4章.STC12C5A60S2系列单片机的I/O口结构 (87)4.1 I/O口各种不同的工作模式及配置介绍 (87)4.2 STC12C5A60S2系列单片机P4/P5口的使用 (92)4.3 I/O口各种不同的工作模式结构框图 (94)4.3.1 准双向口输出配置 (94)4.3.2 强推挽输出配置 (95)4.3.3 仅为输入(高阻)配置 (95)4.3.4 开漏输出配置(若外�上拉电阻,也可读) (95)4.4 一种典型三极管控制电路 (97)4.5 典型发光二极管控制电路 (97)4.6 混合电压供电系统3V/5V器件I/O口互连 (97)4.7 如何让I/O口上电复位时为低电平 (98)4.8 PWM输出时I/O口的状态 (99)4.9 I/O口直接驱动LED数码管应用线路图 (100)4.10 I/O口直接驱动LCD应用线路图 (101)4.11 A/D做按键扫描应用线路图 (102)第5章.指令系统 (103)5.1 寻址方式 (103)5.1.1 立即寻址 (103)5.1.2 直接寻址 (103)5.1.3 间接寻址 (103)5.1.4 寄存器寻址 (104)5.1.5 相对寻址 (104)5.1.6 变址寻址 (104)5.1.7 位寻址 (104)5.2 指令系统分类总结 (105)5.3 传统8051单片机的指令定义 (110)第6章.中断系统 (147)6.1 中断结构 (149)6.2 中断寄存器 (151)6.3 中断优先级 (159)6.4 中断处理 (160)6.5 外部中断 (161)6.6 中断测试程序(C程序及汇编程序) (162)6.6.1 外部中断0(INT0)的测试程序(C程序及汇编程序) (162)6.6.2 外部中断1(INT1)的测试程序(C程序及汇编程序) (166)6.6.3 P3.4/T0/INT下降沿中断(可用于唤醒掉电模式)的测试程序 (170)6.6.4 P3.5/T1/INT下降沿中断(可用于唤醒掉电模式)的测试程序 (172)6.6.5 P3.0/RxD/INT下降沿中断(可用于唤醒掉电模式)的测试程序 (174)—— C程序及汇编程序 (174)6.6.6 低压检测LVD中断(可用于唤醒掉电模式)的测试程序 (177)6.6.7 PCA模块中断(可用于唤醒掉电模式)的测试程序 (180)第7章.定时器/计数器 (184)7.1 定时器/计数器的相关寄存器 (184)7.2 定时器/计数器0工作模式(与传统8051单片机兼容) (189)7.2.1 模式0(13位定时器/计数器) (189)7.2.2 模式1(16位定时器/计数器)及测试程序 (190)7.2.3 模式2(8位自动重装模式) (194)7.2.4 模式3(两个8位计数器) (197)7.3 定时器/计数器1工作模式(与传统8051单片机兼容) (198)7.3.1 模式0(13位定时器/计数器) (198)7.3.2 模式1(16位定时器/计数器) (199)7.3.3 模式2(8位自动重装模式) (203)7.4 可编程时钟输出及测试程序(C程序和汇编程序) (206)7.4.1 定时器0的可编程时钟输出的测试程序 (209)7.4.2 定时器1的可编程时钟输出的测试程序 (211)7.4.3 独立波特率发生器的可编程时钟输出的测试程序 (213)7.5 古老Intel 8051单片机定时器0/1的应用举例 (215)7.6 如何将定时器T0/T1的速度提高12倍 (222)第8章.串行口通信 (223)8.1 串行口1的相关寄存器 (223)8.2 串行口1工作模式 (229)8.2.1 串行口1工作模式0:同步移位寄存器 (229)8.2.2 串行口1工作模式1:8位UART,波特率可变 (231)8.2.3 串行口1工作模式2:9位UART,波特率固定 (233)8.2.4 串行口1工作模式3:9位UART,波特率可变 (235)8.3 串行通信中波特率的设置 (237)8.4 串行口1的测试程序 (242)8.5 串行口2的相关寄存器 (248)8.6 串行口2工作模式 (254)8.7 串行口2的测试程序 (256)8.8 双机通信 (262)8.9 多机通信 (273)第9章.STC12C5A60S2系列单片机的A/D转换器 (279)9.1 A/D转换器的结构 (279)9.2 与A/D转换相关的寄存器 (281)9.3 A/D转换典型应用线路 (286)9.4 A/D做按键扫描应用线路图 (287)9.5 A/D转换模块的参考电压源 (288)9.6 A/D转换测试程序(C程序和汇编程序) (289)9.6.1 A/D转换测试程序(ADC中断方式) (289)9.6.2 A/D转换测试程序(ADC查询方式) (295)第10章.STC12C5A60S2系列单片机PCA/PWM应用 (301)10.1 与PCA/PWM应用有关的特殊功能寄存器 (301)10.2 PCA/PWM模块的结构 (307)10.3 PCA模块的工作模式 (309)10.3.1 捕获模式 (309)10.3.2 16位软件定时器模式 (310)10.3.3 高速输出模式 (311)10.3.4 脉宽调节模式(PWM) (312)10.4 用PCA功能扩展外部中断的示例程序(C程序和汇编程序) (314)10.5 用PCA功能实现定时器的示例程序(C程序和汇编程序) (318)10.6 PCA输出高速脉冲的示例程序(C程序和汇编程序) (322)10.7 PCA输出PWM的示例程序(C程序和汇编程序) (326)10.8 利用PWM实现D/A功能的典型应用线路图 (330)第11章.同步串行外围接口(SPI接口) (331)11.1 与SPI功能模块相关的特殊功能寄存器 (331)11.2 SPI接口的结构 (334)11.3 SPI接口的数据通信 (335)11.3.1 SPI接口的数据通信方式 (336)11.3.2 对SPI进行配置 (338)11.3.3 作为主机/从机时的额外注意事项 (339)11.3.4 通过SS改变模式 (340)11.3.5 写冲突 (340)11.3.6 数据模式 (341)11.4 适用单主单从系统的SPI功能测试程序 (343)11.4.1 中断方式 (343)11.4.2 查询方式 (349)11.5 适用互为主从系统的SPI功能测试程序 (355)11.5.1 中断方式 (355)11.5.2 查询方式 (361)第12章.STC12C5A60S2系列单片机EEPROM的应用 (367)12.1 IAP及EEPROM新增特殊功能寄存器介绍 (367)12.2 STC12C5A60S2系列单片机EEPROM空间大小及地址 (371)12.3 IAP及EEPROM汇编简介 (373)12.4 EEPROM测试程序 (377)第13章.STC12系列单片机开发/编程工具说明 (385)13.1 在系统可编程(ISP)原理,官方演示工具使用说明 (385)13.1.1 在系统可编程(ISP)原理使用说明 (385)13.1.2 STC12C5A60S2系列在系统可编程(ISP)典型应用线路图 (386)13.1.3 电脑端的ISP控制软件界面使用说明 (388)13.1.4 宏晶科技的ISP下载编程工具硬件使用说明 (390)13.1.5 若无RS-232转换器,如何用宏晶的ISP下载板做RS-232通信转换 (391)13.2 编译器/汇编器,编程器,仿真器 (392)13.3 自定义下载演示程序(实现不停电下载) (394)7STC12C5A60S2系列 1T 8051 单片机中文指南全球最大的8051单片机设计公司S T C M C U L i m i t e d .临时技术支持:139********授权代理:南通国芯微电子有限公司总机:0513-5501 2928 / 2929 / 2966传真:0513-5501 2969 / 2956 / 2947附录A :汇编语言编程...................................398附录B :C 语言编程......................................420附录C :STC12C5A60S2系列单片机电气特性...............430附录D :内部常规256字节RAM 间接寻址测试程序...........432附录E :用串口扩展I/O 接口..............................434附录F :利用STC 单片机普通I/O 驱动LCD 显示..............437附录G :一个I/O 口驱动发光二极管并扫描按键..............444附录H :如何利用Keil C 软件减少代码长度.................445附录I :STC12系列单片机取代传统8051注意事项............446附录J :如何采购和授权分销机构.........................450J.1 如何采购 ................................................450J.2 授权分销机构 ............................................451附录K :每日更新内容的备忘录...........................453附录L :以下是各系列的选型指南. (454)L.1 STC15F828EACS 系列选型指南(2011年5月开始送样) ..........454L.2 STC15F204EA 系列选型指南 ...............................454L.3 STC12C5A60S2系列选型指南 ..............................454L.4 STC11/10xx 系列选型指南 .................................454L.5 STC12C5201AD 系列选型指南 ..............................454L.6 STC12C5620AD 系列选型指南 ..............................454L.7 STC12C5410AD 系列选型指南 ..............................454L.8 STC12C2052AD 系列选型指南 ..............................454L.9 STC89C51/STC90C51系列选型指南 . (454)8STC12C5A60S2系列 1T 8051 单片机中文指南全球最大的8051单片机设计公司临时技术支持:139********S T C M C U L i mi t e d .授权代理:南通国芯微电子有限公司总机:0513-5501 2928 / 2929 / 2966传真:0513-5501 2969 / 2956 / 2947第1章 STC12C5A60S2系列单片机总体介绍1.1.STC12C5A60S2系列单片机简介STC12C5A60S2/AD/PWM 系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超�抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12 倍。
STC12C5A60S2单片机寄存器头文件STC12C5A.H内容/**************** 8051内核特殊功能寄存器******************/sfr ACC = 0xE0; //累加器sfr B = 0xF0; //B寄存器sfr PSW = 0xD0; //程序状态字寄存器sbit CY = PSW^7; //进位标志位sbit AC = PSW^6; //辅助进位标志位sbit F0 = PSW^5; //用户标志位0sbit RS1 = PSW^4; //工作寄存器组选择控制位sbit RS0 = PSW^3; //工作寄存器组选择控制位sbit OV = PSW^2; //溢出标志位sbit F1 = PSW^1; //用户标志位1sbit P = PSW^0; //奇偶标志位sfr SP = 0x81; //堆栈指针寄存器sfr DPL = 0x82; //数据指针0低字节sfr DPH = 0x83; //数据指针0高字节/**************** 系统管理特殊功能寄存器******************/sfr PCON = 0x87; //电源控制寄存器sfr AUXR = 0x8E; //辅助寄存器sfr AUXR1 = 0xA2; //辅助寄存器1sfr WAKE_CLKO = 0x8F; //时钟输出和唤醒控制寄存器sfr CLK_DIV = 0x97; //时钟分频控制寄存器sfr BUS_SPEED = 0xA1; //总线速度控制寄存器/**************** 中断控制特殊功能寄存器******************/sfr IE = 0xA8; //中断允许寄存器sbit EA = IE^7; //总中断允许位sbit ELVD = IE^6; //低电压检测中断控制位sbit EADC = IE^5; //ADC中断允许控制位sbit ES = IE^4; //串口1中断允许位sbit ET1 = IE^3; //定时器1溢出中断允许位sbit EX1 = IE^2; //外部中断1允许位sbit ET0 = IE^1; //定时器0溢出中断允许位sbit EX0 = IE^0; //外部中断0允许位sfr IE2 = 0xAF; //中断允许寄存器2sfr IP = 0xB8; //中断优先级寄存器sbit PPCA = IP^7; //PCA中断优先级控制位sbit PLVD = IP^6; //低电压检测中断优先级控制位sbit PADC = IP^5; // ADC中断优先级控制位sbit PS = IP^4; //串口1中断优先级控制位sbit PT1 = IP^3; //定时器1中断优先级控制位sbit PX1 = IP^2; //外部中断1优先级控制位sbit PT0 = IP^1; //定时器0中断优先级控制位sbit PX0 = IP^0; //外部中断0优先级控制位sfr IPH = 0xB7; //中断优先级高位寄存器sfr IP2 = 0xB5; //第二中断优先级寄存器低字节sfr IPH2 = 0xB6; //第二中断优先级寄存器高字节/**************** I/O口特殊功能寄存器******************/sfr P0 = 0x80; //P0口寄存器sfr P0M1 = 0x93; //P0口工作模式寄存器1sfr P0M0 = 0x94; //P0口工作模式寄存器0sfr P1 = 0x90; //P1口寄存器sfr P1M1 = 0x91; //P1口工作模式寄存器1sfr P1M0 = 0x92; //P1口工作模式寄存器0sfr P1ASF = 0x9D; //P1口模拟量功能设置寄存器sfr P2 = 0xA0; //P2口寄存器sfr P2M1 = 0x95; //P2口工作模式寄存器1sfr P2M0 = 0x96; //P2口工作模式寄存器0sfr P3 = 0xB0; //P3口寄存器sbit T1 = P3^5; //定时器1外部输入sbit T0 = P3^4; //定时器0外部输入sbit INT1 = P3^3; //外部中断1sbit INT0 = P3^2; //外部中断0sbit TXD = P3^1; //串行输入通道sbit RXD = P3^0; //串行输出通道sfr P3M1 = 0XB1; //P3口工作模式寄存器1sfr P3M0 = 0xB2; //P3口工作模式寄存器0sfr P4 = 0xC0; //P4口寄存器sfr P4M1 = 0xB3; //P4口工作模式寄存器1sfr P4M0 = 0xB4; //P4口工作模式寄存器0sfr P4SW = 0xBB; //P4口功能切换寄存器sfr P5 = 0xC8; //P5口(只有P5.3、P5.2、P5.1、P5.0)sfr P5M1 = 0xC9; //P5口工作模式寄存器1sfr P5M0 = 0xCA; //P5口工作模式寄存器0/**************** 定时器特殊功能寄存器******************/sfr TCON = 0x88; //定时/计数控制寄存器sbit TF1 = TCON^7; //定时器1溢出中断标志sbit TR1 = TCON^6; //定时器1运行控制位sbit TF0 = TCON^5; //定时器0溢出中断标志sbit TR0 = TCON^4; //定时器0运行控制位sbit IE1 = TCON^3; //外部中断1请求标志sbit IT1 = TCON^2; //选择外部中断请求1为边沿触发方式的控制位sbit IE0 = TCON^1; //外部中断0请求标志sbit IT0 = TCON^0; //选择外部中断请求0为边沿触发方式的控制位sfr TMOD = 0x89; //定时/计数模式控制寄存器sfr TL0 = 0x8A; //定时/计数器0低字节sfr TH0 = 0x8C; //定时/计数器0高字节sfr TL1 = 0x8B; //定时/计数器1低字节sfr TH1 = 0x8D; //定时/计数器1高字节/**************** 串行口特殊功能寄存器******************/sfr SCON = 0x98; //串行口控制寄存器sbit SM0 = SCON^7; //串行口工作方式设定控制位0(与FE功能复用)sbit FE = SCON^7;sbit SM1 = SCON^6; //串行口工作方式设定控制位1sbit SM2 = SCON^5; //UART的SM2设定sbit REN = SCON^4; //接收允许位sbit TB8 = SCON^3; //发送数据的第九位sbit RB8 = SCON^2; //接收数据的第九位sbit TI = SCON^1; //发送中断标志sbit RI = SCON^0; //接收中断标志sfr SBUF = 0x99; //串口数据缓冲器sfr SADEN = 0xB9; //从机地址掩码寄存器sfr SADDR = 0xA9; //从机地址寄存器sfr S2CON = 0x9A; //串行口2控制寄存器sfr S2BUF = 0x9B; //串行口2数据缓冲器sfr BRT = 0x9C; //独立波特率定时器/**************** 看门狗定时器寄存器******************/sfr WDT_CONTR = 0xC1; //看门狗定时器控制寄存器/******************** PCA寄存器**********************/sfr CCON = 0xD8; //PCA控制寄存器sbit CF = CCON^7; //PCA计数器溢出(CH,CL由FFFF变为0000H)标志sbit CR = CCON^6; //PCA计数器计数允许控制位sbit CCF1 = CCON^1; //PCA模块1中断标志sbit CCF0 = CCON^0; //PCA模块0中断标志sfr CMOD = 0xD9; //PCA 工作模式寄存器sfr CL = 0xE9; //PCA 计数器低8位sfr CH = 0xF9; //PCA 计数器高8位sfr CCAPM0 = 0xDA; //PCA 模块0的工作模式寄存器sfr CCAPM1 = 0xDB; //PCA 模块1的工作模式寄存器sfr CCAP0L = 0xEA; //PCA 模块0捕捉/比较寄存器低8位sfr CCAP0H = 0xFA; //PCA 模块0捕捉/比较寄存器高8位sfr CCAP1L = 0xEB; //PCA 模块1捕捉/比较寄存器低8位sfr CCAP1H = 0xFB; //PCA 模块1捕捉/比较寄存器高8位sfr PCA_PWM0 = 0xF2; //PCA 模块0 PWM寄存器sfr PCA_PWM1 = 0xF3; //PCA 模块1 PWM寄存器/******************** ADC寄存器**********************/sfr ADC_CONTR = 0xBC; //ADC控制寄存器,本寄存器不支持位操作sfr ADC_RES = 0xBD; //ADC转换结果高8位寄存器sfr ADC_RESL = 0xBE; //ADC转换结果低2位寄存器/******************** SPI寄存器**********************/sfr SPSTAT = 0xCD; //SPI状态寄存器,本寄存器不支持位操作sfr SPCTL = 0xCE; //SPI控制寄存器sfr SPDAT = 0xCF; //SPI数据寄存器/***************** ISP_IAR_EEPROM寄存器*******************/sfr IAP_DATA = 0xC2; //ISP/IAP Flash数据寄存器sfr IAP_ADDRH = 0xC3; // ISP/IAP Flash地址高字节sfr IAP_ADDRL = 0xC4; // ISP/IAP Flash地址低字节sfr IAP_CMD = 0xC5; // ISP/IAP Flash命令寄存器sfr IAP_TRIG = 0xC6; // ISP/IAP Flash命令触发器sfr IAP_CONTR = 0xC7; //ISP/IAR控制寄存器。
74573引脚图三态总线驱动输出·置数全并行存取·缓冲控制输入·使能输入有改善抗扰度的滞后作用原理:74LS573 的八个锁存器都是透明的 D 型锁存器,当使能(G)为高时,Q 输出将随数据(D)输入而变。
当使能为低时,输出将锁存在已建立的数据电平上。
输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。
这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。
特别适用于缓冲寄存器,I/O 通道,双向总线驱动器和工作寄存器引脚功能D0–D7:Data Inputs数据输入LE:Latch Enable Input (Active HIGH) 锁存使能输入(高电平有效)OE:3-STATE Output Enable Input (Active LOW) 3态输出使能输入(低电平有效)O0–O7:3-STATE Latch Outputs 3态锁存输出Operating Conditions 操作条件VCC :Supply Voltage 电源电压最小4.75V最大5.25VVIH :High Level Input Voltage输入高电平电压最小2VVIL:LOW Level Input Voltage 输入低电平电压最大0.8VIOH:HIGH Level Input Current输入高电平电流最大-2.6mAIOL:LOW Level Output Current低电平输出电流最大24mATA :Free Air Operating Temperature工作温度最大70摄氏度直流电气特性VI Input Clamp Voltage输入钳位电压VCC=最小, II=−18 mA - - −1.5 VVOH High Level OutputVoltage输出高电平电压VCC = 最小, IOH=最大,VIL = 最大 2.7 3.4 - VVOL Low Level OutputVoltage输出低电平电压VCC = 最小, IOL=最大- 0.35 0.5 - VIH = 最小- - - VIOL=4 mA, VCC=最小- - - -II Input Current @ 最大Input Voltage输入电压VCC=最大, VI=7V - - 1 mAIIH HIGH Level Input Current输入高电平电流VCC=最大, VI=2.7V - - 20 μAIIL LOW Level Input Current低电平输入电流VCC=最大, VI=0.4V - - −0.4 mAIOS Short CircuitOutput Current输出短路电流VCC=最大(Note 3) −30 - −130 mA -ICC Supply Current电源电流VCC=最大- - 50 mAIOZH 3-STATE Outputoff Current High 3态输出高阻态时高电平电流IOZL 3-STATE Outputoff Current Low 3态输出高阻态时低电平电流tPLH tPHL Propagation Delay传播延迟tPLH tPHL Propagation Delay传播延迟LE to Q - 36 25 ns tPZH tPZL 3-STATE Enable Time3态启用时间OE to Q - 20 25 nstPHZ tPLZ 3-STATE Enable Time3态启用时间OE to Q - 20 25 nsts(H)ts(L) Setup Time (High/Low) 设置时间(高/低)Data to LE 3 7 - nsth(H)th(L) Hold Time (High/Low)保持时间(高/低)Le Data to LE 10 10 - ns tw(H) - Pulse Width (High) 脉冲宽度(高)LeData to LE 15 - - ns看一下STC12C5A60S2系列1T单片机的功能就明白较89C51的优势了: 1.增强型8051 CPU,1T,单时钟/ 机器周期,指令代码完全兼容传统8051 2.工作电压:STC12C5A60S2 系列工作电压:5.5V - 3.3V STC12LE5A60S2 系列工作电压:3.6V - 2.2V 3. 工作频率范围:0 - 35MHz,相当于普通8051 的0~420MHz 4. 用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K 字节...... 5. 片上集成1280 字节RAM 6. 通用I/O 口(36/40/44 个),复位后为:准双向口/ 弱上拉(普通8051 传统I/O 口)可设置成四种模式:准双向口/ 弱上拉,推挽/ 强上拉,仅为输入/ 高阻,开漏每个I/O 口驱动能力均可达到20mA,但整个芯片最大不要超过120mA 7. I S P(在系统可编程)/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% 以内) 用户在下载用户程序时,可选择是使用内部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,三线通信,还多了串口。
1.PCA工作模式寄存器CMODPCA工作模式寄存器的格式如下:CMOD:PCA工作模式寄存器CIDL:空闲模式下是否停止PCA计数的控制位当CIDL=0时,空闲模式下PCA计数器继续工作;当CIDL=1时,空闲模式下PCA计数器停止工作;CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。
PCA计数脉冲选择如下表所示:例如,CPS2/CPS1/CPS0=1/0/0时,PCA/PWM的时钟源是SYSclk,不是定时器0,PWM 的频率为SYSclk/265如果要用系统时钟/3来作为PCA的时钟源,应让T0工作在1T模式,计数3个脉冲即产生溢出。
如果此时使用内部RC作为系统时钟(室温情况下,5V单片机为11MHZ~15.5MHZ),可以输出14K~19K频率的PWM。
用T0的溢出可对系统时钟进行1~256级分频。
ECF:PCA计数溢出中断使能位。
当ECF=0时,禁止寄存器CCON中CF位的中断;当ECF=1时,允许寄存器CCON中CF位的中断。
2. 2. PCA控制寄存器CCONPCA控制寄存器的格式如下:CCON:PAC控制寄存器CF:PCA计数阵列溢出标志位。
当PCA计数器溢出时,CF由硬件位置。
如果CMOD 寄存器的ECF位置位,则CF标志可用来产生中断。
CF位可通过硬件或软件置位,但通过软件清零。
CR:PCA计数阵列运行控制位。
该位通过软件置位,用来起动PCA计数器阵列计数。
该位通过软件清零,用来关闭PCA计数器。
CCF1:PCA模块1中断标志。
当出现匹配或捕获时该位由硬件置位。
该位必须通过软件清零。
CCF0:PCA模块0中断标志。
当出现匹配或捕获时该位由硬件置位。
该位必须通过软件清零。
3. 3.PCA比较/捕获寄存器CCAPM0和CCAPM1PCA模块0的比较/捕获寄存器的格式如下:CCAPM0:PCA模块0的比较/捕获寄存器B7:保留位将来之用。
ECOM0:允许比较器功能控制位。