STC5A60S2_时钟输出
- 格式:wps
- 大小:47.00 KB
- 文档页数:3
STC12C5A60S2 定时器,STC12C5A60S2 定时器程序
STC12C5A60S2 单片机集成了共4 个16 位定时器,两个与传统8051 兼容的定时器/计数器,16 位定时器T0 和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2 路PCA 模块可再实现2 个16 位定时器;
1. 基本特性
STC12C5A60S2 单片机集成了两个16 位定时/计数器。
1)寄存器
1.1)TMOD 定时器工作方式控制寄存器,包括13 位寄存器、16 位寄存器、8 位寄存器等;
1.2)TCON 定时器控制寄存器,主要包括定时器启动控制位等;
1.3)AUXR 辅助寄存器,用以设置分频;默认12 分频
1.4)TH0/1:定时器高8 位寄存器
1.5)TL0/1:定时器低8 位寄存器
定时器计算
STC12C5A60S2 系列是1T 的8051 单片机,为了兼容传统的8051,定时器0 和定时器1 复位后是传统8051 的速度,既12 分频,这是为了兼容传统8051。
但也可以不进行12 分频,实现真正的1T。
编译、下载目标代码,LED 灯以1s 间隔闪烁,说明我们的代码是正确的。
现在我们修改一下代码,关闭定时器T0 的12 分频,粉色字段为新增加代码。
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 倍。
ADC#include<STC12C5A60S2.H>#include<intrins.h>//51基本运算(包括_nop_空函数)#include"ad.h"#include"uart.h"unsigned char code dispcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};void AD_Configurate (uchar ChannelNum){uchar AD_FLAG=0; //存储A/D转换标志ChannelNum &= 0x0f; //选择ADC的个接口中的一个(0111 清高位)ADC_CONTR = 0x40; //ADC转换的速度(XX0 0000 其中XX控制速度,请根据数据手册设置)_nop_();ADC_CONTR |= ChannelNum; //选择A/D当前通道_nop_();ADC_CONTR |= 0x80; //启动A/D电源delay(1); //使输入电压达到稳定(ms即可)}unsigned int ReadADV alue (void){unsigned char AD_FLAG=0; //存储A/D转换标志ADC_CONTR |= 0x08; //启动A/D转换(1000 令ADCS = 1)_nop_();_nop_();_nop_();_nop_();while (AD_FLAG ==0)//等待A/D转换结束{AD_FLAG = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否}ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,return(ADC_RES*4+ADC_RESL);//返回A/D转换结果(位ADC数据高位在ADC_RES中,低位在ADC_RESL中)}void DigitalTube(unsigned long number){P2=0xef; //1110 1111P0=dispcode[number%10]; //显示number的个位delay(7);P2=0xdf; //1101 1111P0=(dispcode[number/10%10]); //显示number的十位delay(7);P2=0xbf; //1011 1111P0=(dispcode[number/100%10]); //显示number的百位delay(7);P2=0x7f; //1011 1111P0=(dispcode[number/1000]); //显示number的千位delay(7);}void delay (unsigned int a ){unsigned int i;while (--a != 0){for (i = 0; i < 600; i++);}}void GPIO_init (void){P2M0 = 0x0F; //0000 1111 //I/O接口的设置P2M1 = 0x00; //0000 0000 //I/O接口的设置P1M1 = 0x01; //P1.0作为ad功能}PWM#include<STC12C5A60S2.H>#include"pwm.h"#include"uart.h"unsigned int xdata FirstData=0; //上升沿捕捉数据unsigned int xdata SeconedData=0; //下降沿捕捉数据高电平时间=SeconedData-FirstData unsigned int xdata HighLevel=0; // 保存被测波形高电平时间对于测方波即使半个周期//采用半个周期的测法主要是提高可被测波形的频率范围unsigned int xdata Frequency=0; // 保存频率的变量bit Capture_over = 0; //捕获完成标志位void pwm_init(void){CMOD=0x80; //0000 0010 PCA工作模式寄存器系统时钟/12 计数器溢出中断CF CCAP0H =(CCAP0L = 254); //PCA捕捉/比较寄存器127 高低点CCAPM0=0x42; //0100 0010// CCAP1H =(CCAP1L = 0x7f);// CCAPM1=0x42;CCAPM1 = 0x21;//16位捕获模式,上升沿触打开捕获中断CCF1CCAP1L = 0x00;CCAP1H = 0x00;EA = 1;CCON=0x40; //0100 0000 PCA控制寄存器CR=1 启动PCA计数器阵列计数}void SetPwm0DutyCycle(unsigned int x) //占空比设置函数{unsigned int h=0,l=0;l=x&0xff;h=x>>8;CCAP0L=l;CCAP0H=h; //设置比较值}void PCA_Interrupt(void) interrupt 7{if (CCF1) //PCA模块中断{CCF1 = 0;if(FirstData == 0) // 上升沿中断{FirstData = CCAP1H; //获得捕捉数据的高位//高位<<8+低位构成位整数FirstData = (FirstData << 8) + CCAP1L;CCAPM1 = 0x11;// 下降沿捕获}else// 下降沿中断{CCF1 = 0; // 清CCF中断标志SeconedData = CCAP1H; //获得捕捉数据的高位//高位<<8+低位构成位整数SeconedData = (SeconedData << 8) + CCAP1L;HighLevel = SeconedData - FirstData; //计数值单位为usFrequency = (long)456000/ HighLevel; // 得到周期CR = 0;//停止PCA计数器计数CCAPM1 = 0x10;//停止捕获中断CCF0产生FirstData=0; // 为下一次捕捉设定初始条件CCAP1L = 0x00;//清零CCAP1H = 0x00;CL = 0x00; //清PCA计数器CH = 0x00;CCAPM1 = 0x21;Capture_over = 1;//捕获完成标志位}}// if(CF == 1) //PCA溢出中断// {// USART_Send_Str(" ;;;;;;;");// CF = 0; //清PCA溢出中断标志// CCAPM1 = 0x21;// FirstData=0; // 为下一次捕捉设定初始条件// CCAP1L = 0x00;//清零// CCAP1H = 0x00;// }}UART#include<STC12C5A60S2.H>#include<stdio.h>#include<string.h>#include"uart.h"//void uartinit(void)//{//// SCON = 0x50; //REN=1允许串行接受状态,串口工作模式// TMOD|= 0x20; //定时器工作方式// PCON|= 0x80;// //TH1 = 0xFD; //baud*2 /* reload value 19200、数据位、停止位。
STC12C5A60S2单片机PWM程序两个头文件main.c#include <REG51.H>#include <intrins.h>#define U8 unsigned char#define U16 unsigned intvoid DelayMs(U8 ms);void PWM_clock(U8 clock); void PWM_start(U8 module,U8 mode);////////////////////// 延时子程序/////////////////////////////void DelayMs(U8 ms) // 在11.0592M 晶振下,stclOf 系列(单周期指令)的ms 级延时{U16 i;while(ms--){for(i = 0; i < 850; i++); }}//////////////////// 主函数入口////////////////////////////sfr CCON = 0xD8; //PCA 控制寄存器sfr CMOD = 0xD9; //PCA 模式寄存器sfr CCAPM0 = 0xDA; //PCA 模块0模式寄存器// 模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60系列)sfr CCAPM1 = 0xDB; //PCA 模块1 模式寄存器// 模块1 对应P1.4/CEX1/PCA1/PWM1(STC12C5A60系列)sfr CL = 0xE9; //PCA 定时寄存器低位sfr CH = 0xF9; //PCA 定时寄存器高位sfr CCAP0L = 0xEA; //PCA 模块0的捕获寄存器低位sfr CCAP0H = 0xFA;//PCA模块0的捕获寄存器高位sfr CCAP1L = OxEB; //PCA 模块1的捕获寄存器低位sfr CCAP1H = 0xFB; //PCA 模块1的捕获寄存器高位sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1sbit CF = 0xDF; //PCA 计数溢出标志位sbit CR = 0xDE; //PCA 计数器运行控制位sbit CCF1 = 0xD9; //PCA 模块1 中断标志sbit CCF0 = 0xD8; //PCA 模块0 中断标志//* CCAPOH = CCAPOL = 0XC0; // 模块0 输出占空因数为25%//* CCAPOH = CCAPOL = 0X80; // 模块0 输出占空因数为50%//* CCAPOH = CCAPOL = 0X40; // 模块0 输出占空因数为75%void PWM_clock(U8 clock);void PWM_start(U8 module,U8 mode);void PWM_clock(U8 clock){CMOD |= (clock<<1);CL = 0x00;CH = 0x00;void PWM_start(U8 module,U8 mode,U8 zkb) {CCAP0L = 0XC0;CCAP0H = 0XC0; // 模块 0 初始输出 占空因数为 25% CCAP1L = 0XC0; CCAP1H = 0XC0; // 模块 1 初始输出 占空因数为 25% if(module==0) {中断default: break;}}elseif(module==1){switch(mode){ switch(mode){case 0: CCAPM0 = 0X42;break; //case 1: CCAPM0 = 0X53;break; //中断case 2: CCAPM0 = 0X63;break; //中断case 3: CCAPM0 = 0X73;break; //模块0设置为8位PWM 输出,无中断 模块0设置为8位PWM 输出,下降沿产生 模块0设置为8位PWM 输出,上升沿产生case 0: CCAPM0 = CCAPM1 = 0X42;break; //出,无中断case 1: CCAPM0 = CCAPM1 = 0X53;break; //出,下降沿产生中断case 2: CCAPM0 = CCAPM1 = 0X63;break; //出,上升沿产生中断case 3: CCAPM0 = CCAPM1 = 0X73;break; //出,跳变沿产生中断default: break; case 0: CCAPM1 = 0X42;break; //case 1: CCAPM1 = 0X53;break; //中断case 2: CCAPM1 = 0X63;break; // 中断 case 3: CCAPM1 = 0X73;break; //中断default: break;}}elseif(module==2){switch(mode){模块1设置为8位PWM 输出,无中断 模块1设置为8位PWM 输出,下降沿产生 模块1设置为8位PWM 输出,上升沿产生模块0和1设置为8位PWM 输模块0和1设置为8位PWM 输 模块0和1设置为8位PWM 输 模块0和1设置为8位PWM 输}CR=1; //PCA 计数器开始计数}void PCA_Intrrpt(void) interrupt 7 {if(CCF0) CCF0=0;if(CCF1) CCF1=0; // 软件清零if(CF) CF=0; // 软件清零}void main(){TMOD|=0x02; /* timer 0 mode 2: 8-Bit reload */TH0=0xff;TR0=1;PWM_clock(2); // PCA/PWM 时钟源为定时器0 的溢出PWM_start(O,O); // 模块0,设置为PWM输出,无中断,初始占空因素为25% DelayMs(250);ITO=1; // 下降沿触发EXO=1; // 开中断OEA=1; // 开总中断while(1); // 等待中断产生,按下S15按键产生中断信号}#include "reg51.h"#define uchar unsigned char #define uint unsigned intsbit di=P3A7;uchar jishu=0x00; // 用来记录中断的次数void delay(uchar z){uchar i;for(i=0;i<z;i++);}/ """"""""""""""""""""""""""""""""""""// if n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n // 外部中断0 子函数void PWM_Select(void) interrupt 0 {U8 modjishu++; // 中断一次加1mod=jishu%3;switch(mod){case 0: CCAPM0 = 0X42;break; //0 设置为25%PW输出case 1: CCAPM0 = 0X53;break; //0 设置为50%PW输出case 2: CCAPM0 = 0X63;break; //0 设置为75%PW输出default: break;} delay(255);。
stc12c5a60s2 引脚exlvd 是哪个stc12c5a60s2 引脚exlvd
STC12C5A60S2 是STC 生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051 单片机,指令代码完全兼容传统8051,但速度快8-12 倍。
内部集成MAX810 专用复位电路,2 路PWM,8 路高速10 位A/D 转换,针对电机控制,强干扰场合。
stc12c5a60s2 引脚作用
P0.0~P0.7 P0:P0 口既可以作为输入/输出口,也可以作为地址/数据复用总线使用。
当P0 口作为输入/输出口时,P0 是一个8 位准双向口,内部有弱上拉电阻,无需外接上拉电阻。
当P0 作为地址/数据复用总线使用时,
是低8 位地址线A0~A7,数据线D0~D7
P1.0/ADC0/CLKOUT2 标准IO 口、ADC 输入通道0、独立波特率发生器的时钟输出。
第6章STC15F2K60S2单片机定时器及可编程时钟输出《单片机原理及应用》本文介绍了STC15F2K60S2单片机的定时器和可编程时钟输出功能。
单片机定时器是单片机中常用的功能模块之一,可以用于定时、计时、延时等应用。
STC15F2K60S2单片机具有多个定时器,包括定时/计时器的选择,工作模式的设置,定时器中断的配置等。
另外,该单片机还具备可编程时钟输出功能,可以用于生成各种频率的时钟信号。
一、STC15F2K60S2单片机定时器概述STC15F2K60S2是一款杰出的8051内核单片机,它具有多种功能和丰富的接口资源,适用于各种应用场景。
定时器是其中一个重要的功能模块,可以用于实现各种定时任务,例如周期性的数据采集、定时触发等。
STC15F2K60S2单片机具有4个定时器,分别为T0、T1、T2和T3。
每个定时器又分为两个独立的计时/定时模块,通常称之为T0高速定时器和T0低速定时器等。
这些定时器的工作频率由系统时钟频率决定,可以通过定时器控制寄存器来设置时钟来源和分频系数。
二、STC15F2K60S2单片机定时器的工作模式定时器有多种工作模式可供选择,常用的有定时器模式和计数器模式。
定时器模式主要用于实现定时功能,可以根据需求设置定时时长和触发条件。
计数器模式主要用于计数功能,可以将外部事件转换为内部计数脉冲,用于测量时间间隔或者脉冲频率。
STC15F2K60S2单片机定时器的工作模式可以通过相关的寄存器位进行配置。
例如,可以通过T2CON寄存器的T2M0和T2M1位来选择定时器2的工作模式,可以选择定时器模式、16位自动重载模式、13位同步计数器模式,或者外部事件计数器模式。
三、STC15F2K60S2单片机定时器中断的配置定时器中断是使用定时器功能的常用方法之一,可以在定时达到设定值时触发中断,执行相应的中断服务程序。
STC15F2K60S2单片机的定时器可以设置使能定时器中断,并通过相关的中断使能寄存器来控制定时器中断的使能和优先级。
//头文件STC12C5A.h可在网上下载#include "STC12C5A.H"#define uint unsigned int#define uchar unsigned charuchar t=0;sbit sign=CCON^2;//此位为预留位置,开发用作表示振动片工作模式,0为一//般模式,1为ADC模式void init_T0(void);//初始化T0void init_T1(void);//初始化[T1void init_INT0(void);//初始化外部中断0void init_INT1(void);//初始化外部中断1void init_PCA(void);//初始化PCA模块void init_ADC(void);//初始化A/D转化模块void main(void){sign=0;//默认工作在固定模式P17=1;//开始时P3^0输出为高电平EA=1;//开总中断init_T0();//初始化T0init_T1();//初始化T1init_INT0();//初始化外部中断0init_INT1();//初始化外部中断1init_PCA();//初始化PCA模块CR=1; //开启PCA计数器init_ADC(); //初始化A/D转化模块while(1){if(sign==1)//工作在ADC模式{if(ADC_CONTR&ADC_FLAG!=0)//转换结束{TH0=ADC_RES; //溢出率与初值成正比TL0=ADC_RES;ADC_CONTR=ADC_CONTR & 0xE7;//将ADC_FLAG(转换结//束标志位)与ADC_START清零,其余位不变ADC_CONTR=ADC_CONTR | 0x08;//将ADC_START置1 }}else //工作在固定模式{TH0=0x30; //输出一固定频率的PWM波TL0=0x30;}}}void init_T0(void)//T0做PCA的时钟源输入{//通过改变定时器0溢出率实现可调频率的PWM输出TMOD=0x02;//定时器0工作在方式2,8位定时计数器自动重装载TH0=0x80;//设置T0定时所对应的初值TL0=0x80;//设置T0每次定时结束后重装载的值ET0=1;//允许定时器0中断TR0=1;//定时器0开始计数}void init_T1(void)//T1定时100ms,用于产生呼气吸气脉冲{TMOD=TMOD|0x10;//设置定时器1的工作方式为方式2且不改变定时器0的工作方式TH1=0x3c; //设置定时100ms的处初值TL1=0xb0;ET1=1;//允许定时器1中断TR1=1; //定时器1开始计数}void init_INT0(void){IT0=1;//由下降沿触发,输入引脚P3^2EX0=1;//开外部中断0}void init_INT1(void){IT1=1; //由下降沿触发,输入引脚P3^3EX1=1; //开外部中断1}void init_PCA(void){CMOD=0x04; //CIDL=0(D7):空闲模式下继续计数,D4~D6不用//CPS2/CPS1/CPS0(D3~D1)=010,选择T0做PCA时钟源输入//ECF(D0)=0,关PCA计数器溢出中断CCF1=0; //清零PCA模块1中断标志位CCF0=0; //清零PCA模块0中断标志位CR=0; //关闭PCA计数器CH=0;//PCA计数器高8位置零CL=0; //PCA计数器低8位置零CCAPM0=0X42;//PCA模块0的工作模式寄存器设置为0X42表示8位PWM无中断CCAP0H=0x80; //设置PWM波的占空比为0.5CCAP0L=0x80; //溢出后会将CCAP0H中值赋给CCAP0LCCAPM1=0x31; //PCA模块1扩展为上升沿下降沿均可触发的外部中断}void init_ADC(void){uint i;for(i=10000;i!=0;i--)//若晶振为6MHZ,是延时20ms等待ADC模块内部模拟电源稳定{;}ADC_CONTR=0x80;//开ADC模块电源并选择P1^0作为模拟量输入引脚P1ASF=0x01; //P1口模拟量功能设置寄存器:使用P1^0的模拟量功能AUXR1=AUXR1 & 0xfb;//ADRJ=0,ADC_RES存放A/D转换结果高8位//ADC_RESL存放A/D转换结果低8位ADC_RES=0; //检测前将其清零ADC_RESL=0;//检测前将其清零EADC=1; //开A/D转换中断}void INT0_ISR(void) interrupt 0 //外部中断0服务程序{sign=0;//工作在固定模式ADC_CONTR=ADC_CONTR&0xF7;//关闭ADC电源}void INT1_ISR(void) interrupt 2 //外部中断1服务程序{sign=1;//工作在ADC模式ADC_CONTR|=0x08; //打开ADC电源,由用户决定PWM频率}void T1_ISR(void) interrupt 3 //定时器1中断服务程序{TH1=0x3C; //工作在方式1溢出后不能自动重装载TL1=0xB0;t++;if(t==20)//2s后输出低电平P17=!P17;if(t==50){t=0;//5s为一个周期P17=!P17;}}void PCA_ISR(void) interrupt 7{if(CCF1==1)//PCA模块1中断响应{if(P14==0)//判断是上升沿触发还是下降沿触发,等于0为下降沿触发{while(t!=25); //延时0.5sCCAP0H=0x80; //设置PWM波的占空比为0.5CCAP0L=0x80;}else//上升沿触发{CCAP0H=0xFF; //PWM输出低电平CCAP0L=0xFF;}CCF1=0;elseCCF0=0;//防止干扰信号误动作}}。
目录第一章实习的目的及意义 (1)1.1生产实习的目的 (1)1.2生产实习的意义 (1)1.3生产实习的重要性 (1)第二章单片机的最小系统 (2)2.1部分芯片介绍 (2)2.1.1 AT89S52芯片 (2)2.1.2 MAX232芯片 (3)2.1.3 LCD1602液晶显示器 (4)2.1.4 DS12887芯片 (5)2.1.5 74HC573 (7)第三章单片机电路板焊接 (8)3.1 单片机焊接 (8)3.2焊接元件清单 (8)3.3 焊接注意事项 (10)第四章 C51语言的应用程序 (12)4.1 Keil uVision的使用 (12)4.2 流水灯程序 (12)4.3 流水灯高地位循环闪烁 (13)4.4 AD转换测温度 (15)4.5 按键控制1602 (21)4.6 调试中出现的问题 (28)第五章单片机开发板的应用 (29)5.1 应用程序 (29)第六章实习体会 (33)第一章实习的目的及意义1.1生产实习的目的此次生产实习的目的是在理论学习的基础上,通过完成一个设计51单片机的多种资源应用并具有综合功能的最小系统目标板的设计与编程应用。
1.2生产实习的意义将理论知识与实际应用相结合,从实际出发分析问题、研究问题和解决问题,将单片机的知识系统化,并能对电子电路、电子元器件、印制电路板等方面的知识有进一步的加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行某些单片机的应用系统的开发设计打下一定基础。
1.3生产实习的重要性生产实习是电子信息工程专业教学计划的一个重要部分,是培养学生理论学习与实践相结合的重要实践性教学环节。
通过生产实习使学生了解实习单位的工作方式和工作流程;对以后大单片机课程设计,帝业设计做基础,了解一个开发板的开发制作的整个过程以及元器件的采购;对生产现场、生产过程中的电子信息设备、计算机设备的应用状况有较为深刻的认识,掌握常规电子信息设备的使用维护方法;在实践中进一步加强专业教育,了解本专业工程技术岗位和生产劳动岗位的工作情况和工作内容,培养团队精神和吃苦耐劳的精神;同时可以使学生学到企业的管理经验和工人师傅的艰苦创业精神,激励学生奋发向上的开拓精神。
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:允许比较器功能控制位。
硬件实验二定时器计数器实验摘要:本实验主要涉及定时器计数器的应用,通过使用STC12C5A60S2单片机,利用定时器计数器实现输入脉冲的计数,以及定时输出的功能。
关键词:定时器计数器;STC12C5A60S2单片机;输入计数;定时输出。
一、实验目的1.了解定时器计数器的工作原理3.学习使用定时器计数器实现定时输出4. 掌握基本的电子实验方法和技能二、实验原理定时器计数器是单片机中非常重要的模块,广泛应用于计时、计数、PWM控制等领域。
单片机中的定时器计数器是由寄存器组成的,分为定时器部分和计数器部分,定时器部分主要用于产生一定的时间延迟,计数器部分主要用于计数。
2.1 输入计数在输入计数实验中,我们需要使用到定时器计数器的计数模式。
STC12C5A60S2单片机中的定时器计数器模块有两个计数模式:timer0和timer1。
timer0是一个8位计数器,可选择12种不同的计时方式,并能够自动重装载定时器计数器的初始值。
timer1是一个16位计数器,可选择4种不同的计时方式,并能够自动重装载定时器计数器的初始值。
在本次实验中,我们选择timer1,并将其配置为16位计数、模式3。
通过输入一个脉冲信号来启动计数器,在计数器达到设定值(如65535)时,会产生溢出,从而让单片机执行中断服务程序,从而完成一次计数。
2.2 定时输出定时输出实验中,我们需要使用定时器计数器模块中的定时模式。
定时模式主要用于产生一定的时间延迟,并在延时结束后产生中断信号。
三、实验器材和仪器1.STC12C5A60S2单片机开发板2.示波器3.计数器4.电压表5.脉冲发生器6.细铜线四、实验步骤4.1 硬件连接将脉冲发生器的输出信号接到开发板上的P3.3口,将示波器的触发信号接到P3.4口。
首先,我们要将定时器计数器模块配置为timer1, 选择16位计数模式、模式3。
TMOD = 0x20; //选择timer1,16位计数,模式3接下来,我们需要编写定时器计数器中断服务程序,并在程序中进行计数。
/**************************************************//*基于STC12C5A60S2系列单片机+595驱动五个数码管+165按键输入+1302实时时钟+18B20温度传感器的万年历时钟功能键:0xfe:实现温度,时间,年月日,周的转换显示0xdf:实现每按一次可以一次更改小时,分,年,月,日,周的闪烁,而实现加减按键对其改变数值0xfb:加功能键,在0xdf有效的情况下才能生效0xfd:减功能键,在0xdf有效的情况下才能生效数码管亮度有点不一致,还希望高手能帮忙解决,其他功能都是正常的,也可以给各位爱好单片机的新人们一个互相交流的一段小程序,后面付有图片*/#include < 12C5A60S2.h > //头文件#include < intrins.h >#define uchar unsigned char //宏定义#define uint unsigned intuchar time_tuf[]={0x14,0x04,0x10,0x12,0x30,0x00,0x5}; //年月日时分秒周uchar code weima[]={0x20,0x10,0x08,0x04,0x02,0x01}; //数码管位选uchar code duan_ma[]={0xee,0x88,0xd6,0xdc,0xb8,0x7c,0x7e,0xc8,0xfe,0xfc}; //数码管段选信号uchar sec,min,hour,day,month,year,week,num,flag,flag1,flag2,flag3,Flicker,di,x,h;//时间变量及标志位变量uint tt,tvalue; //变量void yueri_work(void); //月日显示程序void nian_work(void); //年显示程序void Show_pass(uchar dss); //不显示程序void zhou_work(void); //周显示程序void delay_18B20(uint i); //温度延时显示程序void wendu_work(void); //温度显示程序void show_work(void); //显示程序void KEY(void); //按键显示程序sbit RCLK=P0^2; //595输出存储器锁存时钟线/165装载移位控制锁存信号sbit SRCLK=P0^0; //595数据输入时钟线sbit SER=P0^3; //595数据线sbit SO=P0^4; //165数据输出数据线sbit CLK=P0^1; //165时钟信号sbit RST=P0^5; //1302复位引脚,高电平有效sbit IO=P0^6; //1302数据输入输出引脚sbit SCL=P0^7; //1302串行时钟输入,控制数据线的输入输出sbit DQ=P1^0; //18B20数字温度传感器,输入输出口void Delayms(uint z) //1毫秒1T时钟模式下{uint x,y;for(x=z;x>0;x--)for(y=848;y>0;y--);}/********************595驱动程序*********************/void wr595(uchar date) //595写入一个字节{uchar i;for(i=0;i<8;i++){SRCLK=1;SER=date&0x80;date<<=1;SRCLK=0;}}void send2baty(uchar date1,uchar date2) //写入双字节程序{wr595(date1);wr595(date2);}void out595(void) //595输出锁存程序{RCLK=0;RCLK=1;}/****************************************************//**************165移位寄存器并转串驱动***************/uchar series_165(){uchar i;uchar BYTE=1; //最终接收到得字符RCLK=0; //将165外部端口数据装入内部寄存器RCLK=1; //抬高为移位准备for(i=0;i<8;i++){BYTE<<=1; // 1CLK=1; //时钟低BYTE=BYTE|SO; //先接收高位CLK=0; //时钟高,上升沿下一个数据移出// 5}return BYTE; //返回接收字符}/****************************************************//***************18B20数字传感器驱动程序**************/void delay_18B20(uint i) //延时1微秒{i=i*12; //由于我用的是1T 51单片机如果用普通51请把这句话屏蔽while(i--);}void ds1820rst(void) //ds1820初始化{uchar x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd(void) //读数据{uchar i=0;uchar dat = 0;for(i=8;i>0;i--){DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ) //如果DQ==1,执行下面语句{dat|=0x80;}delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata) //写数据{uchar i=0;for (i=8; i>0; i--){DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp(void) //读取温度值并转换{uchar a,b;ds1820rst();ds1820wr(0xcc); //跳过读序列号ds1820wr(0x44); //启动温度转换ds1820rst();ds1820wr(0xcc); //跳过读序列号ds1820wr(0xbe); //读取温度a=ds1820rd();b=ds1820rd();tvalue=b*16+a/16; //转换为十进制数return tvalue;}/****************1302实时时钟驱动程序****************/ void write_baty(uchar dat) //1302写入一个字节{uchar i;SCL=0;for(i=0;i<8;i++){IO=dat&0x01; //先写入低位SCL=1;SCL=0;dat>>=1;}}void write_addbaty(uchar address,uchar dat) //向1302地址写入一个字节的数据{RST=0;SCL=0;RST=1;write_baty(address);write_baty(dat);SCL=1;RST=0;}uchar read_baty(void) //1302读取一个字节{uchar i,temp;for(i=0;i<8;i++){temp>>=1;if(IO){temp=temp|0x80;}else{temp=temp&0x7f;}SCL=1;SCL=0;}return temp;}uchar read_adddaty(uchar address) //向1302地址读取一个字节的数据{uchar temp;RST=0;SCL=0;RST=1;write_baty(address);temp=read_baty();SCL=1;RST=0;return temp;}void Init_1302time(void) //1302初始化{write_addbaty(0x8e,0x00);write_addbaty(0x80,time_tuf[5]);write_addbaty(0x82,time_tuf[4]);write_addbaty(0x84,time_tuf[3]);write_addbaty(0x86,time_tuf[2]);write_addbaty(0x88,time_tuf[1]);write_addbaty(0x8a,time_tuf[6]);write_addbaty(0x8c,time_tuf[0]);write_addbaty(0x8e,0x80);}void read_1302time(void) //读1302时间{sec=read_adddaty(0x81);min=read_adddaty(0x83);hour=read_adddaty(0x85);day=read_adddaty(0x87);month=read_adddaty(0x89);week=read_adddaty(0x8b);year=read_adddaty(0x8d);}/****************************************************//********************定时器0程序*********************/ void Timer0Init(void) //2毫秒@11.0592MHz 1T时钟模式下{AUXR |= 0x80; //定时器时钟1T模式TMOD |= 0x01; //设置定时器模式TL0 = 0x9A; //设置定时初值TH0 = 0xA9; //设置定时初值TR0 = 1; //定时器0开始计时ET0 = 1; //定时器0中断打开EA = 1; //总中断打开}void timer0() interrupt 1 using 1{TL0 = 0x9A; //设置定时初值TH0 = 0xA9; //设置定时初值tt++;if(tt==500){tt=0;x++;if(x==10) //20毫秒自动跳会无按键时显示{x=0;di=0;}}if(tt<250){Flicker=0;}else{Flicker=1;}}/********************时间调整程序********************/void set(uchar sel,uchar sal){uchar address,time;uchar max,min;if(sel==7) {address=0x80; max=59;min=0;} //秒if(sel==6) {address=0x8a; max=7; min=1;} //星期if(sel==2) {address=0x82; max=59;min=0;} //分钟if(sel==1) {address=0x84; max=23;min=0;} //小时if(sel==5) {address=0x86; max=31;min=1;} //日if(sel==4) {address=0x88; max=12;min=1;} //月if(sel==3) {address=0x8c; max=99;min=0;} //年time=read_adddaty(address+1)/16*10+read_adddaty(address+1)%16; //时间BCD转换if (sal==0) time++; else time--;if(time>max) time=min;if(time<min) time=max;write_addbaty(0x8e,0x00);write_addbaty(address,time/10*16+time%10);write_addbaty(0x8e,0x80);}/**********************显示程序**********************/void wendu_work(void){send2baty(0x10,0x00);out595();Delayms(2);send2baty(0x08,0x00);out595();Delayms(2);if(tvalue/10==0x00){Show_pass(0x04);}else{send2baty(0x04,duan_ma[tvalue/10]);out595();Delayms(2);send2baty(0x02,duan_ma[tvalue%10]);out595();Delayms(2);}send2baty(0x01,0x66);out595();Delayms(2);}void nian_work(void){send2baty(0x10,duan_ma[2]);out595();Delayms(2);send2baty(0x08,duan_ma[0]);out595();Delayms(2);if((Flicker==1)&&(di==3)){Show_pass(0x04);Show_pass(0x02);}else{send2baty(0x04,duan_ma[year/16]);out595();Delayms(2);send2baty(0x02,duan_ma[year%16]);out595();Delayms(2);}send2baty(0x01,0x10);out595();Delayms(2);}void yueri_work(void){if((Flicker==1)&&(di==4)){Show_pass(0x10);Show_pass(0x08);}else{send2baty(0x10,duan_ma[month/16]);out595();Delayms(2);send2baty(0x08,duan_ma[month%16]);out595();Delayms(2);}send2baty(0x04,0x10);out595();Delayms(2);if((Flicker==1)&&(di==5)){Show_pass(0x02);Show_pass(0x01);}else{send2baty(0x02,duan_ma[day/16]);out595();Delayms(2);send2baty(0x01,duan_ma[day%16]);out595();Delayms(2);}}void zhou_work(void){send2baty(0x10,0x10);out595();Delayms(2);send2baty(0x08,0x10);out595();Delayms(2);if((Flicker==1)&&(di==6)){Show_pass(0x04);}else{send2baty(0x04,duan_ma[week%16]);out595();Delayms(2);}send2baty(0x02,0x10);out595();Delayms(2);send2baty(0x01,0x10);out595();Delayms(2);}void show_work(void){if((num==0)&&(di==0)){wendu_work();}if((num==1)&&(di==0)||(di>=1)&&(di<=2)) {if((Flicker==1)&&(di==1)){Show_pass(0x10);Show_pass(0x08);}else{send2baty(0x08,duan_ma[hour%16]);out595();Delayms(2);send2baty(0x10,duan_ma[hour/16]);out595();Delayms(2);}if((Flicker==1)&&(di==2)){Show_pass(0x02);Show_pass(0x01);}else{send2baty(0x02,duan_ma[min/16]);out595();Delayms(2);send2baty(0x01,duan_ma[min%16]);out595();Delayms(2);}send2baty(0x04,0x10);out595();Delayms(2);}if((num==2)&&(di==0)||(di==3)){nian_work();}if((num==3)&&(di==0)||(di>=4)&&(di<=5)){yueri_work();}if((num==4)&&(di==0)||(di==6)){zhou_work();}}/****************************************************//**********************不显示程序********************/ void Show_pass(uchar dss){send2baty(dss,0x00);out595();Delayms(1);}/********************按键处理程序********************/ void KEY(void){uchar key;key=series_165();if(key==0xdf){Delayms(1);if(key==0xdf){flag1=1;}}else{if(flag1==1){flag1=0;di++;if(di==7){di=0;}}}if(di!=0){if(key==0xfb){Delayms(1);if(key==0xfb){flag2=1;}}else{if(flag2==1){flag2=0;set(di,0);}}if(key==0xfd){Delayms(1);if(key==0xfd){flag3=1;}}else{if(flag3==1){flag3=0;set(di,1);}}}else{if(key==0xfe){Delayms(1);if(key==0xfe){flag=1;}}else{if(flag==1){flag=0;num++;if(num==5){num=0;}}}}}/**********************主程序************************/ void main(void) //主函数{Timer0Init();ds1820rst();Init_1302time();while(1){read_1302time();read_temp();KEY();show_work();}}。
STC12C5A60S2简介STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。
1、增强型8051CPU,1T(1024G),单时钟/机器周期2、工作电压 5.5-3.5V3、1280字节RAM4、通用I/O口,复位后为:准双向口/弱上拉可设置成四种模式:准双向口/弱上拉,强推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA5、有EEPROM功能6、看门狗7、内部集成MAX810专用复位电路8、外部掉电检测电路9、时钟源:外部高精度晶体/时钟,内部R/C振荡器常温下内部R/C振荡器频率为:5.0V单片机为:11~17MHz3.3V 单片机为:8~12MHz10、4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T111、3个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,独立波特率发生器可以在P1.0口输出时钟12、外部中断I/O口7路,传统的下降沿中断或电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,CCP0/P1.3,CCP0/P1.313、PWM2路14、A/D转换,10位精度ADC,共8路,转换速度可达250K/S15、通用全双工异步串行口(UART)16、双串口,RxD2/P1.2,TxD2/P1.317、工作范围:-40~8518、封装:LQFP-48,LQFP-44,PDIP-40,PLCC管脚说明P0.0~P0.7 P0:P0口既可以作为输入/输出口,也可以作为地址/数据复用总线使用。
单片机STC5A60S2完成音频采集与输出.c文件(主程序):/*-------------------------------------------------------------------*///一般说明//使用的单片机为STC5A60S2,外接晶振32.768M//采用受用单片机自带的AD,单片机自带的PWM做DA输出使用//两个按键一个控制录音,一个控制输出,上电默认状态为实时输出//外接RAM采用62256/*-------------------------------------------------------------------*/#include ;#include ;#include ;#include ;//#include ; //调用数字滤波头文件,里面内容比较杂,调试证明作用不明显#define uchar unsigned char#define uint unsigned intsfr AUXR=0x8E; //控制定时器0、1工作速度sfr BUS_SPEED=0xA1; //控制外扩RAM速度寄存器sfr P1M1=0x91; //设置I/O口工作状态sfr P1M0=0x92;sbit P15=P1^5; //P1^5接按键1sbit P16=P1^6; //P1^6 接按键2uchar keycode; //定义键码变量uchar xdata C5A60S2_ADC[32768]; //用片外RAM存储采样值/*-------------------------------------------------------------------*/void keyscan(void) //扫描键盘子程序{P15=1;_nop_();_nop_();P16=1;_nop_();_nop_();if(P15==0){delay(1);if(P15==0);keycode=1; //按键1控制关输出,开采集}if(P16==0){delay(1);if(P16==0) //按键2控制开输出,关采集keycode=2;}}/*-------------------------------------------------------------------*/void Init_T(){//BUS_SPEED=0; //控制外扩RAM速度读写在1T状态,注意62256最大承受速度约14M//PT0=1; //设置优先级//PT1=0;AUXR=0Xc0; //定时器0、1工作于不分频状态,即速度为常规12倍P1M1=1; //使P1.0工作于高阻状态做AD使用,P1M0=9; // PWM强推挽输出电流达到20mAET0=1;TMOD=0X11; //定时器工作在模式1TR0=1; //开启定时器0TL0=0xa0; //保证采样速度与输出速度一致TH0=0xf0;ET1=1;TR1=1; //开启定时器0TL1=0xa0; //保证采样速度与输出速度一致采样速度为540个时钟TH1=0xf0;}/*---------------------------------------------------------------- */time0() interrupt 1 using 2 //定时器0中断用于定时采集音频{static uint ram_in=0; //存入第几个ram单元ADC_CONTR=0xe8; //清空转换完成标志位,同时开启下一次转换C5A60S2_ADC[ram_in++]=ADC_RES;;if(ram_in==32768) ram_in=0; //如果存满RAM回到TL0=0xa0; // 采样速度为?个时钟TH0=0xf0;}/*-----------------------------------------------------------------*/time1() interrupt 3 using 3 //定时器0中断用于定时输出音频{static uint ram_out=0; //输出第几个ram单元PWM(C5A60S2_ADC[ram_out++]); //输出音频if(ram_out==32768) ram_out=0; //如果读完RAM,回到第一位TL1=0xa0; //保证采样速度等于输出速度TH1=0xf0;}/*-----------------------------------------------------------------*/void main(){Init_ADC(); //AD初始化Init_PWM(); //PWM初始化Init_T(); //初始化定时器while(1){keyscan() ;if(keycode==1){ TR0=1;TR1=0;CCAPM0=0;keycode=0;} //按键1控制开采集、关输出if(keycode==2){ TR0=0;TR1=1;CCAPM0=0x42;keycode=0 ;} //按键2控制关采集、开输出,}}.H文件1(AD.H):#define uchar unsigned char#define uint unsigned int/*---------------------------------------------------*///注意AD转换使用的是内部时钟/*---------------------------------------------------*///定义特殊功能寄存器sfr ADC_CONTR=0xBC; //AD控制寄存器sfr ADC_RES=0xBD; //AD输出高八位寄存器sfr ADC_LOW2=0xBE; //AD输出最后两位寄存器sfr PLASF=0x9D; //控制P1口中的哪个作为模拟口sfr IPH=0XB7; //中断优先级控制位sfr AUXR1=0XA2; //设置AD转化结果寄存器的存储方式//定义与AD有关寄存器的控制位#define ADC_POWER 0X80 //AD电源控制位#define ADC_FLAG 0X10 //AD转换完成标志位,必须软件清零#define ADC_START 0X08 //控制AD开始转换位#define ADC_SPEEDLL 0X00 //540个时钟#define ADC_SPEEDL 0X20 //360个时钟#define ADC_SPEEDH 0X40 //180个时钟#define ADC_SPEEDHH 0X60 //90个时钟sbit EADC=IE^5; //定义单片机内部自带AD中断标志位/*--------------------------------------------------------*///延时子程序void delay(uint n){while(n--);}/*--------------------------------------------------------*///初始化与单片机内部自带AD相关的寄存器void Init_ADC(){//IPH=0X20; //AD中断设置为最高优先级 0x20//IP=0X20;//开启中断总开关及AD中断开关0x20//EA=1;//EADC=1; //开启AD中断开关,AD的开关标志位同89C52的T2标志位//AUXR1=0; //AD转化结果寄存器的存储方式8高+2低这是默认值可以不设置PLASF=0x01; //设置P1.0作为模拟口ADC_RES=0 ; //清空AD输出高八位寄存器//默认的AD输出存储方式为8+2ADC_CONTR=0xe8;//(ADC_POWER|ADC_SPEEDLL|ADC_START|0x00); //开启AD电源,以90个时钟速度采样,并选择P1.0作为输入口delay(1000); //初次打开内部AD模拟电源需要适当延时,使电源稳定。
增强型51单片机STC12C5A60S2的内部AD和PWM波以及时钟输出程序#ifndef __ad_h__#define __ad_h__uint adzhi[8]; //AD值存放数组void AD_Init(){AUXR1|=0X04; //设置AD的ADRJ位为1,使AD取十位结果RES寄存器存高两位,RESL存低七位ADC_CONTR=0X80; //开AD转换电源,第一次使用时要打开内部模拟电源delayms(1);P1ASF=0xff; //P1口7路ADC}void Get_AD(){uchar i;uint res,resl; //AD结果暂存变量uchar status=0; //AD转换状态ADC_CONTR=0X80; //再次打开电源delayms(1);for(i=0;i<8;i++){ADC_CONTR=(0X80|i); //设定转换的通道ADC_CONTR|=0x08; //开始AD转换status=0;while(!(ADC_CONTR&0x10));//等待转换完成ADC_CONTR&=0xE7; //清零即D3位start清零,D4位转换结束标志位ADC——flag清零res=ADC_RES; //存储高两位resl=ADC_RESL; //存储低八位adzhi[i]=res*256+resl;}}void PWM_Init(){CMOD=0X84; //初始化工作模式寄存器CCON=0X00; //所有标志位清零CL=0;CH=0; //给PCA的16位计数器赋初值CCAP0H=CCAP0L=0x80; //给占空比100%CCAPM0=0X42; //工作在PWM波模式,且无PCA中断PCA_PWM0=0X00; //最高位给00CCAP1H=CCAP1L=0x80; //给PWM1占空比50%CCAPM1=0X42; //工作模式设定PCA_PWM1=0x00;CR=1; //启动}void CLK(){TMOD=0X22; //T0、T1工作在方式2,8位自动重装AUXR|=0X80; //T0工作在1T模式AUXR|=0X40; //T1工作在1TAUXR|=0X04; //独立波特率发生器工作在1TBRT=106;TH0=106;TH1=106;WAKE_CLKO|=0X07; //允许T0、T1,独立波特率发生器输出时钟TR0=1; //启动计数TR1=1;AUXR|=0X10; //启动BRT工作,对系统时钟进行分频输出while(1);}#endif。
.//****************************************************************************////STC12C5A60S2 可编程时钟模块//////说明: STC12C5A60S2 单片机有三路可编程时钟输出CLKOUT0/T0/P3.4//CLKOUT1/T1/P3.5、CLKOUT2/P1.0////涉及寄存器: AUXR( 辅助寄存器 )、 WAKE_CLKO( 时钟与系统掉电唤醒控制寄存器 )//BRT( 独立波特率发生器定时器寄存器)////程序说明://本程序可选实现P3.4 输出 CLKOUT0时钟、P3.5输出CLKOUT1时钟//P1.0 输出 CLKOUT2时钟//////****************************************************************************//#include <STC12C5A60S2.H>#include <intrins.h>//#define Port_BRT//如果想测试独立波特率发生器时钟输出请打开此句//若想测试CLKOUT1和CLKOUT0请注释此句#ifdef Port_BRT/* 条件编译独立波特率发生器时钟输出*///*********************************////CLKOUT2时钟初始化////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许 P1.0 配置为独立波特率发生器的时钟输出//BRT 工作在 1T 模式下时的输出频率 = Sysclk/(256-BRT)/2 //BRT工作在 12T 模式下时输出频率 = Sysclk/12/(256-BRT)/2 AUXR= 0x14;//Bit4-BRTR允许独立波特率发生器运行//Bit2-BRTx12 BRT工作在1T模式下BRT= 0xff;// 更改该寄存器的值可实现对输出的时钟频率进行分频}#else/* 条件编译CLKOUT0时钟输出*///*********************************//// CLKOUT0时钟和CLKOUT1初始化////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x03;//允许将 P3.4/T0 脚配置为定时器0 的时钟输出CLKOUT0//T0 工作在 1T 模式时的输出频率= SYSclk/(256-TH0)/2//T0 工作在 12T 模式时的输出频率= SYSclk/12/(256-TH0)/2//1T 指的是每 1 个时钟加1,是普通 C51 的 12 倍//12T 指的是每 12 个时钟加 1 与普通 C51 一样//允许将 P3.5/T1 脚配置为定时器 1 的时钟输出CLKOUT1,只能工作在定时器模式 2 下//T1 工作在 1T 模式时的输出频率 = SYSclk/(256-TH0)/2 //T1 工作在 12T 模式时的输出频率 = SYSclk/12/(256-TH0)/2 //1T 指的是每 1 个时钟加 1,是普通 C51 的 12 倍 //12T 指的是每 12 个时钟加 1 与普通 C51 一样AUXR= 0xc0;//T0 定时器速度是普通8051 的 12 倍 ,即工作在1T 模式下//T1 定时器速度是普通8051 的 12 倍 ,即工作在1T 模式下TMOD= 0x22;//定时器 0 工作模式为方式2,自动装载时间常数//定时器 1 工作模式为方式2,自动装载时间常数TH0= 0xff;// 更改该寄存器的值可实现对输出的时钟频率进行分频TL0= 0xff;TH1= 0xff;// 更改该寄存器的值可实现对输出的时钟频率进行分频TL1= 0xff;TR1= 1;TR0= 1;}#endif//**********************************////主程序////**********************************//void main(){CLKOUT_init();while(1);}//****************************************************************************////STC12C5A60S2 系统时钟模块//////说明:STC12C5A60S2单片机有两个时钟源,内部R/C 振荡时钟和外部晶体时钟//出厂标准配置是使用外部晶体或时钟//////涉及寄存器:CLK_DIV(时钟分频寄存器)//由该寄存器的Bit0-2 组合可实现对时钟源进行0、 2、 4、 8、16 //32、 64、 128 分频//////程序说明://对外部时钟进行分频得到Sysclk, 然后经过P1.0 的独立波特率//时钟输出功能Sysclk/2 输出时钟频率//****************************************************************************//#include <STC12C5A60S2.h>#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的 sysclk//93750为93.75kHz的 sysclk//*********************************************////系统时钟初始化////*********************************************//void Sysclk_init(void){WAKE_CLKO = 0x04;// 配置 P1.0 口为频率输出AUXR= 0x14;// 允许波特率时钟工作// 工作模式为1TBRT= 0xff;#if( Bus_clk == 12 )CLK_DIV = 0x00;#elif( Bus_clk == 6 )CLK_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 )CLK_DIV= 0x06;#elif( Bus_clk == 93750 )CLK_DIV= 0x07;#endif}//**********************************************////主程序////**********************************************//void main(){Sysclk_init();while(1);}//****************************************************************************////STC12C5A60S2系统省电模块//////说明:STC12C5A60S2 单片机有三种省电模式以降低功耗.空闲模式,低速模式//掉电模式//////涉及寄存器: PCON( 电源控制寄存器 )//Bit0 - IDL控制单片机进入 IDLE 空闲模式//Bit1 - PD控制单片机进入掉电模式//////程序说明:程序实现让单片机先工作一阵子(通过 P0^3 指示灯显示 )//然后进入掉电状态,利用外部中断0 口来唤醒单片机工作//唤醒后单片机将通过P0^0-3 口的灯闪烁显示开始工作////****************************************************************************/ /#include <STC12C5A60S2.h>#include <intrins.h>#define uchar unsigned char#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;//外中断唤醒输入口void Delay_ms( uint time );void Normal_work(void);void Intp_init(void);void After_Powr_Down(void);//***********************************////软件延时////***********************************//void Delay_ms( uint time ){uint t;// 延时时间= (time*1003+16)us while(time--){for( t = 0; t < 82; t++ );}}//***********************************////正常工作指示//***********************************//void Normal_work(void){Normal_Work_LED = 1;Delay_ms(500);Normal_Work_LED = 0;Delay_ms(500);}void After_Power_Down(void){uchar i ;for( i = 0; i < 100; i++ ){P0 = 0x0f;Delay_ms(500);P0 = 0x00;Delay_ms(500);}}//***********************************////中断初始化////***********************************//void Intp_init(void){IT0 = 0;// 外部中断源0 为低电平触发EX0 = 1;//允许外部中断EA = 1;//开总中断}//***********************************////主程序////***********************************//void main(){uchar j = 0;uchar wakeup_counter = 0;//记录掉电次数P0 = 0x00;Chip_Start_LED= 1;// 单片机开始工作Intp_init();// 外中断 0 初始化while(1){P2 = wakeup_counter;wakeup_counter++;for( j = 0; j < 250; j++ ){Normal_work();// 系统正常工作指示}Power_Down_Flag = 1; //系统开始进入掉电状态PCON = 0x02;_nop_();_nop_();_nop_();_nop_();After_Power_Down();// 掉电唤醒后}}//**********************************////中断服务//**********************************//void INT0_Service(void) interrupt 0{if( Power_Down_Flag )//掉电唤醒状态指示{Power_Down_Flag= 0;Power_Down_LED_INT0= 1;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 ){_nop_();}N_Power_Down_LED_INT0 = 0;}}//****************************************************************************////STC12C5A60S2A/D 转换模块//////说明: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 口的状态 ,有利于高精度A/D 转换//若能将定时器 /串行 /中断系统关闭更好。
STC12C5A60S2 的引脚功能
VCC:供电电压;
GND:接地;
P0 口:P0 口为一个8 位漏级开路双向I/O 口,每个管脚可吸收8TTL 门电
流。
当P1 口的管脚写1 时,被定义为高阻输入。
P0 能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FLASH 编程时,P0 口作为
原码输入口,当FLASH 进行校验时,P0 输出原码,此时P0 外部电位必须被
拉高;
P1 口:P1 口是一个内部提供上拉电阻的8 位双向I/O 口,P1 口缓冲器能
接收输出4TTL 门电流。
P1 口管脚写入1 后,电位被内部上拉为高,可用作
输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH 编程和校验时,P1 口作为第八位地址接收;
P2 口:P2 口为一个内部上拉电阻的8 位双向I/O 口,P2 口缓冲器可接
收,输出4 个TTL 门电流,当P2 口被写1 时,其管脚电位被内部上拉电阻
拉高,且作为输入。
作为输入时,P2 口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。
P2 口当用于外部程序存储器或16 位地址外部数据存储器进行存取时,P2 口输出地址的高八位。
在给出地址1 时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的内容。
P2 口在FLASH 编程和校验时接收高八位地址信号。
基于STC12C5A60S2的电子钟硬件设计
简讯;黄金平
【期刊名称】《长江大学学报(自然版)理工卷》
【年(卷),期】2016(013)016
【摘要】提出了一种基于单片机的电子钟硬件设计方法。
硬件电路以
STC12C5A60S2单片机为主控电路,辅之以DS1302时钟电路、DS18b20温度采集电路、LCD12864显示电路、按键设置电路。
该电子钟能实时显示星期、时间、日期、温度以及周数、学期、季节、通知和闹铃等信息,且具有时间和日期的校准功能,通过按键设置的闹铃会在指定的时间响起。
系统采用 LCD12864显示数据,使得操作人性化、显示效果直观化。
【总页数】6页(P51-56)
【作者】简讯;黄金平
【作者单位】武汉贝斯特通信集团股份有限公司,湖北武汉 430024;长江大学电子信息学院,湖北荆州 434023
【正文语种】中文
【中图分类】TN873;TH714
【相关文献】
1.基于STC12C5A60S2单片机的LED显示屏硬件设计 [J], 刘晋;王政林;薛凯方
2.基于STC12C5A60S2的新型多功能电子钟设计 [J], 张曙云;匡洪海;曾丽琼;陈海东;冯韧
3.基于Verilog HDL的简易电子钟设计 [J], 李昊旻;王颖
4.基于Multisim 14仿真设计的多功能数字电子钟 [J], 金子涵;任致远;史旭东;王胜铎
5.基于MAX7219显示驱动芯片的电子钟的设计 [J], 周彦明;梁伟鄯;李旺昆
因版权原因,仅展示原文概要,查看原文内容请购买。