单片机 实时时钟

合集下载

单片机应用技术讲座(11)——第九讲 实时时钟及其软硬件的实现方法

单片机应用技术讲座(11)——第九讲 实时时钟及其软硬件的实现方法
认 识 。下 面 以 电子钟 的项 目设 计为 例来 具 体说 明 。 3绘 制流 程 图 .
要 求不 高 的场 合 ; 二 是采 用 时钟 芯 片 , 比较 典 型 的 时钟 芯 片
有 摩 托 罗 拉 公 司 的M C1 6 1 , 达拉 斯 公 司 的 DS1 8 7 4 8 8 8、 2 DS 3 2 1 0 和飞 利浦 公 司 的P 8 6 、P F 5 3 。早期 的 时钟 CF 5 3 C 8 8 等 芯 片 一般 采 用 并行 接 口方式 , 如Mc1 6 1 。现 在 流行 的则 4 88
个 单片机 “ 高手 ”成长 的过程就 是一个 经验积 累的过程 ,也就 是 “ 子程序 ”积累 的过程 。当你 真正掌 握 了几 十甚至几 百个 子 程序 并能熟 练运用 的时候 ,你也 就是所谓 的 “ 高手 “ 了, 因此 在 单片机这 个行 当,许多 人甚至 是该领域 的专 家都这 样认为 : 理论 是基础 ,经验 才是最为 宝贵 的财富 。这些 宝贵 的经 验正 是
他 们在 实践 中不 断总 结和 积累 的结 晶 。图 1 则说 明 了单 片机软 件 系统 的主 程序 和子 程序 的 关系 ,也是 读者 必 须掌 握 的。 从 图 1 以清楚地 看 到, 主程序 主要 包含 伪指 令 定义 、 可 初始 化过程 、子程 序调用 三部分 内容 。伪指令 是一种控 制汇 编 进程 的特殊 的控 制符号, 通常在 主程序 开头定 义,用 好伪指 令 可 以使 程序 具有很 好的可 读性并 易于操作 。初始 化过程 主要 是 对一 些控 制寄存器 ( 中断控 制 )、数据 区和外部芯 片 ( I 如 如 / O口扩展 芯片 8 5 )进行 初始 参数设 置 和定义 。子程 序调 用是 15 主程 序 的 基 本任 务 ,一 个 主程 序 可 以调 用多 个 子程 序 ,对 于 8 C5 单 片机 , 由于 系统 资源有 限 ,主程 序通 常是 一个 无限 循 9 1 环 的过程 , 即是 一个反 复调 用 子程 序 的过程 ( 的粗 线箭 头 图1 实 线就 是一 个子程 序调用 过程 )。子程 序主要 分为 中断子程 序 和功 能子程 序,它 们之 间可以相互 嵌套 和调 用 , 即中断子程序 可 以调 用 功 能子 程序 。在 应用 软件 的设 计 中, 读者 一 定 要注 意 :应 尽可 能将各个 功能模块 写成 子程序 的形式 ,并通 过主程 序调用 ,只有 这样 ,软件结 构才会 清晰 明了,也 易于维 护 。明 确 了主程 序 和子程序相 互之 间的 关系,对于 初学 者还必 须要学 会绘 制流程 图,这样 才能对 系统 的总体概念 有一 个 比较 清晰 的

基于单片机实时时钟-串口显示

基于单片机实时时钟-串口显示
readtime[4]=(time_buf[2]>>4); //分离出月十位
readtime[5]=(time_buf[2]&0x0F); //分离出月个位
readtime[6]=(time_buf[3]>>4); //分离出日十位
readtime[7]=(time_buf[3]&0x0F); //分离出日个位
TI=0; //清中断
EA=1;
}
Delay_xms(1000);
}
}
{
Delay_xms(50);//等待系统稳定
ds1302_init(); //DS1302初始化
Uart_init(0); //波特率初始化为2400
Delay_xms(10);
ds1302_write_time(); //写入初始值
while(1)
{
ds1302_read_time(); //读取时间
}
//向DS1302写入一字节数据
void ds1302_write_byte(uchar addr, uchar d)
{
uchar i;
RST=1;//启动DS1302总线
//写入目标地址:addr
addr = addr & 0xFE; //最低位置零,寄存器0位为0时写,为1时读
for (i = 0; i < 8; i ++) {
ds1302_write_byte(ds1302_date_add,time_buf[3]);//日
ds1302_write_byte(ds1302_hr_add,time_buf[4]);//时
ds1302_write_byte(ds1302_min_add,time_buf[5]);//分

单片机系统时钟与实时时钟有什么区别?

单片机系统时钟与实时时钟有什么区别?

单片机系统时钟与实时时钟有什么区别?
1、大多数单片机都只有系统时钟一个。

就是CPU的各节拍工作时序的驱动源了。

这个频率一般为几MHz。

速度比较快,其目的无非是让单片机快点干活。

那为啥不是GHz数量呢,这个是集成电路工艺决定的。

根据工艺反推出某款单片机的理想工作频率,往往也是最佳工作频率了。

系统在这个频率下工作又快(已达最佳极限)又稳定。

最好地体现了计算机的高速运算能力。

 2、实时时钟,是单片机计时的时钟或独立的可被单片机访问的时钟。

它可以外部扩展芯片得到,如1302,1307,12887,3130,12020,m41t81,6902,8025。

有并口有串口,有带电池自己玩,有外部供电,看实际需要设计。

这些时钟无一例外地用到了32768Hz。

这是因为它们用了同一个计时IC核、低频功耗更低、更容易校表和1Hz计时精密实现。

大伙在该基础上做了不同的文章,有的搞点稳定晶振放里面,有的搞点备电方案,有的接口不同,有的搞点万年历,有的搞点报警,有的
 3、还有可能你提到的(可能就是430系列单片机),内部集成了RTC这个模块,要求外面接32768Hz。

这样就可以独立地计时,单片机睡觉了也和它的时间管理无关,低成本实时方案,又省了好几毛。

综上:
 【1】系统时钟就是CPU时钟,RTC时钟就是计时时钟。

 【2】系统时钟的目的是高速稳定,而实时时钟目的是低功耗精确。

单片机—实时时钟实验(汇编版)

单片机—实时时钟实验(汇编版)

实验二实时时钟实验一、实验目的1)数码管动态显示技术2)定时器的应用3)按键功能定义二、实验实现的功能实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。

三、系统硬件设计四、系统软件设计说明:1键进入和退出设置模式,4键选择调分或秒,2键加,3键减。

