C51课程设计报告(液晶时钟).doc_第1页
C51课程设计报告(液晶时钟).doc_第2页
C51课程设计报告(液晶时钟).doc_第3页
C51课程设计报告(液晶时钟).doc_第4页
C51课程设计报告(液晶时钟).doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

深圳职业技术学院Shenzhen Polytechnic嵌入式C语言课程设计报告课题: 学院: 班级: 姓名: C51液晶时钟设计报告水漾天蓝目录一、设计方案11、功能简介12、开发测试环境选择1二、液晶时钟程序设计11、功能状态转换图12、主要功能模块22.1主显示模块22.2功能选择模块22.3时间修改模块32.4闹铃修改模块32.6其他辅助模块函数以及变量4三、小结4四、附录51、使用说明52、参考文献资料53、附表16一、设计方案1、功能简介本文所设计的简易电子时钟可输出当前时间以及闹铃时间,并可通过机械按键来实现修改当前时间、修改闹铃时间、退出修改以及控制闹铃的打开和关闭,并通过1602型号的液晶屏显示出不同操作时的不同界面。本程序共设计按键5个,按键及功能分别是1键:选择功能界面下选择时间修改、时间和闹铃修改状态下的增加“1”计数;2键:选择功能界面下选择闹铃修改、时间和闹铃修改状态下的减少“1”计数;3键:主显示界面下进入选择功能界面、时间和闹铃修改状态下切换修改项目、修改完成退回主显示界面;4键:时间和闹铃修改状态下直接退回主显示界面;5键:主显示界面下控制闹铃的开关。2、开发测试环境选择开发软件选择了ARM公司的KeiluVision4,仿真软件选择了英国Labcenter electronics公司的proteus7 professional,测试硬件选择了普中的HC6800开发箱。首先在KeiluVision4下进行程序设计,编译通过后用proteus7 professional进行仿真并尝试下载到开发箱中进行操作,最后下载到开发箱中进行操作演示。二、液晶时钟程序设计1、功能状态转换图2、主要功能模块注:本文中提到的函数均见附表1的液晶时钟源程序中,本次使用的是1602液晶。2.1主显示模块主显示模块包含了时间显示模块void TimeDisplay(void)函数,其运行过程为首先读取初始值,再通过定时器中断TO的中断服务函数void T0_int () interrupt 1 来进行秒计时并通过void TimeRunning(void)函数进行时间的加计数和进位运算;闹铃显示模块void AlarmDisplay(void),其运行过程为首先读取初始值,再通过void AlarmRunning(void)来进行比较,如果预设时间与当前时间相等就将响铃标记变量SoundFlage_1置为1,进而引发主函数中的响铃事件。在闹铃显示模块还包含了闹铃开关控制模块,用于控制闹铃是否开启,若闹铃开启会,闹铃时间后就会显示“P”字母。主显示界面仿真结果如图2:2.2功能选择模块功能选择模块包含了void Menu_display (void)函数,其运行过程为当按键3时间触发,切换到功能选择界面是显示时间修改及闹铃修改的提示,并等待按键1(时间修改)事件或者按键2(闹铃修改)事件。功能选择界面仿真结果如图3:2.3时间修改模块时间修改模块主要通过调用时间显示函数和按键响应函数:按键读值uchar GetKey(void)和响应void QueryKeyboard(void),并通过时间设置标记变量SetTimeFlage的值来判断是否执行时间修改。时间修改模式下计时会暂停,按键1、按键2、按键3以及按键4会响应,实现时间的加减、项目切换及退回主界面的操作。进行时间加减时,计数会循环变化,如:当时间为23:59:59时,时加会变为00,分加会变为00并且时会加1,秒同理;当时间为00:00:00时,时减会变为23,分减会变为59并且时会减1,秒同理。同时,当进入时间修改界面后三盏指示LED灯就会分别点亮,第一盏点亮表示时修改,第二盏点亮表示分修改,第三盏点亮表示秒修改(初始为时修改,可按按键3进行切换)。时间修改界面仿真结果如图4:2.4闹铃修改模块闹铃修改模块与时间修改模块结构类似,通过调用闹铃显示函数和按键响应函数,并通过闹铃设置标记变量SetAlarmFlage的值来判断是否执行闹铃修改。闹铃修改模式下,计时不会暂停但闹铃不会响应,按键1、按键2、按键3以及按键4会响应,实现时间的加减、项目切换及退回主界面的操作。进行时间加减时,计数会循环变化,如:当闹铃时间为23:59:59时,时加会变为00,分加会变为00并且时会加1,秒同理;当时间为00:00:00时,时减会变为23,分减会变为59并且时会减1,秒同理。同时,当进入闹铃修改界面后三盏指示LED灯就会分别点亮,第一盏点亮表示时修改,第二盏点亮表示分修改,第三盏点亮表示秒修改(初始为时修改,可按按键3进行切换)。闹铃修改界面仿真结果如图5(见下一页):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 )延时函数,均为1602型液晶必须函数。2.6其他辅助模块函数以及变量除了以上介绍的模块以外,本程序还编写了其他的辅助模块函数以及变量。如前面提到的GetKey(void)读按键值函数,void QueryKeyboard(void)查询按键函数,还有SetTimeFlage设置时间标志,DisplayFlage=0显示标志,用于防止在发生中断时,切断当前的显示,防止造成显示乱码,SetAlarmFlage设置闹钟标志,SetFlage设置标志位,用于在设置选择时,防止在液晶第二行显示闹钟的时间,SoundFlage_1用于控制的闹钟的开和关的标志位,SoundFlage_2用于计算响铃的秒数,Alarm_ON闹铃开关point_dis、ring用于标志0.5S,mes用于定时器计时标志。三、小结本次设计是采用液晶显示,若仅是在液晶上显示时钟且无其他功能,程序的编写非常简单,但若加上可调闹铃、可调时间,那么程序设计上就要花费点功夫。编程调试时主要遇到如下问题:1、闹铃的响应,如果将整个模块放到WHILE中,可能会造成响铃时其他操作无法响应;2、时间和闹铃调节时液晶的响应与按键的关系,如果将整个调节进程放到显示函数中,由于液晶的特性就导致了按键按下却无响应的情况;3、设置时的显示提示,由于时间的调节需要调节时分秒三个项目,且切换到某个项目却无提示是没有意义的,但是实现时分秒的闪烁比较麻烦。解决方法:1、2:通过编写自定义函数,并设置对应的标记变量,用标记变量来控制对应函数的运行,进而解决了响应问题;3、通过外接3个LED灯,在设置时分秒时点亮对应的灯进行提示。四、附录1、使用说明本程序下载到HC6800单片机开发箱的使用方法如下:a. 连接:用短路帽将MCU的P1.5脚与蜂鸣器连接,用连接线(排线或者杜邦线)分别将P30、P31、P32、P33连接到独立按键的K1、K2、K3、K4、K5;分别将P10、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时再按一次则会回到主界面),按键4可直接退回主界面。闹铃修改界面:与时间修改界面相同。2、参考文献资料a.单片机应用技术:C语言版/王静霞主编.北京:电子工业出版社,2009.5b.百度文库。6C51液晶时钟设计报告水漾天蓝3、附表1液晶时钟源程序#include #define uchar unsigned char#define RingingTime30 /定义闹钟响铃时间char Hour=23,Minute=59,Second=45; /定义时间的初始值char AHour=23,AMinute=59,ASecond=50; /定义闹钟的初始值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 SetTimeFlage=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: ; /定义用于液晶显示的字符串数组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 ); /声明延时函数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); /声明时钟运行函数void AlarmRunning(void); /声明闹钟运行函数/*定时中断服务函数*/void T0_int () interrupt1 /定时器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次就等于1S mes = 0;Second+;if (SoundFlage_1=1) /若闹钟铃被打开 SoundFlage_2+; /就对闹铃的时间进行定时计数if (SoundFlage_2=RingingTime) /若计够设置的响铃时间 SoundFlage_1=0; /关响铃SoundFlage_2=0; /清计数Sound=1; /关蜂鸣器 if (DisplayFlage=0) /判断有无其它函数在对液晶进行写操作 Display(); TimeRunning(); /对时钟时间进行运算/*主函数*/void main ( void ) /主函数 rw = 0;init_lcd1602(); /初始化1602液晶TMOD=0x01; /开通定时计数器0TH0=15536/256; /对定时计数器进行赋初始值TL0=15536%256;EA=1; /打开总中断ET0=1;TR0=1;while (1) QueryKeyboard(); /查询键盘,从中可以得出有没有按键按下,按下的是不是设置按键3if(SetTimeFlage=1) /设置时间标志位被置1,就说明当前处于设置时间状态 SetTime(); /调用设置时间函数if(SetAlarmFlage=1) /设置闹钟标志位被置1,就说明当前处于设置闹钟状态 SetAlarm(); /调用设置闹钟函数AlarmRunning(); /闹钟运行if (SoundFlage_1=1 & Alarm_ON=1) /若时间到了,这标志位就会被置1 if (ring=0) /判断当前是不是处于0.5S,用于半秒响一次铃、灭一次铃 Sound=1; else Sound=0; /*时间、闹铃设置函数*/void SetTime(void) /时间设置 uchar KeyValue=0,i=0;uchar tset_dis= Time setting; while (SetTimeFlage = 1) /直到时间设置完成才推出此循环lcd_w_cmd(0x01);/液晶清屏命令TimeDisplay();/显示当前时间lcd_w_cmd(0xc0);while(tset_disi!=0) lcd_w_dat(tset_disi);i+;EA=0; /因为已经进入设置时间状态,所以关总中断和管定时器中断 ET0=0; TR0=0; point_dis=0; /将这值置0,用于时间显示时显示 : KeyValue = GetKey();while(KeyValue!=3) /等待按下确认按键 LED1 = 0; /点亮LED1,用于显示当前是在设置时钟的时KeyValue = GetKey(); /if (KeyValue=1) /若按下按键1,就对时进行加1 if (Hour1) Hour-;else Hour=23;TimeDisplay(); /显示当前时钟的值,用于在液晶显示刷新if(KeyValue=4) SetTimeFlage=0;break;LED1=1; /关闭设置时的LED,进行下一步的设置分KeyValue = GetKey();while(KeyValue!=3) /若没有按下确认按键,直到按下确认按键为止 if(SetTimeFlage=1) LED2=0; /点亮LED2,用于显示当前是在设置时钟的分KeyValue = GetKey();if (KeyValue=1) /若按下按键1,就对分进行加1 if(Minute1) Minute-;else Minute=59;if(Hour=0) Hour=23;else Hour-;TimeDisplay(); /显示当前时钟的值,用于在液晶显示刷新if(KeyValue=4 | SetTimeFlage=0) SetTimeFlage=0;break; LED2=1; /关闭设置时的LED,进行下一步的设置秒KeyValue = GetKey();while(KeyValue!=3) /若没有按下确认按键,直到按下确认按键为止 if(SetTimeFlage=1) LED3=0; /点亮LED3,用于显示当前是在设置时钟的秒KeyValue = GetKey(); if (KeyValue=1) /若按下按键1,就对秒进行加1 if(Second1) Second-;else Second=59;if(Minute=0) Minute=59;if(Hour=0) Hour=23;else Hour-;else Minute-;TimeDisplay(); /显示当前时钟的值,用于在液晶显示刷新if(KeyValue=4 | SetTimeFlage=0)break;LED3=1; /关闭LED,设置完成EA=1; /打开相关中断ET0=1;TR0=1; SetTimeFlage=0; /将时间设置标志位置0,完成一次时间的设置void SetAlarm(void) /闹铃设置 uchar KeyValue=0,i=0;uchar aset_dis=Alarm setting; while (SetAlarmFlage = 1)lcd_w_cmd(0x01);lcd_w_cmd(0x80);while(aset_disi!=0) lcd_w_dat(aset_disi);i+;KeyValue = GetKey();AlarmDisplay();while(KeyValue!=3) /等待按下确认按键 LED1 = 0; /点亮LED1,用于显示当前是在设置时钟的时KeyValue = GetKey(); /if (KeyValue=1) /若按下按键1,就对时进行加1 if (AHour1) AHour-;else AHour=23;AlarmDisplay(); /显示当前时钟的值,用于在液晶显示刷新if(KeyValue=4) SetAlarmFlage=0;break;LED1=1; /关闭设置时的LED,进行下一步的设置分KeyValue = GetKey();while(KeyValue!=3) /若没有按下确认按键,直到按下确认按键为止 if(SetAlarmFlage=1) LED2=0; /点亮LED2,用于显示当前是在设置时钟的分KeyValue = GetKey();if (KeyValue=1) /若按下按键1,就对分进行加1 if(AMinute1) AMinute-;else AMinute=59;if(AHour=0) AHour=23;else AHour-;AlarmDisplay(); /显示当前时钟的值,用于在液晶显示刷新if(KeyValue=4 | SetAlarmFlage=0) SetAlarmFlage=0;break; LED2=1; /关闭设置时的LED,进行下一步的设置秒KeyValue = GetKey();while(KeyValue!=3) /若没有按下确认按键,直到按下确认按键为止 if(SetAlarmFlage=1) LED3=0; /点亮LED3,用于显示当前是在设置时钟的秒KeyValue = GetKey(); if (KeyValue=1) /若按下按键1,就对秒进行加1 if(ASecond1) ASecond-;else ASecond=59;if(AMinute=0) AMinute=59;if(AHour=0) AHour=23;else AHour-;else AMinute-;AlarmDisplay(); /显示当前时钟的值,用于在液晶显示刷新if(KeyValue=4 | SetAlarmFlage=0)break;LED3=1; SetAlarmFlage=0;/*时间、闹铃、设置菜单显示函数*/void Menu_display (void) /主菜单显示函数 uchar i=0,KeyValue=0; uchar menu_dis=Setting Function; DisplayFlage=1; /将显示标志位置1,防止在发生中断时,切断当前的显示,防止造成显示乱码KeyValue = GetKey();Sound=1;lcd_w_cmd(0x01);lcd_w_cmd(0x80);while(menu_disi!=0) /显示 Setting Function lcd_w_dat ( menu_disi );i+;i=0;lcd_w_cmd (0xc0); /在液晶上设置显示的光标位置,第二行第1个while(Display2i!=0) /循环输出上面定义的主菜单显示字符数组 lcd_w_dat ( Display2i );i+; DisplayFlage=0; /清楚显示标志位void Display(void) /主显示函数 if(SetAlarmFlage=0 & SetTimeFlage=0) TimeDisplay(); /显示时间if(SetAlarmFlage=0 & SetTimeFlage=0) /判断闹钟设置标志位,用于防止在设置闹钟时,被定时中断调用,防止出现乱码 AlarmDisplay(); /闹钟时间显示void TimeDisplay(void) /时间显示 uchar i=0;DisplayFlage=1; /将显示标志位置1,防止在发生中断时,切断当前的显示,防止造成显示乱码 lcd_w_cmd (0x80); if (SetFlage = 0)/若现在不是出于设置选择状态 while(Display3i!=0) lcd_w_dat(Display3i);i+;lcd_w_dat (tableHour/10);/显示时间的时的十位lcd_w_dat (tableHour%10);/显示时间的时的个位if (point_dis=1)/判断0.5S的标志位,用于显示 : ,或显示空格字符,达到一种闪烁的效果 lcd_w_dat (table11);else lcd_w_dat (table10);lcd_w_dat (tableMinute/10);/显示时间的分的十位lcd_w_dat (tableMinute%10);/显示时间的分的个位if (point_dis=1)/判断0.5S的标志位,用于显示 : ,或显示空格字符,达到一种闪烁的效果 lcd_w_dat (table11);else lcd_w_dat (table10);lcd_w_dat (tableSecond/10);/显示时间的秒的十位lcd_w_dat (tableSecond%10);/显示时间的秒的个位DisplayFlage=0;/清除显示标志位void AlarmDisplay(void) /闹钟显示 uchar i=0; DisplayFlage=1;/将显示标志位置1,防止在发生中断时,切断当前的显示,防止造成显示乱码 if (SetFlage = 0)/若现在不是出于设置选择状态 if(Alarm_ON=1) lcd_w_cmd(0xcf);lcd_w_dat(P);else lcd_w_cmd(0xcf);lcd_w_dat( );lcd_w_cmd (0xc0); while(Display4i!=0)lcd_w_dat(Display4i);i+; lcd_w_dat (tableAHour/10);/显示闹钟的时的十位 lcd_w_dat (tableAHour%10);/显示闹钟的时的个位 lcd_w_dat (table10);/显示 : lcd_w_dat (tableAMinute/10);/显示闹钟的分的十位 lcd_w_dat (tableAMinute%10);/显示闹钟的分的个位 lcd_w_dat (table10);/显示 : lcd_w_dat (tableASecond/10);/显示闹钟的秒的十位 lcd_w_dat (tableASecond%10);/显示闹钟的秒的个位 DisplayFlage=0;/清除显示标志位/*时间、闹铃计时运算函数*/void TimeRunning(void) /时钟运行 if (Second59) /对时分秒进行运算 Second=0;Minute+;if (Minute59) Minute=0;Hour+;if (Hour23) Hour=0; void AlarmRunning(void) /闹钟运行 if (Hour=AHour) /闹钟时分秒和时钟时分秒进行对比 if (Minute=AMinute) if (Second=ASecond) SoundFlage_1=1; /若时分秒都相等,就将响铃打开 /*按键读取控制函数*/uchar GetKey(void)/读按键函数 uchar Value=0;if (one_add = 0) while (one_add = 0);Value = 1;else if (two_lower = 0) while (two_lower = 0);Value = 2;else if (set_sel = 0) while(set_sel = 0);Value = 3; else if (quit = 0) while (quit = 0);Value = 4;else if(alarm_on = 0) while(alarm_on = 0);Value = 5;else Value=0;return Value;void QueryKeyboard(void) /查询键盘 uchar KeyValue=0;KeyValue = GetKey()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论