可调节的数字时钟

  • 格式:doc
  • 大小:261.50 KB
  • 文档页数:8

微机原理实验报告 实验名称: 可调节的数字时钟 院 系:物理与机电工程学院 专业班级: 学 号: 学生姓名: 指导教师: 完成时间: 报告成绩:

评阅意见:

评阅教师 日期 可调实时时钟 一、 实验目的 1 进一步熟悉EasyARM2131开发板硬件结构。 2 熟悉ADS1.2集成开发环境。 3 熟练掌握RTC的寄存器的操作及其使用。 4 掌握如何用按键进行时钟调节。

二、 实验原理

特性 RTC功能结构如下图所示 三、 实验设备 1 计算机 2 EasyARM2131开发板 四、 实验流程图

实验流程图如图所示

五、 实验程序代码

本次实验通过调节KEY1 KEY2 KEY3来调节时钟,其中KEY1用来选择要调节的位置,KEY2

用来加一,KEY2用来减一,每次按键蜂鸣器都会蜂鸣一声,对应的LED灯会闪一下提醒按键有效。调时间时RTC会停走。RTC内容是通过串口发送到上位机软件上显示。

/*RTC万年历实验 ** 功能 :运行RTC进行计时,将时间值通过串口向上位机发送。 ** 上位机使用EasyARM软件,在仿真的万年历显示器显示结果。可通过按键调整时钟 ** 说明 :通讯波特率115200,8位数据位,1位停止位,无校验。*/ #include "config.h" const uint32 key1=1<<16; const uint32 key2=1<<17; const uint32 key3=1<<18; const uint32 beep=1<<7; const uint32 LEDS8 = (0xFF << 18); const uint32 LED1 = (1 << 18);

结束 引脚设置 主程序开始 是否有按键按下 UART初始化 RTC初始化 延时消抖 Y N 键盘扫描 显示时钟状态 显示设置状态 执行相应代码 开始 是否有按键按下 Y N 发送数据 发送数据 结束

