基于STC12C5A60S2系列单片机万年历时钟
基于单片机的万年历时钟设计【文献综述】

毕业设计开题报告测控技术与仪器基于单片机的万年历时钟设计1前言部分在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每个人都受到时间的影响。
为了更好的利用我们自己的时间,需要一款灵活、稳定而又功能强大的自动定时控制系统,以规范本单位的作息时间或定时控制一些设备。
目前,市面上出现的一些时控设备或功能单一,或使用烦琐,或价格昂贵,总有一些不尽如人意的地方[1]。
我们必须对时间有一个度量,因此产生了钟表。
钟表的发展是非常迅速的,17 世纪中叶, 由荷兰人C. Huygens来发明的第一个钟摆与以前任何计时装置相比, 摆钟的精确度提高了上百倍,而他随后发明的螺旋平衡弹簧,又进一步提高精度、减小体积, 导致了怀表的出现。
然而再好的摆钟,其精度也只能达到每年误差不超过一秒[2]。
1939年出现了利用石英晶体振动计时的石英钟, 每天误差只有千分之二秒, 到二次大战后精度提高到30 年才差一秒。
很快, 测年的技术又推进到原子层面, 1948 年出现第一台原子钟, 1955年又发明了铯原子钟, 利用Cs133原子的共振频率计时,现在精度已经高达每天只差十亿分之一秒[2]。
从刚开始的机械式钟表到现在普遍用到的数字式钟表,即使现在钟表千奇百怪,但是它们都只是完成一种功能——计时功能,只是工作原理不同而已,在人们的使用过程中,逐渐发现了钟表的功能太单一,无法更大程度上的满足人们的需求。
发展到现在人们广泛使用的万年历。
万年历在家庭居室、学校、车站和广场使用越来越广泛,给人们的生活、学习、工作带来极大的方便[3]。
电子万年历具有信息量大、直观清晰、经济实用等优点,正成为家庭、商场、公共场所等新的消费热点,具有重要的开发价值[4]。
随着科技的不断发展,家用电子产品不但种类日益丰富,而且变得更加经济实用,,功能也越来越齐全,除了公历年月、日、时分秒、星期显示及闹铃外,又增加了农历、温度、24节气及l2生肖等显示。
STC12C5A60S2 系列单片机器件手册 说明书

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单片机c语言程序代码调试例程

//12T指的是每12个时钟加1与普通C51一样
//允许将P3.5/T1脚配置为定时器1的时钟输出CLKOUT1,只
能工作在定时器模式2下
//T1工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2
//T1工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2
//工作模式为1T
BRT = 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 )
void Delay_ms( uint time )
{
uint t; //延时时间 = (time*1003+16)us while(time--)
{
for( t = 0; t < 82; t++ );
}
}
//***********************************//
//1T指的是每1个时钟加1,是普通C51的12倍
//12T指的是每12个时钟加1与普通C51一样
AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下
//T1定时器速度是普通8051的12倍,即工作在1T模式下
TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数
#define uchar unsigned char
基于单片机万年历设计