P1M1 EQU 91HP1M0 EQU 92HSEC0 DA TA 30H ;秒显示SEC1 DA TA 31HMIN0 DA TA 32H ;分显示MIN1 DA TA 33HDELAY_1 DA TA 34H ;延时参数DELAY_2 DA TA 35H ;延时参数ORG 0000HLJMP 0030HORG 001BHLJMP INTR0ORG 0030HMAIN: MOV P1M1,#00000000BMOV P1M0,#11111111BMOV R7,#000 ;记中断次数,R7=100为1秒MOV R6,#000 ;记秒MOV R5,#000 ;记分MOV R4,#0FFH ;按键位置MOV R1,#000 ;确定是否有按键按下的参数MOV TMOD,#10H ;定时器初始化MOV TH1,#0D8H ;定时时间10msMOV TL1,#0F0HSETB EASETB ET1SETB TR1LOOP0: CJNE R4,#000H,LOOP01 ;实时时钟显示MOV R4,#0FFHLJMP LOOP1LOOP01: LCALL TIMELCALL KEY0LJMP LOOP0LOOP1: CJNE R4,#000H,LOOP11 ;调秒MOV R4,#0FFHLJMP LOOP0LOOP11: CJNE R4,#003H,LOOP12MOV R4,#0FFHLJMP LOOP2LOOP12: CJNE R4,#001H,LOOP13MOV R4,#0FFHINC R6LOOP13: CJNE R6,#060,LOOP14MOV R6,#000HLOOP14: CJNE R4,#002H,LOOP16MOV R4,#0FFHCJNE R6,#000,LOOP15MOV R6,#060LOOP15: DEC R6LOOP16: LCALL TIMELCALL KEY1LJMP LOOP1LOOP2: CJNE R4,#000H,LOOP21 ;调分MOV R4,#0FFHLJMP LOOP0LOOP21: CJNE R4,#003H,LOOP22MOV R4,#0FFHLJMP LOOP1LOOP22: CJNE R4,#001H,LOOP24MOV R4,#0FFHINC R5LOOP23: CJNE R5,#060,LOOP24MOV R5,#000HLOOP24: CJNE R4,#002H,LOOP26MOV R4,#0FFHCJNE R5,#000,LOOP25MOV R5,#060LOOP25: DEC R5LOOP26: LCALL TIMELCALL KEY2LJMP LOOP2/*********中断服务程序(原始时间分秒的确定)**********/INTR0: PUSH PSWMOV TH1,#0D8HMOV TL1,#0F0HINC R7MOV TH1,#0D8HMOV TL1,#0F0HCJNE R7,#100,INTR01MOV R7,#000HINC R6CJNE R6,#60,INTR01MOV R6,#000HINC R5CJNE R5,#60,INTR01MOV R5,#000HINTR01: POP PSWRETI/*****************时间分秒显示计算***************/TIME: MOV A,R6 ;计算秒MOV B,#10DIV ABMOV SEC1,AMOV SEC0,BMOV A,R5 ;计算分MOV B,#10DIV ABMOV MIN1,AMOV MIN0,BRET/*****************按键扫描消抖及确定***************/KEY0: LCALL KS ;扫描有无按键按下KEY01: LCALL DISPLAY0 ;CJNE R1,#000H,KEY02 ; 通过(控制数码管的扫描频率,LJMP KEY05 ; 延时进而控制其扫描周期,以KEY02: MOV R1,#000H ; 消抖达到所需摸延时时间)LCALL KS ;CJNE R1,#000H,KEY03 ;确定有按键按下?LJMP KEY05 ;KEY03: LCALL KS0 ;调用计算物理位置子函数KEY04: LCALL TIME ;LCALL DISPLAY0 ;LCALL KS ;检查按键是否松开CJNE R1,#000H,KEY04 ;KEY05: RET ;KEY1: LCALL KS ;同上KEY11: LCALL DISPLAY1 ;CJNE R1,#000H,KEY12 ;LJMP KEY15 ;KEY12: MOV R1,#000HLCALL KSCJNE R1,#000H,KEY13LJMP KEY15KEY13: LCALL KS0KEY14: LCALL TIMELCALL DISPLAY1LCALL KSCJNE R1,#000H,KEY14KEY15: RETKEY2: LCALL KS ;同上KEY21: LCALL DISPLAY2 ;CJNE R1,#000H,KEY22 ;LJMP KEY25 ;KEY22: MOV R1,#000HLCALL KSCJNE R1,#000H,KEY23LJMP KEY25KEY23: LCALL KS0KEY24: LCALL TIMELCALL DISPLAY2LCALL KSCJNE R1,#000H,KEY24KEY25: RET/*****检查有无按健闭合*****/KS: CLR P3.6CLR P3.7SETB P0.5SETB P0.6SETB P0.7MOV A,P0ORL A,#01FHCPL AMOV R1,ARET/****确定按键的物理位置****/KS0: MOV R4,#000H ;行号扫描初值SETB P3.7CLR P3.6 ;行扫描初值KS1: MOV A,P0ORL A,#01FHMOV R3,A ;保存列1CJNE A,#0FFH,KS2MOV R4,#003H ;行首值SETB P3.6CLR P3.7MOV A,P0ORL A,#01FHMOV R3,A ;保存列2CJNE A,#0FFH,KS2LJMP KS4KS2: MOV A,R3 ;计算按键的物理位置RRC ASWAP AKS3: RRC AJNC KS4INC R4SJMP KS3KS4: RET/******************数码管显示*****************/DP1: MOV A,MIN1 ;前两位数码管显示MOV DPTR,#TAB0MOVC A,@A+DPTRCLR P0.0MOV P1,ALCALL DL0MOV P1,#000HSETB P0.0MOV A,MIN0MOV DPTR,#TAB1MOVC A,@A+DPTRCLR P0.1MOV P1,ALCALL DL0MOV P1,#000HSETB P0.1RETDP2: MOV A,SEC1 ;后两位数码管显示MOV DPTR,#TAB0MOVC A,@A+DPTRCLR P0.2MOV P1,ALCALL DL0MOV P1,#000HSETB P0.2MOV A,SEC0MOV DPTR,#TAB0MOVC A,@A+DPTRCLR P0.3MOV P1,ALCALL DL0MOV P1,#000HSETB P0.3RET/******************显示方式函数*****************/DISPLAY0: LCALL DP1 ;实时时钟模式的显示函数LCALL DP2RETDISPLAY1: LCALL DP1 ;调秒模式的显示函数CJNE R7,#001H,DISPLAY11MOV R2,#000HDISPLAY11:CJNE R7,#032H,DISPLAY12MOV R2,#001HDISPLAY12:CJNE R2,#000H,DISPLAY13LCALL DP2LJMP DISPLAY14DISPLAY13:LCALL DL0LCALL DL0DISPLAY14:RETDISPLAY2: LCALL DP2 ;调分模式的显示函数CJNE R7,#001H,DISPLAY21MOV R2,#000HDISPLAY21:CJNE R7,#032H,DISPLAY22MOV R2,#001HDISPLAY22:CJNE R2,#000H,DISPLAY23LCALL DP1LJMP DISPLAY24DISPLAY23:LCALL DL0LCALL DL0DISPLAY24:RET/********************延时********************//*说明:延时所用的三条令,stc10f08xe中与常用的51单片机中的指令执行时间不同*/ DL0: MOV DELAY_1,#16 ;延时时间:[2+(2+250*4+4)×16+4] /11.0592DL01: MOV DELAY_2,#250 ; =16102/11.0592DJNZ DELAY_2,$ ; =1.456msDJNZ DELAY_1,DL01 ;RET ; ;TAB0: DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,067H ;无小数点的LED字模表TAB1: DB 0BFH,086H,0DBH,0CFH,0E6H,0EDH,0FDH,087H,0FFH,0E7H ;有小数点的LED字模表END五、实验过程中遇到的问题及解决方法1、怎么让选中的数码管闪烁?通过记秒的参数,设置前半秒扫描相关数码管,后半秒不扫描。