模式判断 模式不等于0 模式等于0 const uint32 LED2 = (1 << 19); const uint32 LED3 = (1 << 20); uint8 moshi; typedef struct UartMode // 定义串口模式设置的数据结构 { uint8 datab; // 字长度 5/6/7/8 uint8 stopb; // 停止位 1/2 uint8 parity; // 奇偶校验 0-无校验, 1-奇校验, 2-偶校验 }UARTMODE; /* 函数名称 :DelayNS() ** 函数功能 :长软件延时 ** 入口参数 :dly 延时参数,值越大,延时越久 ** 出口参数 :无*/ void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<4200; i++); } /* 函数名称 :UART0_Init() ** 函数功能 :初始化串口:设置工作模式和波特率。 ** 入口参数 : baud 波特率 ** set 模式设置(UARTMODE数据结构) ** 出口参数 :返回1表示成功,0表示参数出错。*/ uint8 UART0_Init (uint32 baud, UARTMODE set) { uint32 bak; // 参数过滤 if ((0 == baud) || (baud > 115200)) return (0); if ((set.datab < 5) || (set.datab > 8)) return (0); if ((0 == set.stopb) || (set.stopb > 2)) return (0); if (set.parity > 4) return (0); // 设置串口波特率 U0LCR = 0x80; // DLAB=1 bak = (Fpclk >> 4) / baud; U0DLM = bak >> 8; U0DLL = bak & 0xff; // 设置串口模式 bak = set.datab - 5; if (2 == set.stopb) bak |= 0x04; if (0 != set.parity) { set.parity = set.parity - 1; bak |= 0x08; } bak |= set.parity << 4; U0LCR = bak; return (0); } /*函数名称 :SendByte() ** 函数功能 :向串口UART0发送字节数据,并等待发送完毕。 ** 入口参数 :data 要发送的数据 ** 出口参数 :无*/ void SendByte (uint8 data) { U0THR = data; while ((U0LSR & 0X20) == 0); // 等待数据发送 } /*函数名称 :PC_DispChar() ** 函数功能 :向PC机发送显示字符。 ** 入口参数 :no 显示位置 ** char 显示的字符,不能为ff ** 出口参数 :无 */ void PC_DispChar (uint8 no, uint8 chr) { SendByte(0xff); SendByte(0x81); SendByte(no); SendByte(chr); SendByte(0x00); } uint8 const SHOWTABLE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /*函数名称 :SendTimeRtc() ** 函数功能 :读取RTC的时间值,并将读出的时分秒值通过串口送到上位机显示。 ** 入口参数 :无 ** 出口参数 :无*/ void SendTimeRtc (void) { uint32 datas; uint32 times; uint32 bak; times = CTIME0; // 读取完整的时钟寄存器 datas = CTIME1; bak = (datas >> 16) & 0xfff; // 获取 年 PC_DispChar(0, SHOWTABLE[bak / 1000]); bak = bak % 1000; PC_DispChar(1, SHOWTABLE[bak / 100]); bak = bak % 100; PC_DispChar(2, SHOWTABLE[bak / 10]); PC_DispChar(3, SHOWTABLE[bak % 10]); bak = (datas >> 8) & 0x0f; // 获取 月 PC_DispChar(4, SHOWTABLE[bak / 10]); PC_DispChar(5, SHOWTABLE[bak % 10]); bak = datas & 0x1f; // 获取 日 PC_DispChar(6, SHOWTABLE[bak / 10]); PC_DispChar(7, SHOWTABLE[bak % 10]); bak = (times >> 24) & 0x07; // 获取 星期 PC_DispChar(8, SHOWTABLE[bak]); bak = (times >> 16) & 0x1f; // 获取 小时 PC_DispChar(9, SHOWTABLE[bak / 10]); PC_DispChar(10, SHOWTABLE[bak % 10]); bak = (times >> 8) & 0x3f; // 获取 分钟 PC_DispChar(11, SHOWTABLE[bak / 10]); PC_DispChar(12, SHOWTABLE[bak % 10]); bak = times & 0x3f; // 获取 秒钟 PC_DispChar(13, SHOWTABLE[bak / 10]); PC_DispChar(14, SHOWTABLE[bak % 10]); } /* 函数名称 :SendTimeRtc1() ** 函数功能 :发送设置RTC时的时间值到上位机显示。 ** 入口参数 :无 ** 出口参数 :无*/ void SendTimeRtc1 (void) { PC_DispChar(0, SHOWTABLE[YEAR / 1000]);//显示年 PC_DispChar(1, SHOWTABLE[(YEAR %1000)/ 100]); PC_DispChar(2, SHOWTABLE[(YEAR %100)/ 10]); PC_DispChar(3, SHOWTABLE[YEAR % 10]); PC_DispChar(4, SHOWTABLE[MONTH/ 10]);//显示月 PC_DispChar(5, SHOWTABLE[MONTH % 10]); PC_DispChar(6, SHOWTABLE[DOM / 10]);//显示日 PC_DispChar(7, SHOWTABLE[DOM % 10]); PC_DispChar(8, SHOWTABLE[DOW]); //显示星期 PC_DispChar(9, SHOWTABLE[HOUR / 10]); //显示时 PC_DispChar(10, SHOWTABLE[HOUR % 10]); PC_DispChar(11, SHOWTABLE[MIN / 10]); //显示分 PC_DispChar(12, SHOWTABLE[MIN % 10]); PC_DispChar(13, SHOWTABLE[SEC / 10]); //显示秒 PC_DispChar(14, SHOWTABLE[SEC % 10]); } /*函数名称 :RTCInit() ** 函数功能 :初始化实时时钟 ** 入口参数 :无 ** 出口参数 :无*/ void RTCInit (void) { PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器 PREFRAC = Fpclk - (Fpclk / 32768) * 32768; CCR = 0x00; // 禁止时间计数器 YEAR = 2012; MONTH = 06; DOM = 16; DOW = 2; HOUR = 10; MIN = 30; SEC = 50; CIIR = 0x01; // 设置秒值的增量产生1次中断 CCR = 0x01; // 启动RTC } /* 函数名称 :keyscan() ** 函数功能 :键盘扫描函数 ** 入口参数 :无 ** 出口参数 :无*/ void keyscan() { if((IO0PIN&key1)==0) { IO0CLR=beep; IO1CLR=LED1; DelayNS(10); if((IO0PIN&key1)==0) { CCR = 0x00; // 禁止时间计数器 moshi++; if(moshi==8) moshi=0; if(moshi==0) CCR = 0x01; // 启动RTC } while((IO0PIN&key1)==0); IO0SET=beep; IO1SET =LEDS8; } if((IO0PIN&key2)==0) { IO0CLR=beep; IO1CLR=LED2; DelayNS(10);