摘要在电子技术迅速发展的今天,尤其是随大规模集成电路出现,给人类生活带来了根本性的改变。
特别是单片机领域中的应用产品已经走进了大部分人的家庭。
电子万年历的出现给人们的生活带来的诸多方便。
本设计首先描述系统总体模块工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。
本设计以数字集成电路技术为基础,单片机技术为核心。
本系统以单片机的进行软件设计,增加了程序的可读性和可移植性,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。
单片机具有体积小,成本低,抗干扰能力强,面向控制,可以实现分机各分布式控制等优点。
本文研究的万年历系统就是利用单片机上述的优点,采用目前市场性价比比较高的STC89C52单片机控制、以DS1302时钟芯片计时、以LCD1602液晶屏显示,系统主要有单片机控制电路,时钟电路,显示电路及校正电路四个模块组成。
本文阐述了系统的硬件工作原理,所应用的各个接口模块的功能以及工作过程。
系统程序采用C语言编写,用protel 99se 画出电路图,经keil软件进行调试后在仿真软件中进行仿真测试,可以显示年、月、日、星期、时、分、秒,并具有校准功能和与即时时间同步的功能。
此万年历具有读取方便、显示直观、功能多样、电路设计新颖、功能强大、结构简单等优点,符合电子仪器仪表的发展趋势,具有广阔的市场应用前景。
关键词:单片机; STC89C52 ; DS1302; LCD1602AbstractIn the electronic technology is developing rapidly today, especially with the eme rgence of large-scale integrated circuits, to human life brought about a fundamental change. Especially in the field of single-chip application products have entered the most people's family. Electronic calendar has brought to people's lives a lot of convenience. The design of the first to describe the overall system module principle, together with the system block diagram to illustrate the structure, emphatically introduces the application of the system interface technology of the hardware and the interface module functions and work processes, and secondly, the procedures described in detail the various modules and the realization process. The design of digital integrated circuits technology, single-chip technology as the core.SCM has the advantages of small volume, low cost, strong anti-interference ability, the control, can realize the extension of the advantages of distributed control. This paper studies the calendar system is to use SCM the advantages, the current market price is relatively high, the STC89C52 control with DS1302 clock chip timing, LCD1602 LCD screen display, the system has a single-chip microcomputer control circuit, clock circuit, display circuit and a correction circuit is composed of four modules. System program using C language, in Protel 99SE to draw circuit diagram, the keil software debugging in the simulation software simulation testing, can show the year, month, day, week,hour, minutes and seconds, and has a calibration function and with the instant time synchronization function.This calendar is convenient, intuitive display, functional diversity, novel circuit design, powerful, simple structure and other advantages, in line with the development trend of electronic instrumentation, and has wide market application prospect.Key words: single chip microcomputer; STC89C52; DS1302; LCD1602目录摘要 (II)1 前言 (1)1.1 课题的背景 (1)1.2 课题的主要目的 (1)1.2.1 课题设计的主要意义 (1)1.2.2 论文结构 (2)2 单片机的概述和芯片、元器件的正确选择 (3)2.1 单片机的定义和特点 (3)2.1.1 单片机的定义 (3)2.1.2 单片机的特点 (3)2.2 单片机的应用及发展趋势 (3)2.3 单片机芯片的选择 (4)2.4 显示模块选择 (4)2.5 时钟芯片的选择 (4)2.6 元器件的选择 (5)3 硬件的设计 (6)3.1 主要的单元电路模块 (6)3.1.1 STC89C52单片机的简介 (6)3.1.2 复位电路的设计 (8)3.1.3 晶振电路的设计 (9)3.2 时钟电路模块 (9)3.2.1 DS1302时钟芯片的简介 (9)3.2.2 时钟电路 (11)3.3 显示模块的设计 (11)3.3.1 LCD1602显示模块的简介 (11)3.3.2 显示电路 (13)4 软件的设计 (14)4.1 程序流程图 (14)4.1.1 系统总流程图 (14)4.1.2 时钟程序流程图 (15)4.1.3 显示程序流程图 (16)4.2 仿真图 (17)4.3 程序的设计 (17)5 结论 (34)参考文献 (34)致谢词 (34)附录 (35)1 前言1.1 课题的背景万年历是我国古代传说中最古老的一部太阳历。
基于STC12C5A60S2单片机的测障系统设计

