C51课程设计报告液晶时钟.doc

上传人:h**** 文档编号:103695 上传时间:2018-07-06 格式:DOC 页数:24 大小:168KB
下载 相关 举报
C51课程设计报告液晶时钟.doc_第1页
第1页 / 共24页
C51课程设计报告液晶时钟.doc_第2页
第2页 / 共24页
C51课程设计报告液晶时钟.doc_第3页
第3页 / 共24页
C51课程设计报告液晶时钟.doc_第4页
第4页 / 共24页
C51课程设计报告液晶时钟.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、 深圳职业技术学院 Shenzhen Polytechnic 嵌入式 C 语言课程设计报告 课题: 学院: 班级: 姓名: C51 液晶时钟设计报告 水漾天蓝 目录 一、设计方案 . 1 1、功能简介 . 1 2、开发测试环境选择 . 1 二、液晶时钟程序设计 . 1 1、功能状态转换图 . 1 2、主要功能模块 . 2 2.1 主显示模块 . 2 2.2 功能选择模块 . 2 2.3 时间修改模块 . 3 2.4 闹铃修改模块 . 3 2.6 其他辅助模块函数以及变量 . 4 三、小结 . 4 四、附录 . 5 1、使用说明 . 5 2、参考文献资料 . 5 3、附表 1 . 6 C51 液

2、晶时钟设计报告 水漾天蓝 1 一、设计方案 1、功能简介 本文所设计的简易电子时钟可输出当前时间以及闹铃时间,并可通过机械按键来实现修改当前时间、修改闹铃时间、退出修改以及控制闹铃的打开和关闭,并通过 1602 型号的液晶屏显示出不同操作时的不同界面。本程序共设计按键 5 个,按键及功能分别是 1 键:选择功能界面下选择时间修改、时间和闹铃修改状态下的增加“ 1”计数; 2 键:选择功能界面下选 择闹铃修改、时间和闹铃修改状态下的减少“ 1”计数; 3 键:主显示界面下进入选择功能界面、时间和闹铃修改状态下切换修改项目、修改完成退回主显示界面; 4 键:时间和闹铃修改状态下直接退回主显示界面;

3、 5 键:主显示界面下控制闹铃的开关。 2、开发测试环境选择 开发软件选择了 ARM 公司的 KeiluVision4,仿真软件选择了英国 Labcenter electronics 公司的 proteus7 professional,测试硬件选择了普中的 HC6800 开发箱。首先在 KeiluVision4 下进行程序设计,编译通过后用 proteus7 professional 进行仿真并尝试下载到开发箱中进行操作,最后下载到开发箱中进行操作演示。 二、液晶时钟程序设计 1、功能状态转换图 C51 液晶时钟设计报告 水漾天蓝 2 2、主要功能模块 注:本文中提到的函数均见附表 1 的液晶

4、时钟源程序中,本次使用的是 1602 液晶。 2.1 主显示模块 主显示模块包含了时间显示模块 void TimeDisplay(void)函数,其运行过程为首先读取初始值,再通过定时器中断 TO 的中断服务函数 void T0_int () interrupt 1 来进行秒计时并通过 void TimeRunning(void)函数进行时间的加计数和进位运算;闹铃显示模块 void AlarmDisplay(void),其运行过程为首先读取初始值,再通过 void AlarmRunning(void)来进行比较,如果预设时间与当前时间相等就将响铃标记变量 SoundFlage_1 置为 1,

5、进而引发主函数中的响铃事件。在闹铃显示模块还包含了闹铃开关控制模块,用于控制闹铃是否开启,若闹铃开启会,闹铃时间后就会显示“ P”字母。主显示界面仿真结果如 图 2: 2.2 功能选择模块 功能选择模块包含了 void Menu_display (void)函数,其运行过程为当按键 3 时间触发,切换到功能选择界面是显示时间修改及闹铃修改的提示,并等待按键 1(时间修改)事件或者按键 2(闹铃修改)事件。功能选择界面仿真结果如图 3: C51 液晶时钟设计报告 水漾天蓝 3 2.3 时间修改模块 时间修改模块主要通过调用时间显示函数和按键响应函数:按键读值 uchar GetKey(void)

6、和响应 void QueryKeyboard(void),并通过时间设置标记变量 SetTimeFlage的值来判断是否执行时间修改。时间修改模式下计时会暂停,按键 1、按键 2、按键 3 以及按键 4 会响应,实现时间的 加减、项目切换及退回主界面的操作。进行时间加减时,计数会循环变化,如:当时间为 23:59:59 时,时加会变为 00,分加会变为 00 并且时会加 1,秒同理;当时间为 00:00:00 时,时减会变为 23,分减会变为 59 并且时会减 1,秒同理。同时,当进入时间修改界面后三盏指示 LED 灯就会分别点亮,第一盏点亮表示时修改,第二盏点亮表示分修改,第三盏点亮表示秒修