51单片机ds1302实时时钟程序

51单片机ds1302实时时钟程序

51单⽚机ds1302实时时钟程序#ifndef __DS1302_H_#define __DS1302_H_//---包含头⽂件---//#include#include//---重定义关键词---//#ifndefuchar#define uchar unsigned char#endif#ifndefuint#define uint unsigned int#endif//---定义ds1302使⽤的IO⼝---//sbit DSIO=P3^4;sbit RST=P3^5;sbit SCLK=P3^6;//---定义全局函数---//void Ds1302Write(ucharaddr, uchardat); uchar Ds1302Read(ucharaddr);void Ds1302Init();void Ds1302ReadTime();//---加⼊全局变量--//extern uchar TIME[7]; //加⼊全局变量#endif #include"ds1302.h"//---DS1302写⼊和读取时分秒的地址命令---////---秒分时⽇⽉周年最低位读写位;-------//uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302时钟初始化2013年1⽉1⽇星期⼆12点00分00秒。

---////---存储顺序是秒分时⽇⽉周年,存储格式是⽤BCD码---//uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};/************************************************************************ * 函数名: Ds1302Write* 函数功能: 向DS1302命令(地址+数据)* 输⼊: addr,dat* 输出: ⽆************************************************************************* void Ds1302Write(ucharaddr, uchardat){uchar n;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。

基于STC89C52单片机时钟的设计与实现

基于STC89C52单片机时钟的设计与实现

基于STC89C52单片机时钟的设计与实现1. 本文概述本文主要介绍了基于STC89C52单片机和DS1302时钟芯片的电子时钟设计与实现。

该电子时钟系统具有年月日等基本时间显示功能,并集成了秒表计时处理、闹钟定时、蜂鸣器和温度显示等附加功能。

系统采用LCD1602作为液晶显示器件,通过单片机对时钟和温度等数据进行处理后传输至LCD进行显示。

用户可以通过按键对时间进行调节,同时,单片机还通过扩展外围接口实现了温度采集等功能。

本文的目标是提供一个功能丰富、易于操作的电子时钟系统,为学习和应用单片机技术提供一个实用的案例。

2. 系统设计要求在设计基于STC89C52单片机的时钟系统时,我们需要考虑以下几个关键的设计要求:时钟系统必须具备基本的时间显示功能,能够以小时、分钟和秒为单位准确显示当前时间。

系统还应支持设置闹钟功能,允许用户设定特定的时间点进行提醒。

系统需要保证长时间稳定运行,具备良好的抗干扰能力,确保在各种环境下都能准确计时。

还应具备一定的容错能力,即使在操作失误或外部干扰的情况下,也能保证系统的正常运行。

用户界面应简洁直观,便于用户快速理解和操作。

时钟的显示部分应清晰可见,即使在光线较暗的环境下也能保持良好的可视性。

同时,设置和调整时间的操作应简单易懂,方便用户进行日常使用。

在设计时钟系统时,应考虑到未来可能的功能扩展,如温度显示、日期显示等。

系统的设计应具有一定的灵活性和扩展性,以便在未来可以轻松添加新的功能模块。

鉴于时钟系统可能需要长时间运行,能耗是一个重要的考虑因素。

设计时应选择低功耗的元件,并优化电源管理策略,以延长电池寿命或减少能源消耗。

在满足上述所有要求的同时,还需要控制成本,确保产品的市场竞争力。

这可能涉及到对单片机的编程优化、选择性价比高的外围元件等措施。

通过满足上述设计要求,我们可以确保开发出一个功能完善、稳定可靠、用户友好、易于扩展、节能环保且成本效益高的STC89C52单片机时钟系统。

基于单片机的时钟设计

基于单片机的时钟设计

基于单片机的时钟设计时钟是现代社会不可或缺的电子产品,它不仅能方便地显示时间,还可以提供闹铃、定时器等功能。

基于单片机的时钟设计通过集成电路的形式实现各种功能,具有节省空间、功耗低和设计灵活的优势。

一、设计需求设计一个基于单片机的时钟,具有以下功能:1.实时时间显示:通过液晶显示屏显示当前的小时、分钟和秒钟,并能够自动更新时间。

2.闹铃功能:设定闹铃时间后,在设定时间时会自动响铃。

3.定时器功能:设定一个时间段后,经过设定时间后会弹出提醒。

二、硬件设计1.单片机选择:选择一款适合时钟设计的单片机,具有较高的计算能力和丰富的接口资源。

2.时钟模块:通过连接实时时钟模块,获取准确的时间数据。

实时时钟模块通常采用DS1302或DS3231芯片。

3.液晶显示屏:通过连接液晶显示屏模块,将时间数据显示出来。

液晶显示屏通常采用16x2字符型液晶显示屏。

4.按键开关:通过连接按键开关模块,实现对时钟功能的设置和切换。

5.喇叭:通过连接喇叭模块,实现闹铃功能。

6.其他辅助电路:例如稳压电路、外部晶振等。

三、软件设计1.时钟显示:通过读取实时时钟模块中的时间数据,将其显示在液晶显示屏上。

可以设置定时器中断来实现每秒钟更新一次时间。

2.闹铃功能:用户可以通过按键设置闹铃时间,当实时时钟模块的时间与设定的闹铃时间相同时,触发闹铃,通过喇叭发出声音。

3.定时器功能:用户可以通过按键设置定时时间,当设定的时间到达时,弹出提醒提示。

4.按键处理:通过检测按键的状态进行相应的操作,如切换功能、设置闹铃时间、定时时间等。

5.其他功能:根据实际需求可以添加更多的功能,如自动亮度调节、温度显示等。

四、总结基于单片机的时钟设计具有灵活、可扩展性强的特点,可以根据用户需求自定义各种功能。

通过合理的硬件设计和软件编程,可以实现实时时间显示、闹铃功能和定时器功能等。

这种设计不仅能满足人们对时钟的基本需求,还能提供更多的便利功能。

总之,基于单片机的时钟设计是一种相对成熟和常见的设计,通过合理的硬件布局和软件编程,可以实现各种功能,满足人们对时钟的需求。

实时时钟(RTC)X1203及其在单片机中的应用(二)

实时时钟(RTC)X1203及其在单片机中的应用(二)