测 障系 统 由测距 和测 方 位等 功 能组 成 , 它 是 一 个 多 参数 、 多 功能 采 集 系统 , 而 基 于 过 程 处 理 的 前 后 台 系 统 已 很 难 在 实 时 性 和 可 靠 性 上 满 足 要 求 。 随 着 技 术 的 进 步 ,一 些 8位 及 以 上 微 控 制 器 已 能 嵌 入 实 时 操 作 系 统
精度 高、 实时 好 和 扩展 性 好 等 优 点 。 关 键 词 :测 障 系 统 ;p  ̄ C / O S - I I ; 多任 务 ; 单 片 机
中 图分 类 号 :T P 3 6 8 文 献 标 识 码 :A 文 章 编 号 :1 6 7 4 — 7 7 2 0 ( 2 0 1 3 ) 1 2 — 0 0 1 7 — 0 3
1 系 统 方 案 和 主 要 电 路
系统 硬 件 主要 由 S T C 1 2 C 5 A 6 0 S 2单 片 机 、 超 声 波 电 路 、 数字 温度 传感 器 D S 1 8 B 2 0、 时钟 芯 片 D S 1 3 0 2、 液 晶 显
示器 L C D1 2 8 6 4 ( S T 7 9 2 0 ) 组成 , 硬 件 框 图 如 图 1所 示 。
机 为 主控 核 心 , 外 围 电路 主 要 由超 声 波 测距 、 电子 罗盘 测 方 位 、 数 字 测 温 和 液 晶显 示 电路 组 成 。 测距 由超 声 波 渡越 时 间 法 实现 , 利 用 所 测 温 度 实 时修 正 参 数 , 提 高 了 测 距 精 度 。 方 位 由 电 子 罗 盘 采 集 并 以 数 字 量输 出, 简化 了电路 。系统软 件 是 一 个微 内核 、 多任 务 的 实 时 系统 , 将 ̄ C / O S — I I 嵌入 单 片机 , 多参 数 采 集程 序 运 行 之 上 , 弥补 了前 后 台 系统 处 理 多参数 实时性 差 的不 足 。 实际运 行 表 明 , 系统 具 有 测试
单片机万年历时钟

#include<reg52.h> //用定时器实现电子时钟#include<delay.h>#define uint unsigned int#define uchar unsigned charsbit wela = P2^7;sbit dula = P2^6;sbit lcdrs = P1^0;sbit lcdrw = P1^1;sbit lcden = P2^5;sbit beep = P2^3;uchar lcd1[] = "2014-07-22 TUE";uchar lcd2[] = "00-00-00";uchar num;uchar hour = 23,min = 59,sec = 50;uchar i;//循环时用到i计数uchar month = 7,day = 22;uint year = 2014, week = 3; //时间初始化,可自己定义void write_com(uchar com) //写命令{lcdrs = 0;lcden = 0;P0 = com;delayms(3);lcden = 1;delayms(3);lcden = 0;}void write_data(uchar dat) //写数据{lcdrs = 1;lcden = 0;P0 = dat;delayms(5);lcden = 1;delayms(5);lcden = 0;}void init()//液晶初始化,包括第一次的显示{dula = 0;wela = 0;lcden = 0;lcdrw = 0;write_com(0x38);//设置16*2显示,5*7点阵,8位数据口//delayms(5); //确保程序安全写入,程序小的情况下write_com(0x0c); //设置开显示,不显示光标//delayms(5);write_com(0x06);//写一个字符后地址指针加一//delayms(5);write_com(0x01);//显示清零,数据指针清零//delayms(5);write_com(0x80); //从第一行第一个光标开始//delayms(5);for(i=0;i<14;i++){write_data(lcd1[i]);delayms(1);}write_com(0x80+0x43); //从第二行第三个开始显示for(i=0;i<8;i++){write_data(lcd2[i]) ;delayms(1);}TMOD = 0x01; //定时器中断0初始化TH0 = (65536-45872)/256;TL0 = (65536-45872)%256;EA = 1;TR0 = 1;ET0 = 1;}void display_sfm(uchar add,uchar date){uchar shi,ge;shi = date/10;ge = date%10;write_com(0x80+0x40+add); //找到位write_data(0x30+shi);//写数据,0x30是16进制,在液晶中代表0,加几代表写几write_data(0x30+ge ) ;// 写数据依次来的}void display_week(uchar a )//显示星期几{switch(a){case 1: write_com(0x80+11);//星期一write_data(0x40);write_data(0x4f);write_data(0x4e);break;case 2: write_com(0x80+11);write_data(0x54);write_data(0x55);write_data(0x45);break;case 3: write_com(0x80+11);write_data(0x57);write_data(0x45);write_data(0x44);break;case 4: write_com(0x80+11);write_data(0x54);write_data(0x48);write_data(0x55);break;case 5: write_com(0x80+11);write_data(0x46);write_data(0x52);write_data(0x49);break;case 6: write_com(0x80+11);write_data(0x54);write_data(0x48);write_data(0x55);break;case 7: write_com(0x80+11);write_data(0x53);write_data(0x55);write_data(0x4e);break;}}void display_yue_ri(uchar add,uchar date) {uchar shi,ge;shi = date/10;ge = date%10;write_com(0x80+add); //找到位write_data(0x30+shi);//写数据,0x30是16进制,在液晶中代表0,加几代表写几write_data(0x30+ge);// 写数据依次来的}void display_year(uint year)//注意数据之间的传输不要出现错误{uchar a,b,c,d;a = year/1000;b = year/100%10;c = year/10%10;d = year%10;write_com(0x80);//控制指针write_data(0x30+a);//控制显示什么数字write_data(0x30+b);write_data(0x30+c);write_data(0x30+d);}void main()//主程序内越精简越好{init();while(1){if(num==20){num = 0;sec++;if(sec==60){sec = 0;min++;if(min==60){min = 0;hour++;if(hour==24){hour = 0;day++;display_week(week);//显示星期几week++;if(week==8)week = 0;if(((year/4==0&&year/100!=0)||(year/400==0)&&(month==2))&&(day==29))//闰年2月判断{day = 0;month++;}if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))&&(day==31))//1.3.5.7.8.10.12月份{day = 0;month++;}if(((month==4)||(month==6)||(month==9)||(month==11))&&(day==30))//4.6.9.11月份{day = 0;month++;}if((!(year/4==0&&year/100!=0)||(year/400==0))&&(month==2)&&(day==28))//非闰年2月判断{day = 0;month++;}if(month==12){month = 1;year++;}}}}display_sfm(9,sec);//显示display_sfm(6,min);display_sfm(3,hour);display_year(year);display_yue_ri(5,month);display_yue_ri(8,day);}}}void T0_timer() interrupt 1{TH0 = (65536-45872)/256;TL0 = (65536-45872)%256;num++;}。
单片机STC12C5A60S2