7、改(初始为时修改,可按按键 3 进行切换)。时间修改界面仿真结果如图 4: 2.4 闹铃修改模块 闹铃修改模块与时间修改模块结构类似,通过调用闹铃显示函数和按键响应函数 ,并通过闹铃设置标记变量 SetAlarmFlage 的值来判断是否执行闹铃修改。闹铃修改模式下,计时不会暂停但闹铃不会响应,按键 1、按键 2、按键 3 以及按键 4 会响应,实现时间的加减、项目切换及退回主界面的操作。进行时间加减时,计数会循环变化,如:当闹铃时间为23:59:59 时,时加会变为 00,分加会变为 00 并且时会加 1,秒同理;当时间为 00:00:00时,时减会变为 23,分减会变为 59 并且时会减

8、1,秒同理。同时,当进入闹铃修改界面后三盏指示 LED 灯就会分别点亮,第一盏点亮表示时修改,第二盏点亮表示分修改,第三盏 点亮表示秒修改(初始为时修改,可按按键 3 进行切换)。闹铃修改界面仿真结果如图 5(见下一页): C51 液晶时钟设计报告 水漾天蓝 4 2.5.液晶使用模块 本模块包含了, void init_lcd1602 (void) 1602 液晶初始化函数, void lcd_w_dat ( uchar dat )对 1602 液晶写数据函数 void lcd_w_cmd ( uchar com )对 1602 液晶写指令函数, void delay_us ( uchar t

9、 )延时函数,均为 1602 型液晶必须函数。 2.6 其他辅助模块函数以及变量 除了以上介绍 的模块以外,本程序还编写了其他的辅助模块函数以及变量。如前面提到的 GetKey(void)读按键值函数, void QueryKeyboard(void)查询按键函数,还有SetTimeFlage 设置时间标志, DisplayFlage=0 显示标志,用于防止在发生中断时,切断当前的显示,防止造成显示乱码, SetAlarmFlage 设置闹钟标志, SetFlage 设置标志位,用于在设置选择时,防止在液晶第二行显示闹钟的时间, SoundFlage_1 用于控制的闹钟的开和关的标志位, So

10、undFlage_2 用于计算响 铃的秒数, Alarm_ON 闹铃开关 point_dis、 ring 用于标志 0.5S, mes 用于定时器计时标志。 三、小结 本次设计是采用液晶显示,若仅是在液晶上显示时钟且无其他功能,程序的编写非常简单,但若加上可调闹铃、可调时间,那么程序设计上就要花费点功夫。编程调试时主要遇到如下问题: 1、闹铃的响应,如果将整个模块放到 WHILE 中,可能会造成响铃时其他操作无法响应; 2、时间和闹铃调节时液晶的响应与按键的关系,如果将整个调节进程放到显示函数中,由于液晶的特性就导致了按键按下却无响应的情况; 3、设置时的显示提示, 由于时间的调节需要调节时分

11、秒三个项目,且切换到某个项目却无提示是没有意义的,但是实现时分秒的闪烁比较麻烦。 解决方法: 1、 2:通过编写自定义函数,并设置对应的标记变量,用标记变量来控制对C51 液晶时钟设计报告 水漾天蓝 5 应函数的运行,进而解决了响应问题; 3、通过外接 3 个 LED 灯,在设置时分秒时点亮对应的灯进行提示。 四、附录 1、使用说明 本程序下载到 HC6800 单片机开发箱的使用方法如下: a. 连接:用短路帽将 MCU 的 P1.5 脚与蜂鸣器连接,用连接线(排线或者杜邦线)分别将 P30、 P31、 P32、 P33 连接到独立按键的 K1、 K2、 K3、 K4、 K5;分别将P10、

12、P11、 P12 连接到 8*1的 LED 等的 D1、 D2、 D3,再在相应的位置插上 1602型液晶屏。 b. 操作方法: 主界面下:按键 3(设置)、按键 5(闹铃开关)有效,按下按键 3 可进入功能选择界面,按键 5 可实现闹钟的开和关。 功能选择界面下:按键 1、按键 2 有效,按下按键 1 可进入时间修改界面,按下按键 2 可进入闹铃修改界面。 时间修改界面:按键 1、按键 2、按键 3、按键 4、 LED1(对应时)、 LED2(对应分)、 LED3(对应秒)有效。按键 1 能进行加 1 计数,按键 2 能进行减 1 计数,按键 3 能进行 LED13 的顺序切换( LED3

13、时再按一次则会回到主界面),按键 4可直接退回主界面。 闹铃修改界面:与时间修改界面相同。 2、参考文献资料 a.单片机应用技术: C 语言版 /王静霞主编 . 北京:电子工业出版社, 2009.5 b.百度文库。 C51 液晶时钟设计报告 水漾天蓝 3、附表 1 液晶时钟源程序 #include #define uchar unsigned char #define RingingTime 30 /定义闹钟响铃时间 char Hour=23,Minute=59,Second=45; /定义时间的初始值 char AHour=23,AMinute=59,ASecond=50; /定义闹钟的初始