修 改 时 钟 值 ; 同 时 ,X1 0 2 3还 提 供 了 两 组 报 警 寄 存 器 ,通 过 设 置 报 警 寄 存 器 区 的值 以及 报 警 控 制 寄 存 器 的 相 应 位 , 可 以使 R C产 生 1分 钟 ( 确 到 秒 ) 至 T 精 1年 的 周 期 性 报 警 , 即 当报 警 寄 存 器 区 中 设 置 的 值 与
时 钟 值 ,并 产 生 报 警 信 号 ,作 为 C U 的 外 部 中 断 源 。 P
Xl 0 与 8 C l之 间 的 接 线 图 如 图 3 23 95 。
减 轻 C U 负 担 ,避 免 繁 重 的 查 询 工 作 ,提 高 C U 工 P P
作 效 率 ,且 可 靠 性 高 。 这 种 方 式 下 ,若 C U 在 时 ,R C将 在 其 I Q 引 脚 上 产 T R
生 一 个 脉 冲 信 号 , 该 信 号 为 低 有 效 ,可 直 接 与 C U P 的 外 部 中 断 引 脚 连 接 ,作 为 C U 的 外 部 中 断 源 , 使 P 用非常方便 。 X1 0 2 3的两 个 报 警 寄 存 器 区 可 同时 工 作 ,并 产 生 两种报警 方式 。一种 是周期 性地 产生 一个脉 冲信 号 , 作 为 C U 的外 部 中 断 源 ,激 活 外 部 中 断 。 这 种 方 式 P 常 用 于 C U 要 周 期 性 地 处 理 某 项 任 务 的 情 况 , 可 以 P
三 、 应 用 实 例 图 3 Xl0 2 3应 用 接 线 图 Xl 0 的 S L 和 S A 引 脚 分 别 与 A 8 C l的 23 C D T95
P1 . 0和 P . 11连 接 ,I RQ 引 脚 引 向 C U 的 I T P N 0脚 ,

实时时钟(RTC)X1203及其在单片机中的应用(一)

实时时钟(RTC)X1203及其在单片机中的应用(一)
采 集 终 端 中的 应 用 实例 。
【 关键词】实 时 时 钟
通信协议
单 片机
实 时 时 钟 ( elTmeC o k C n e lr 芯 片 R a i lc / Me d rA am) X1 0 2 3是 由 X c r 司推 出 的 X1 XX 系 列 芯 片 之 一 。 io 公 2 用 于单 片 机 的 产 品 ,具 有 典 型 的 I 2 C互 操 作 的 2线 接 口和 串行 芯 片 的体 积 小 、功 耗 低 等 优 点 。 通 过 一 组 寄 存 器 进 行 控 制 和 读 出 ,使 用 低 成 本 的 3 .6 k z晶体 27 8 H 输 入 , 以 秒 、分 、 时 、 日 、 星期 、 年 为 单 位 跟 踪 时
在 单 相 【 的 应 用 ( l 】 一)
■ 巫 世 晶 李 海 涛
【 摘 要 】讨 论 串行 接 口 实 时 时钟 芯 片 X1 0 2 3的基 本 功 能 , 特 别 对 其 通 信 协 议 中起 始 和 结 束 以及
通 信 “ 答 ” 等 几 个 重 要 方 面 作 了详 尽 讨 论 ,并 以 A 8 C 1单 片机 为 例 ,给 出 了 X1 0 应 T95 2 3在 数 据
图 1 X1 0 2 3的封 装 与 引 脚
别 与 C U I0 口的 P . P / 1 0和 P . 11引 脚 相 连 ,传 送 时 钟
脉 冲 和 数 据 信 息 ; 中 断 信 号 引 脚 I Q 可 在 两 种 设 定 R
的 条 件 下 产 生 低 有 效 的 脉 冲 信 号 ; V a k接 备 用 电 bc 源 ,X1 0 2 3内部 具 有 自动 电 源 切 换 电路 , 当主 电源 供 电不足或电压过低时使用备用 电源。

单片机时钟与定时器模块原理与应用分析

单片机时钟与定时器模块原理与应用分析

单片机时钟与定时器模块原理与应用分析一、引言在现代电子设备中,时钟和定时器模块是非常常见且重要的组成部分。

单片机作为一种集成电路芯片,广泛应用于各种电子设备中,其时钟和定时器模块的原理和应用对于系统的正常运行起着至关重要的作用。

本文将详细介绍单片机时钟和定时器模块的原理,并分析其在实际应用中的具体应用场景。

二、单片机时钟模块原理单片机的时钟模块是决定整个系统运行的基准,它提供了计时和计数功能。

时钟模块通常由晶振、振荡电路、预分频器和计数器组成。

晶振是单片机的心脏,通过晶体振荡产生精确的振荡信号,作为主频源。

振荡电路则将晶振信号采样、放大和滤波,以产生稳定的振荡信号。

预分频器用于将振荡信号分频,从而获得较低频率的时钟信号。

计数器将分频后的信号进行计数,以得到系统实际的工作时钟。

基于对时钟信号的合理运算和控制,单片机可以完成各种任务和功能。

三、单片机定时器模块原理定时器模块是单片机中的一种重要外设模块,用于精确计时和产生各种时间延时。

定时器通常由一个或多个计数器、控制电路和相关寄存器组成。

计数器接收来自时钟模块的时钟信号,并根据设定的定时器参数进行计数。

当计数值满足设定值时,定时器会发出中断请求或触发外部事件。

控制电路根据寄存器中的设置,控制计数器的计数方向、触发方式及相关操作。

通过灵活的配置和使用定时器模块,可以实现各种时间控制和精确的定时功能。

四、单片机时钟与定时器模块应用分析1. 实时时钟应用实时时钟是指通过单片机内部或外部模块实现的,可以提供当前日期和时间的功能。

实时时钟广泛应用于各种需要时间戳和时间记录的场景,如电子设备的日志记录、时间定时器、时钟显示等。

通过单片机的时钟模块和定时器模块,可以实现实时时钟的精确计时和日期功能,提供更加便捷和准确的时间处理。

2. 节拍控制应用节拍控制是通过定时器模块实现的,常用于音乐播放、灯光控制、电机驱动等场景。

通过设置定时器的计数值和触发方式,可以精确控制节拍的速度和频率。

基于DS1302实时时钟系统的设计论文

基于DS1302实时时钟系统的设计论文

学士学位论文(设计)Bachelor’s Thesis论文题目基于DS1302实时时钟系统的设计目录1.绪论 (1)2.方案对比与选择分析介绍 (2)2.1单片机控制器的选择与对比 (2)2.2实时时钟芯片的选择与对比 (3)2.3显示器件的选择与对比 (3)3.系统设计概述 (4)3.1设计内容及要求 (4)3.2系统框架及说明 (4)4.硬件电路设计分析 (5)4.1STC89C52单片机简介 (5)4.2STC89C52单片机内部结构 (6)4.3MCU控制电路设计分析 (7)4.4数码管显示设计分析 (8)4.5DS1302时钟电路设计分析 (10)4.6蜂鸣器报警电路设计分析 (15)4.7电源部分设计分析 (15)5.系统软件设计分析 (16)5.1DS1302模块程序设计 (16)5.2定时器模块程序设计 (16)5.3按键模块程序设计 (17)5.4数码管显示模块程序设计 (19)5.5蜂鸣器报警模块程序设计 (20)5.6主程序设计 (20)6.总结 (21)7.参考文献 (22)8.致谢 (1)附录...................................................... 错误!未定义书签。

附录1作品(设计)原理图................................ 错误!未定义书签。

附录2作品(设计)实物图................................ 错误!未定义书签。

基于DS1302实时时钟系统的设计摘要: 本论文(设计)采用STC89C52单片机和DS1302实时时钟芯片为主要器件设计的实时时钟系统。

能够准确的显示实时时间、日期、星期。

通过8位低功耗数码管将时间信息显示出来,数码管由单片机直接驱动,无需其他驱动芯片,通过按键切换显示时间、日期、星期、闹钟等信息。