单片机STC12C5A60S2在众多的51系列单片机中,要算国STC 公司的1T增强系列更具有竞争力,因他不但和8051指令、管脚完全兼容,而且其片的具有大容量程序存储器且是FLASH工艺的,如STC12C5A60S2单片机部就自带高达60K FLASH ROM,这种工艺的存储器用户可以用电的方式瞬间擦除、改写。
而且STC系列单片机支持串口程序烧写。
显而易见,这种单片机对开发设备的要求很低,开发时间也大大缩短。
写入单片机的程序还可以进行加密,这又很好地保护了你的劳动成果。
重要的一点STC12C5A60S2目前的售价与传统51差不多,市场供应也很充足。
是一款高性价比的单片机STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;2.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V-2.2V(3V单片机);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,但整个芯片最大不要超过55Ma;7. 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,三线通信,还多了串口。
用DS1302与LCD1602设计可调数字万年历课程设计

数字开发与实践课程设计题目:用DS1302与LCD1602设计可调式电子日历时钟班级:姓名:学号:学院:年月日用DS1302与LCD1602设计的可调式电子日历时钟一、总体设计1.1、设计目的为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与DS1302 设计可调式电子日历时钟。
1.2、设计要求(1)显示:年、月、日、时、分、秒和星期;(2)设置年、月、日、时、分、秒和星期的初始状态;(3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期;完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。
控制程序的编写等。
备注:本程序另外添加了每到上午8:10和下午2:10的闹钟提醒功能。
1.3、系统基本方案选择和论证1.3.1、单片机芯片的选择方案方案一:采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。
方案二:采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
但造价较高。
1.3.2 、显示模块选择方案和论证:方案一:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。
所以不用此种作为显示。
方案二:采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。
所以也不用此种作为显示。
方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/**************************************************//*基于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();}}。