14、值 sbit rs = P26; /设定液晶的相关管脚 sbit rw = P25; sbit e = P27; sbit one_add = P30; /设定控制按键的 IO 口 sbit two_lower= P31; sbit set_sel = P32; sbit quit = P33; sbit alarm_on = P34; sbit Sound = P15; /设定的蜂鸣器的 IO 口 sbit LED1 = P10; /设定三盏 LED的 IO口 ,用于显示当前处于设置的时分秒 sbit LED2 = P11; sbit LED3 = P12; uchar SetTimeFla

15、ge=0, /定义设置时间标志位 DisplayFlage=0, /定义显示标志位,用于防止在发 生中断时,切断当前的显示,防止造成显示乱码 SetAlarmFlage=0, /定义设置闹钟标志位 SetFlage=0, /定义设置标志位,用于在设置选择时,防止在液晶第二行显示闹钟的时间 SoundFlage_1=0, /用于控制的闹钟的开和关的标志位 SoundFlage_2=0, /用于计算响铃的秒数 Alarm_ON=1; /闹铃开关 point_dis=0,ring=0, /用于标 志 0.5S mes=0; uchar table=“0123456789: “; /定义用于液晶显示的

16、字符串数组 uchar Display2=“1:Time 2:Alarm “; /定义显示选择菜单的内容 uchar Display3=“Time :“; /定义显示时间 T 和闹钟 A 的内容 uchar Display4=“Alarm:“; void init_lcd1602 (void); /声明 1602 液晶初始化函数 void lcd_w_dat ( uchar dat ); /声明对 1602 液晶写数据函数 void lcd_w_cmd ( uchar com ); /声明对 1602 液晶写指令函数 void delay_us ( uchar t ); /声明延时函数 C51

17、 液晶时钟设计报告 水漾天蓝 uchar GetKey(void); /声明读按键值函数 void QueryKeyboard(void); /声明查询按键函数 void SetTime(void); /声明设置时间函数 void SetAlarm(void); /声明设置闹钟函数 void Menu_display(void); /声明主菜单显示函数 void Display(void); /声明显示函数 void TimeDisplay(void); /声明时间显示 void AlarmDisplay(void); /声明闹钟显示函数 void TimeRunning(void); /声明

18、时钟运行函数 void AlarmRunning(void); /声明闹钟运行函数 /*定时中断服务函数 */ void T0_int () interrupt 1 /定时器 0 的中断入口函数 TH0=15536/256; /读定时器 0 进行重新装载初始值 TL0=15536%256; mes+; /计算定时器进入中断的次数,也用于计算秒 if(mes5) ring=1; else if (mes10) point_dis=1; ring=0; else if (mes15) ring=1; else point_dis=0; ring=0; if (mes=20) /当计够 20 次就等

19、于 1S mes = 0; Second+; if (SoundFlage_1=1) /若闹钟铃被打开 SoundFlage_2+; /就对闹铃的时间进行定时计数 if (SoundFlage_2=RingingTime) /若计够设置的响铃时间 SoundFlage_1=0; /关响铃 SoundFlage_2=0; /清计数 C51 液晶时钟设计报告 水漾天蓝 Sound=1; /关蜂鸣器 if (DisplayFlage=0) /判断有无其它函数在对液晶进行写操作 Display(); TimeRunning(); /对时钟时间进行运算 /*主函数 */ void main ( void

20、 ) /主函数 rw = 0; init_lcd1602(); /初始化 1602 液晶 TMOD=0x01; /开通定时计数器 0 TH0=15536/256; /对定时计数器进行赋初始值 TL0=15536%256; EA=1; /打开总中断 ET0=1; TR0=1; while (1) QueryKeyboard(); /查询键盘,从中可以得出有没有按键按下,按下的是不是设置按键 3 if(SetTimeFlage=1) /设置时间标志位被置 1,就说明当前处于设置时间状态 SetTime(); /调用设置时间函数 if(SetAlarmFlage=1) /设置闹钟标志位被置 1,就说明当前处于设置闹钟状态 SetAlarm(); /调用设置闹钟函数 AlarmRunning(); /闹钟运行 if (SoundFlage_1=1 & Alarm_ON=1) /若时间到了,这标志位就会被置 1 if (ring=0) /判断当前是不是处于 0.5S,用于半

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。