系统设计有闹钟报警功能,当实时时间到达闹钟设计时间时,闹钟就会蜂鸣器报警,报警时间可通过按键自行设定。

实时时钟(RTC)X1203及其在单片机中的应用

实时时钟(RTC)X1203及其在单片机中的应用
“ 答 应
钟脉 冲和数据信息 ;中断信号引脚 I Q可 以在两 种设定 的 R
条 件 下 产 生 低 有 救 的脉 冲 信 号 ; bc V ak接 备 用 电 源 , 2 3 X10
内部 具 有 自动 电 源 切 换 电 路 ,当 主 电 褫 供 电 不 足 或 电压 过
圈 2 起 始 和 结 束 条 件及 有 教的 数 据 改 变
低 时 使 用备 用 电源 。
当起 始 条 件 完 成后 , 时钟 线必 须 处 于 低 电平 , 系 统 在 即
时 钟 为 低 电平 期 间完 成 对 数 据 线 状 态 的采 集 .而 在 脉 冲下 跳 变 时 将数 据 线 状 态 送 至 S A引 脚 。 当要 向 X 2 3发 进数 D I0
用 于 指示 起 始 条 件 和停 止 条 件 (C S L为 高 电 平 时 D s A线 上 的下 跳 变 被认 为是 起 始 条 件 , 跳 变 被 认 为是 结 束 条 件 ) 上
( ) 何 一 十 字 节发 送 完 毕 后 , D 2任 S A线 瞄处 于 高 电 平
单 片机 产 品 具 有 典 型 的 I 互 操 作 的 2线 接 口 , 有 串 行 2 C 并 芯片 体 积 小 、 耗低 等优 点 。通 过一 组 寄 存 器进 行控 制和 读 功 出 , 用 低 成 本 的 3 . 8 H 晶体 输 ^ 使 27 k z 6 以秒 、 、 分 时 日 、 星 期 为 单 位 跟 踪 时 间 , 具 有 自动 调 整 功 能 同 时 , 2 3 年 并 X10 具 有 双 报 警 功能 , 中 一 个 可 以 提 供 长 时 间 的 脉 冲 中断 , 其 实 现 简 单 , 对 于实 用 设 计 非 常 方 便 。xl0 2 3可 以 过 到 最 高 40H 0 k z的数 据 传 送速 率 , 以满 足 通 常 需要 [ 足 『 。 X1∞ 有 8引 脚 S I 2 O C封 装 和 T s P封 装 两 种 封 装 形 s0 式 . 引 脚 排列 如 图 所示 图 中 , 钟 引脚 S L和 数据 引 脚 其 时 C S A 分 别 与 C U IO 口的 P . D P / 1 0和 P . 引 脚 相 连 ,传 送 时 I1

基于μPD78F0485单片机实验板的实时时钟程序设计与实现讲解

基于μPD78F0485单片机实验板的实时时钟程序设计与实现讲解

基于μPD78F0485单片机实验板的实时时钟程序设计与实现讲解实时时钟(Real-Time Clock,简称RTC)是一种能够实时记录时间的设备。

在嵌入式系统中,RTC广泛应用于各种需要时间标记的场景,比如日历、定时任务等等。

本文将基于μPD78F0485单片机实验板,讲解实时时钟程序的设计与实现。

一、硬件连接首先,我们需要正确连接硬件。

μPD78F0485单片机实验板上有一个RTC芯片DS1302,它能够实现实时时钟功能。

将μPD78F0485与DS1302芯片通过引脚连接起来即可。

具体的连接方式可以参照单片机实验板的电路图。

二、软件设计1.寄存器配置首先,我们需要配置单片机的相关寄存器,使其能够与RTC芯片进行通信。

具体操作如下:(1)配置I/O口:将单片机的SDA引脚和SCL引脚设置为输出模式。

(2)配置RTC芯片寄存器:使用I2C总线协议与RTC芯片通信,设置RTC芯片的相关寄存器,比如设置时间、日期、闹钟等。

2.时钟读取与显示接下来,我们需要编写代码读取RTC芯片的时钟数据,并将其显示出来。

具体操作如下:(1)使用I2C总线协议读取RTC芯片的时钟寄存器,包括秒、分、时、日、月、周、年等。

(2)将读取到的时钟数据存储在相应的变量中。

(3)将时钟数据通过数码管、LCD等显示设备进行显示。

3.时钟设置除了读取时钟数据外,我们还需要能够设置RTC芯片的时钟。

具体操作如下:(1)通过按键或者其他输入方式,获取用户设定的时间、日期等数据。

(2)使用I2C总线协议将用户设定的时钟数据写入到RTC芯片的相应寄存器中。

(3)将设定的时钟数据通过数码管、LCD等显示设备进行显示。

4.定时中断为了实时更新时钟数据,我们可以使用定时中断的方式。

具体操作如下:(1)配置定时器:设置定时器的工作模式、计数值等参数。

(2)启动定时器:使定时器开始工作。

(3)在定时中断中,读取RTC芯片的时钟数据,并更新显示。

5.闹钟功能RTC芯片通常也会具备闹钟功能,我们可以通过设置RTC芯片的闹钟寄存器,实现闹钟功能。

单片机时钟的作用

单片机时钟的作用

单片机时钟的作用单片机时钟是单片机系统中的一个重要组成部分,它扮演着计时和计划任务执行的关键角色。

本文将探讨单片机时钟的作用以及在各种应用中的实际应用。

一、时钟的基本原理单片机时钟是由晶体振荡器产生的,晶体振荡器将电能转换为机械振动,从而产生稳定的时钟脉冲信号。

时钟脉冲信号的频率决定了单片机内部操作的速度。

通过计数和分频,单片机可以利用时钟信号来执行各种任务。

二、实时计时功能单片机时钟的主要作用之一是提供实时计时功能。

通过记录时钟的脉冲数量,单片机可以准确地计算经过的时间。

这在很多应用中都是至关重要的,比如电子表、计时器等。

实时计时功能还可以用于控制时间相关的任务,比如定时开关、定时提醒等。

三、任务调度和定时器功能单片机时钟还可以用于任务调度和定时器功能。

任务调度是指根据优先级和时间要求来安排任务的执行顺序。

单片机通过时钟脉冲的计数和分频,可以精确地控制各个任务的执行时间和顺序。

定时器功能则可以用于实现定时中断,以便及时响应外部事件或周期性执行一些任务。

四、数据采样和同步功能在很多应用中,单片机需要与外部设备进行数据采集和交互。

时钟信号的作用在于同步单片机和外部设备的数据传输。

通过时钟信号的精确控制,可以确保数据的准确采样和传输,避免数据误差和丢失。

五、电源管理功能单片机时钟还可以用于实现电源管理功能。

通过将单片机置于低功耗模式,可以大大降低功耗,延长电池寿命。

时钟信号的控制可以实现周期性唤醒或睡眠状态下的定时工作,以适应不同的电源管理需求。

六、通信协议和时序控制在很多通信协议和接口中,时钟信号的作用至关重要。

时钟信号可以用于同步和控制数据传输的时序,确保数据的准确传输。

比如在串行通信中,时钟信号用于控制数据的采样和发送,保证数据的正确接收和发送。

七、总结单片机时钟在各种应用中扮演着重要的角色,它提供了实时计时、任务调度、数据采样、电源管理和通信协议等功能。

通过精确控制时钟信号,单片机可以实现高效、可靠的操作,并满足各种应用的要求。

PIC24系列单片机原理与开发 第12章 实时时钟日历

PIC24系列单片机原理与开发 第12章 实时时钟日历
(4) 报警寄存器的 MTHDY(月日)、WKDYHR(星期时)和 MINSEC(分秒)单元无地 址映射,只能通过它们的接口 ALRMVAL 寄存器来访问,并且用位域 ALRMPTR <1:0> 作为访问相应单元的指针。例如,设 ALRMPTR <1:0>=00,读 ALRMVAL 寄存器是 读的 ALMINSEC(报警分秒寄存器)单元。
PIC24 系列单片机原理与开发 by Zeng
2012-6-13
第 12 章 实时时钟日历
12.1 概述
PIC24F 系列芯片内集成有一个实时时钟日历(Real-Time Clock and Calendar, RTCC) 模块外设,它能够向 CPU 提供秒、分、时、日、月、年和星期等实时时间信息。这为那些需 要实时时钟的的嵌入式应用提供了方便 ,可省去外接 DS1310、PCF8563 等专用日历时钟芯片 的硬件开销。PIC24F 系列芯片的 RTCC 模块具有如下特性:
12.2 RTCC 模块的寄存器
RTCC 模块的寄存器分为三类:控制寄存器(RCFGCAL,PADCFG1,ALCFGRPT);实时时 间日历的值寄存器字 RTCVAL,通过 RTCVAL 访问模块的 YEAR(年)、MTHDY(月日)、WKDYHR (星期时)和 MINSEC(分秒)单元;报警值寄存器 ALRMVAL,通过 ALRMVAL 访问模块的报 警设定单元 ALMTHDY(月日)、ALWDHR(日时)和 ALMINSEC(分秒)。
3. 引脚配置控制寄存器 PADCFG1
表 12-3 所列为引脚配置寄存器 PADCFG1 各位的功能定义。
表12-3:引脚配置控制寄存器PADCFG1各位功能定义
U-0 未用
bit 15 bit 7

rtc实时时钟和单片机时钟的区别

rtc实时时钟和单片机时钟的区别

rtc实时时钟和单片机时钟的区别来源:电子发烧友rtc实时时钟和单片机时钟的区别实时时钟是指给日期及时间计数器累加的时钟,通常是32768Hz,系统时钟是指单片机内部的主时钟,给各个模块提供工作时钟的基础,CPU时钟是指经过CPU的PLL后将系统时钟改变为CPU工作的时钟。

在一般的低速单片机系统中,系统时钟和CPU时钟基本相等,在高速单片机系统中,CPU时钟比系统时钟高得多。

而实时时钟只有在需要日期时间的系统中才有,并且是最低的,有的系统也将它作为低功耗时CPU时钟。

实钟(RTC)由晶体控制精度,向主系统提供BCD码表示间期器件。

主系统与RTC间通信通并行口通串行口。

并行器件速度快需较底板空间较昂贵。

串行器件体积较且价格相便宜主频CPU钟频率。

简单说CPU工作频率般说钟周期完指令数固定所主频越高,CPU速度越快由于各种CPU内部结构尽相同所并能完全用主频概括CPU性能,至于外频系统总线工作频率;倍频则指CPU外频与主频相差倍数用公式表示:主频=外频×倍频系统钟现电脑显示间通更新调整通BIOSS设置。

一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。

在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。

rtc实时时钟如DS1302是一个单独的时钟芯片,和单片机连接后,可以设置时间和闹铃时间,并读取时间进行显示,普通单片机要做时钟需要占用其较多资源,并且断电后没法保持。

一些高档单片机如STM32F103(无日历功能,STM32F407有日历功能)内部也有实时时钟,可以和单片机分开供电,并且有单独的振荡电路,断电后仍能运行,就无需再外接时钟芯片了。

单片机中时钟的理解时钟是STM32单片机的脉搏,是单片机的驱动源,使用任何一个外设都必须打开相应的时钟。

这样的好处是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。

单片机实时时钟实训报告

单片机实时时钟实训报告

一、引言随着单片机技术的不断发展,其在各个领域的应用越来越广泛。

实时时钟(Real-Time Clock,RTC)作为一种重要的功能模块,被广泛应用于嵌入式系统中,用于实现时间的记录、显示和控制等功能。

本实训报告以单片机为平台,设计并实现了一个实时时钟系统,旨在巩固和深化单片机相关知识,提高动手实践能力。

二、实训目的1. 理解实时时钟的工作原理和基本概念;2. 掌握单片机与实时时钟芯片的接口连接方法;3. 学会使用实时时钟芯片实现时间记录、显示和控制功能;4. 提高单片机编程能力和嵌入式系统设计能力。

三、实训内容1. 实时时钟芯片介绍本实训采用DS1302实时时钟芯片,该芯片具有以下特点:(1)低功耗设计,适用于电池供电的应用场景;(2)支持闰年、星期和夏令时等功能;(3)具有32.768kHz晶振振荡器,提供精确的时间基准;(4)具有64字节RAM,可用于存储数据。

2. 单片机与DS1302的接口连接本实训选用AT89C51单片机作为控制核心,与DS1302的接口连接如下:(1)VCC:连接单片机的5V电源;(2)GND:连接单片机的地;(3)RST:DS1302复位引脚,连接单片机的P1.0引脚;(4)CE:DS1302片选引脚,连接单片机的P1.1引脚;(5)IO:DS1302数据引脚,连接单片机的P1.2引脚;(6)SQW/OUT:DS1302闹钟输出引脚,连接单片机的P1.3引脚。

3. 实时时钟系统设计(1)时间记录通过DS1302芯片的RAM存储功能,实现时间的记录。

具体操作如下:① 初始化DS1302芯片,设置时间基准;② 设置闰年、星期和夏令时等信息;③ 读取当前时间,并存入单片机的内部RAM。

(2)时间显示使用单片机的并行I/O口,将时间数据输出到LED数码管或LCD液晶显示屏,实现时间显示。

具体操作如下:① 设计显示模块的硬件电路;② 编写显示模块的驱动程序,实现时间数据的读取和显示;③ 通过按键操作,实现时间的切换和调整。

51系列单片机的系统时钟如何产生?

51系列单片机的系统时钟如何产生?

51 系列单片机的系统时钟如何产生?
单片机的控制器的定时功能是由时钟和定时电路完成的,它是产生CPU 的操作时序。

XTAL1 是芯片内部振荡电路输入端,XTAL2 为芯片内部振荡电路输出端具体的产生有以下两种方式:
一:内部方式
则是利用芯片内反相器和电阻组成的振荡电路,,在XTAL1 和XTAL2 引脚上接定时元件,如压电晶体和电容组成的并联谐振电路,则内部可产生与外加晶体同频率的振荡时钟。

一般晶体可以在1.2MHZ 到12MHZ 之间任意选择,电容一般选择在5pf 到30pf,对时钟频率有微调作用。

二:外部时钟方式
如果采用外部时钟方式,此时要把XTAL1 接到外部始终提供电路,XTAL2 接地。

这种情况一般是当整个单片机系统已经有时钟源或则在多机系统中取得时钟上的同步。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验十六实时时钟(PCF8563)实验一、实验目的1、进一步熟悉I2C总线的编程方法;2、掌握时钟芯片的使用;3、掌握I2C总线多芯片操作。

二、实验内容设计要求:1、液晶块上显示:世界杯开幕时间为:2010年06月11日现在距离世界杯还剩:xx天xx小时xx分钟xx秒2、初始时间可以设定:(三个按键:一个是切换键,一个是增加键,一个是减少键,来更改红色表示的几个数字)3、每隔一分钟,把结果写入24C02保存,下次断电开机,调用最近一次结果值重新进行倒计时关于时间标定的两种方法(自由选择):1、采用单片机定时器2、采用PCF8563时钟芯片三、程序流程图:本程序主要由3个外部中断子程序,1个定时中断子程序,主程序,以及一系列完成液晶显示所需要的子程序组成,那些小的子程序较简单,下面只给出主程序,外部中断,定时中断的流程图。

主程序:只要没中断就这么无限循环外部中断1子程序void _ISR _INT1Interrupt( ) 实现模式切换外部中断2子程序void _ISR _INT2Interrupt( ) 实现对应位加一外部中断2子程序void _ISR _INT2Interrupt( ) 实现对应位减一定时器2中断服务程序void _ISR _T2Interrupt( )四,源程序:// 图形点阵液晶(12864M)实验///////////////////////////////////////////////////////////////////////////#include <p24FJ64GA006.h>unsigned char RESERED[100]; //预留区,供ICD2调试使用// 串行模式12864M液晶只需要如下3根控制线#define LCD_CS PORTDbits.RD0#define LCD_SCLK PORTDbits.RD1#define LCD_SID PORTDbits.RD2unsigned char LINE1[]={"世界杯开幕时间为"};unsigned char LINE2[]={"2010年06月11日"};unsigned char LINE3[]={"距离世界杯还剩"};unsigned char LINE4[]={"30天00时00分00秒"};unsigned int control;//控制变量,0表示调整年,1表示调整月,2表示调整日int year,month,day;int dday,dhour,dmin,dsecond;unsigned int count,countfen;#define WR_24CXX 0xA8 // 24Cxx写模式#define RD_24CXX 0xA9 // 24Cxx读模式// 函数声明void DelayMS(unsigned int ); //延时程序(毫秒级)void Write_Byte(unsigned char I2C_Addr,unsigned char OutData); //指定地址写1个字节void I2CWRByte(unsigned char single_byte); //发送一个字节unsigned char Read_Byte(unsigned char I2C_Addr); //指定地址读1个字节unsigned char I2CRDByte(void); //接收一个字节void WaitIdel( void ); //等待I2C模块空闲void I2C1Start( void ); //启动void I2C1RStart( void ); //重复启动void I2C1Stop( void ); //停止void I2C1RCEN( void ); //接收使能void I2C1ACK( void ); //发送应答void I2C1NACK( void ); //发送非应答//------------------------------------------------------------------------------void WaitIdel(void){while(I2C1CON & 0x001F); //等待I2C模块空闲while(I2C1STATbits.TRSTAT);}//------------------------------------------------------------------------------ void I2C1Start( void ){WaitIdel();I2C1CONbits.SEN=1; //启动}//------------------------------------------------------------------------------ void I2C1RStart( void ){WaitIdel();I2C1CONbits.RSEN=1; //重复启动}//------------------------------------------------------------------------------ void I2C1Stop( void ){WaitIdel();I2C1CONbits.PEN=1; //停止}//------------------------------------------------------------------------------ void I2C1RCEN( void ){WaitIdel();I2C1CONbits.RCEN=1; //接收使能}//------------------------------------------------------------------------------ void I2C1ACK( void ){WaitIdel();I2C1CONbits.ACKDT=0;I2C1CONbits.ACKEN=1; //发送应答}//------------------------------------------------------------------------------ void I2C1NACK( void ){WaitIdel();I2C1CONbits.ACKDT=1;I2C1CONbits.ACKEN=1; //发送非应答}//------------------------------------------------------------------------------ //函数功能:I2C发送1个字节//入口参数:发送的数据(1个字节)//------------------------------------------------------------------------------ void I2CWRByte(unsigned char single_byte){WaitIdel();while(I2C1STATbits.TBF); //等待I2C1TRN空I2C1TRN=single_byte;}//-----------------------------------------------// I2C写一个字节到指定地址//入口参数:I2C_Addr,OutData//-----------------------------------------------void Write_Byte(unsigned char I2C_Addr,unsigned char OutData) {I2C1Start(); // I2C总线启动I2CWRByte(WR_24CXX); // "写"模式I2CWRByte(I2C_Addr); //送地址I2CWRByte(OutData); //送数据I2C1Stop(); // I2C总线停止Delayms(1000); // 等待24C02内部编程完成}//------------------------------------------------------------------------------//函数功能:I2C接收1个字节//入口参数:无//出口参数:收到的数据//------------------------------------------------------------------------------ unsigned char I2CRDByte(void){unsigned char temp;I2C1RCEN(); //转到接收模式while(I2C1CONbits.RCEN);temp=I2C1RCV;return temp;}//-----------------------------------------------// I2C读指定地址的一个字节,调用I2CRDByte() 函数//入口参数:I2C_Addr//出口参数:temp(从I2C_Addr地址读取的内容)//-----------------------------------------------unsigned char Read_Byte(unsigned char I2C_Addr){unsigned char temp;I2C1Start(); // I2C总线:启动I2CWRByte(WR_24CXX); // "写"模式I2CWRByte(I2C_Addr); // 送出地址I2C1RStart(); // I2C总线:重启动I2CWRByte(RD_24CXX); // 切换到"读"模式temp=I2CRDByte(); // 读1个字节I2C1NACK(); // I2C总线:非应答I2C1Stop(); // I2C总线:停止return temp;}//------------------------------------------------------------------------------ //函数功能:I2C1模块初始化//------------------------------------------------------------------------------ void I2C1Init( void ){I2C1CONbits.DISSLW=1; // 禁止变化率控制I2C1BRG=249; //249I2C1CONbits.I2CEN=1; // I2C模块使能}///////////////////函数功能:延时程序(毫秒级)//入口参数:del///////////////////////////////////////////////////////////////////////////void Delayms(unsigned int del){unsigned int j;while(del--)for(j=0;j<100;j++);}/////////////////////////////////////////////////////////////////////////////函数功能:写1字节到LCD//入口参数:temp(写入的一个字节)///////////////////////////////////////////////////////////////////////////void WriteLCDByte(unsigned char temp){unsigned char i;for(i=0;i<8;i++) // 送出1个字节{LCD_SCLK=1;Delayms(1);LCD_SID=((temp)&0x80)?1:0; // 送出一位数据temp<<=1;Delayms(1);LCD_SCLK=0;Delayms(1);}}/////////////////////////////////////////////////////////////////////////////函数功能:写指令到LCD//入口参数:wrdata(写入的一个字节)///////////////////////////////////////////////////////////////////////////void WriteLCDCMD(unsigned char wrdata){unsigned char temp;LCD_CS=1;Delayms(1);temp=0xF8; //写指令WriteLCDByte(temp); // 送出第1个字节temp=wrdata&0xF0; // 取高4位WriteLCDByte(temp); // 送出第2个字节temp=(wrdata<<4)&0xF0; // 取低4位WriteLCDByte(temp); // 送出第3个字节LCD_SCLK=1; // SCLK信号线平时为高电平Delayms(1);LCD_CS=0;}/////////////////////////////////////////////////////////////////////////////函数功能:写数据到LCD//入口参数:wrdata(写入的一个字节)///////////////////////////////////////////////////////////////////////////void WriteLCDdata(unsigned char wrdata){unsigned char temp;LCD_CS=1;Delayms(1);temp=0xFA; //写数据WriteLCDByte(temp); // 送出第1个字节temp=wrdata&0xF0; // 取高4位WriteLCDByte(temp); // 送出第2个字节temp=(wrdata<<4)&0xF0; // 取低4位WriteLCDByte(temp); // 送出第3个字节LCD_SCLK=1; // SCLK信号线平时为高电平Delayms(1);LCD_CS=0;}/////////////////////////////////////////////////////////////////////////////函数功能:LCD初始化///////////////////////////////////////////////////////////////////////////void LCDInit(){WriteLCDCMD(0x30); //功能设定:选择基本指令集Delayms(1);WriteLCDCMD(0x0F); //显示状态控制:整体显示,显示游标,游标反白显示Delayms(1);WriteLCDCMD(0x01); //清屏(同时地址归位)Delayms(10);}/////////////////////////////////////////////////////////////////////////// //外部中断1服务程序/////////////////////////////////////////////////////////////////////////// void _ISR _INT1Interrupt( ){control++;if(control>2)control=0;Delayms(100);IFS1bits.INT1IF = 0; //清中断标志位}/////////////////////////////////////////////////////////////////////////// //外部中断2服务程序/////////////////////////////////////////////////////////////////////////// void _ISR _INT2Interrupt( ){switch(control){case 0:{year++;if(year>99)year=0;LINE2[3]=48+year%10;LINE2[2]=48+year/10;break;}case 1:{month++;if(month>12)month=0;LINE2[7]=48+month%10;LINE2[6]=48+month/10;break;}case 2:{day++;if(day>30)day=0;LINE2[11]=48+day%10;LINE2[10]=48+day/10;break;}}Delayms(100);IFS1bits.INT2IF = 0; //清中断标志位}/////////////////////////////////////////////////////////////////////////////外部中断3服务程序///////////////////////////////////////////////////////////////////////////void _ISR _INT3Interrupt( ){switch(control){case 0:{year--;if(year<0)year=99;LINE2[3]=48+year%10;LINE2[2]=48+year/10;break;}case 1:{month--;if(month<0)month=99;LINE2[7]=48+month%10;LINE2[6]=48+month/10;break;}case 2:{day--;if(day<0)day=99;LINE2[11]=48+day%10;LINE2[10]=48+day/10;break;}}Delayms(100);IFS3bits.INT3IF = 0; //清中断标志位}//------------------------------------------------------------------------ //定时器2中断服务程序//------------------------------------------------------------------------ void _ISR _T2Interrupt( ){int i;unsigned char I2C_Addr,OutData; IFS0bits.T2IF = 0; //清中断标志位count++;countfen++;if(count<1)return;if(count==1){dsecond--;if(dsecond<0){dsecond=59;dmin--;if(dmin<0){dmin=59;dhour--;if(dhour<0){dhour=23;dday--;if(dday<0)dday=99;}}}LINE4[1]=48+dday%10;LINE4[0]=48+dday/10;LINE4[5]=48+dhour%10;LINE4[4]=48+dhour/10;LINE4[9]=48+dmin%10;LINE4[8]=48+dmin/10;LINE4[13]=48+dsecond%10;LINE4[12]=48+dsecond/10;count=0;}if(countfen==120){for(i=0;i<8;i++){I2C_Addr=i;if(i==0)OutData=dday/10;if(i==1)OutData=dday%10;if(i==2)OutData=dhour/10;if(i==3)OutData=dhour%10;if(i==4)OutData=dmin/10;if(i==5)OutData=dmin%10;if(i==6)OutData=dsecond/10;if(i==7)OutData=dsecond%10;Write_Byte(I2C_Addr,OutData);}countfen=0;}}/////////////////////////////////////////////////////////////////////////////函数功能:I/O端口初始化///////////////////////////////////////////////////////////////////////////void IOInit(){INTCON2bits.INT1EP=1; //负边沿产生中断IFS1bits.INT1IF=0; //清零中断标志位IEC1bits.INT1IE=1; //开外部中断1(INT1)INTCON2bits.INT2EP=1; //负边沿产生中断IFS1bits.INT2IF=0; //清零中断标志位IEC1bits.INT2IE=1; //开外部中断2(INT2)INTCON2bits.INT3EP=1; //负边沿产生中断IFS3bits.INT3IF=0; //清零中断标志位IEC3bits.INT3IE=1; //开外部中断3(INT3)TRISD=0xFFF8; // 最低3位链接12864M液晶控制线TRISE=0x0000; // 输出,链接12864M液晶数据线control=0; // 默认调整年year=10;month=6;day=11;PR2=15625; //0x3D09;溢出一次:0.5sTMR2=0;T2CONbits.TCKPS=3; //预分频比:256T2CONbits.TON=1; //启动定时器IFS0bits.T2IF=0; //清零中断标志位IEC0bits.T2IE=1; //开中断count=0;countfen=0;dsecond=0;dmin=0;dhour=0;dday=30;}/////////////////////////////////////////////////////////////////////////// //函数功能:显示指定的字符串/////////////////////////////////////////////////////////////////////////// void Display(unsigned char *disdata){unsigned char i;i=0;while(disdata[i]) // 判断字符串结束{WriteLCDdata(disdata[i++]);}}/////////////////////////////////////////////////////////////////////////// //函数功能:main函数/////////////////////////////////////////////////////////////////////////// int main(void){unsigned int i,t[8];unsigned char I2C_Addr;IOInit(); // IO端口初始化LCDInit(); // 液晶初始化for(i=0;i<8;i++){I2C_Addr=i;t[i]=Read_Byte(I2C_Addr);}LINE4[0]=48+t[0];LINE4[1]=48+t[1];LINE4[4]=48+t[2];LINE4[5]=48+t[3];LINE4[8]=48+t[4];LINE4[9]=48+t[5];LINE4[12]=48+t[6];LINE4[13]=48+t[7];while(1){WriteLCDCMD(0x80); // 在第1行上显示Display(LINE1);WriteLCDCMD(0x90); // 在第2行上显示Display(LINE2);WriteLCDCMD(0x88); // 在第3行上显示Display(LINE3);WriteLCDCMD(0x98); // 在第4行上显示Display(LINE4);}}// end of main五、连线及程序调试1、实验连线LCD数据线:浮空,PORTD端口的D0/D1/D2分别接LCD的CS/SCLK/SID,外部中断管脚RD8,RD9,Rd10接按键1,按键2,按键3作为外部中断控制按键,1是模式选择,2是加,3是减。

相关文档
最新文档